Sqoop:SQL to Hadoop 作用:批量的将关系型数据库的数据迁入和迁出的工具,
将需要将关系型数据库(oracle、mysql)的数据迁入到hdfs上,通过pig或者hive查询
sqoop架构
Sqoop使用的是hadoop的一套架构mapreduce来完成所有的工作,在使用sqoop迁移数据的时候,性能取决于mapreduce的执行情况.下图是sqoop基本架构
- 使用sqoop数据迁移
Sqoop help import / sqoop help export 可以查看到sqoop下面的一些命令使用情况
Eg:mysql
Sqoop list-databases --connect jdbc.mysql://hadoop01/db1 -- username root --password root
其中:list-databases 列出所有的数据库
- 一般的命令语句
Sqoop import
--connect ...
--username ...
--password...
--table tableName(迁移表的名称)
--target-dir /user/hive/warehouse/test(目标库)
--m 16(mr的个数,控制并行度)
--split by(分割字段)
--field-terminated--by <自定义字段分割符号>
--lines-terminated-by <自定义终止符>
--as-avrodatafile/sequemcefile/textfile/输出的文件的集中格式
--query ‘select * from a’
--fetch-size 100
Eg:
sqoop import --connect jdbc:oracle:thin:@//hadoop01:1521/orcl --username sqoop --password sqoop --fields-terminated-by '\\001' --target-dir /user/hive/warehouse/test -m 10 --query "select /*+parallel(t,9)*/ * from test where date <= to_date(2001-01-01','yyyy-mm-dd') and id>100 --fetch-size 10
注意:
- 迁移的时候按照增量方式进行迁移,表中的字段需要都列出来,切记不能使用*,要么会覆盖原来迁移的数据;
- 对于oracle迁移的时候,一个mapreduce的最大数据是2的31次方-1数据量,如果一个map的数据量超过这个会造成迁移数据丢失;
- 针对上面出现的情况,可以将数据打伞,选取split的字段的差值不要过大,避免造成数据倾斜。
- Map的合理设置有利于提高sqoop迁移的效率;
- 对于不同的数据库在取数据的时候都可以开并行,加速数据的迁移;eg:oracle/*+parallel(t,9)+*/
6、对于不同数据库迁移数据,sqoop help import 介绍很详细的。