export-从hdfs中到出数据到MySQL中
HDFSToMySQL
编写脚本,并保存为HDFSToMySQL.conf
在往关系型数据库中导出的时候我们要先在关系型数据库中创建好库以及表,这些sqoop不会帮我们完成。
export
--connect
jdbc:mysql://master:3306/student?useUnicode=true&characterEncoding=UTF-8
--username
root
--password
123456
--table
student
--m
1
--columns
id,name,age,gender,clazz
--export-dir
/shujia/bigdata17/sqoopinput/
--fields-terminated-by
','
先清空MySQL student表中的数据,不然会造成主键冲突
执行脚本
sqoop --options-file HDFSToMySQL.conf
查看sqoop help
sqoop help
21/04/26 15:50:36 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
usage: sqoop COMMAND [ARGS]
Available commands:
codegen Generate code to interact with database records
create-hive-table Import a table definition into Hive
eval Evaluate a SQL statement and display the results
export Export an HDFS directory to a database table
help List available commands
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
import-mainframe Import datasets from a mainframe server to HDFS
job Work with saved jobs
list-databases List available databases on a server
list-tables List available tables in a database
merge Merge results of incremental imports
metastore Run a standalone Sqoop metastore
version Display version information
See 'sqoop help COMMAND' for information on a specific command.
# 查看import的详细帮助
sqoop import --help
1、并行度不能太高,就是 -m
2、如果没有主键的时候,-m 不是1的时候就要指定分割字段,不然会报错,如果有主键的时候,-m 不是1 可以不去指定分割字段,默认是主键,不指定 -m 的时候,Sqoop会默认是分4个map任务。
Sqoop 在从HDFS中导出到关系型数据库时的一些问题
问题一:
在上传过程中遇到这种问题:
ERROR tool.ExportTool: Encountered IOException running export job: java.io.IOException: No columns to generate for ClassWriter
驱动版本的过低导致的,其实在尝试这个方法的时候我们可以先进行这样:加一行命令,--driver com.mysql.jdbc.Driver \ 然后问题解决!!!
如果添加命令之后还没有解决就把jar包换成高点版本的。
问题二:
依旧是导出的时候,会报错,但是我们很神奇的发现,也有部分数据导入了。这也就是下一个问题。
Caused by: java.lang.NumberFormatException: For input string: "null"
解决方式:因为数据有存在null值得导致的
在命令中加入一行(方式一中的修改方式,方式二也就是转换一下格式):--input-null-string '\\N' \
--input-null-string
'\\N'
问题三:**
java.lang.RuntimeException: Can't parse input data: '1998/5/11'
出现像这样的问题,大多是因为HDFS上的数据与关系型数据库创建表的字段类型不匹配导致的。仔细对比修改后,就不会有这个报错啦!!
增量同步数据
我们之前导入的都是全量导入,一次性全部导入,但是实际开发并不是这样,例如web端进行用户注册,mysql就增加了一条数据,但是HDFS中的数据并没有进行更新,但是又再全部导入一次又完全没有必要。
所以,sqoop提供了增量导入的方法。
1、数据准备:
2、将其先用全量导入到HDFS(hive)中去
import
--connect
jdbc:mysql://master:3306/student
--username
root
--password
123456
--table
student
--hive-import
--hive-overwrite
--create-hive-table
--hive-database
testsqoop
--hive-table
from_mysql_student
--fields-terminated-by
'\t'
3、先在mysql中添加一条数据,在使用命令进行追加
4、根据时间进行大量追加(不去重)
#前面的案例中,hive本身的数据也是存储在HDFS上的,所以我今后要做增量操作的时候,需要指定HDFS上的路径
import
--connect
jdbc:mysql://master:3306/student
--username
root
--password
123456
--table
student_zeng
--target-dir
/user/hive/warehouse/sqooptest.db/from_mysql_student
--fields-terminated-by
'\t'
--incremental
append
--check-column
id
--last-value
7
结果:但是我们发现有两个重复的字段
--merge key
name
即按照 name 字段去重。
5、往往开发中需要进行去重操作:sqoop提供了一个方法进行去重,内部是先开一个map任务将数据导入进来,然后再开一个map任务根据指定的字段进行合并去重
结果:
之前有重复的也进行合并去重操作,最后生成一个结果。
总结:
–check-column
用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系型数据库中的自增字段及时间戳类似.
注意:这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,同时–check-column可以去指定多个列
–incremental
用来指定增量导入的模式,两种模式分别为Append和Lastmodified
–last-value
指定上一次导入中检查列指定字段最大值
最终结果:
import
--connect
jdbc:mysql://master:3306/students
--username
root
--password
123456
--table
student_zeng
--target-dir
/user/hive/warehouse/sqooptest.db/from_mysql_student
--fields-terminated-by
'\t'
--check-column
last_mod
--incremental
lastmodified
--last-value
"2022-06-19 20:17:17"
--m
1
--merge-key
id
总结
RDBMS-->HDFS import
HDFS--->RDBMS export
Mysql--->HDFS(hive)
要知道你要数据的来源和数据的目的地
mysql:
--connect
jdbc:mysql://master:3306/student
--username
root
--password
123456
--table
student
hdfs:
--target-dir
/user/hive/warehouse/sqooptest.db/from_mysql_student
--fields-terminated-by
'\t'
hive:
1)
--hive-import
--hive-overwrite
--create-hive-table (如果表不存在,自动创建,如果存在,报错,就不需要这个参数)
--hive-database
testsqoop
--hive-table
from_mysql_student
--fields-terminated-by
'\t'
2)
--target-dir
/user/hive/warehouse/sqooptest.db/from_mysql_student
--fields-terminated-by
'\t'
# 增量需要添加的参数=================================================
--incremental
append
--check-column
id
--last-value
3
(或者是)------------------------------------------------------------
--fields-terminated-by
'\t'
--check-column (hive的列名)
last_mod
--incremental
lastmodified
--last-value
"2022-06-18 16:40:09"
--m
1
========================================================================
# 如果需要去重,请先搞清楚根据什么去重,否则结果可能不是你想要的
--merge-key
name (这里是根据姓名去重,你可以改成自己的去重列名)
hbase:(因为我们的hbase版本是1.4.6,而sqoop1.4.6不支持hbase1.0.1以后的自动创建表,所以我们在做同步到hbase的时候,需要手动先将表创建好)
--hbase-table
studentsq
--column-family
cf1
--hbase-row-key
id (mysql中的列名)
--m
1
HDFS--->mysql
hdfs:
--columns
id,name,age,gender,clazz
--export-dir
/shujia/bigdata17/sqoopinput/
--fields-terminated-by
','
# 如果数据分割出来的字段值有空值,需要添加以下参数(面试可能会面到)
--null-string
'\\N'
--null-non-string
'\\N'