Sqoop安装
配置conf下的sqoop-env.sh文件
添加关键的环境变量
因为要使用mysql,需要把mysql驱动包添加到lib下
在sqoop安装路径下输入bin/sqoop help
若出现help提示则说明配置成功,但也可能HACT_HOME和ACCUMULO_HOME错误,进入bin路径下将以下内容注释掉
还有可能报找不到sqoop类错误,需要安装对应版本的sqoopjar包,我这里是sqoop-1.4.6.jar添加到hadoop/share/hadoop/mapreduce文件夹中。
这是两个常见错误的处理方式
最后sqoop测试连接mysql
命令:bin/sqoop list-tables --connect jdbc:mysql://localhost:3306/ct --username root --password 123456
中间的参数和我们平时使用jdbc一样。如果列出数据库表示数据库连接正常。
Sqoop导入数据到hdfs
先上参数表
导入
(1)MySQL数据导入HDFS(全量读取全量增加)
bin/sqoop import \
--connect jdbc:mysql://hadoop002:3306/ct \
--username root \
--password 123456 \
--table test_call \ (mysql数据库表名)
--target-dir /user/hive/warehouse/ct.db/hive_test_call \ (hdfs导入目标地址)
--fields-terminated-by '\t' \ (mysql各个列字段的分割符,默认为',',还有另外一个参数设置行分隔符默认为'\n')
-m 1 (设置Mapper数量)
--delete-target-dir (若已有目标文件夹则删除,Sqoop底层跑的是MR,如果不设置该参数,若目标地址已存在,会导致MR启动失败)
这里的全量指的是这种导入方式会覆盖所有的之前同路径下的hdfs数据.
(2)MySQL数据导入HDFS(增量读取增量添加)
bin/sqoop import \
--connect jdbc:mysql://hadoop002:3306/ct \
--username root \
--password 123456 \
--table test_call \
--fields-terminated-by '\t' \
--target-dir /user/hive/warehouse/ct.db/hive_test_call \
-m 1
--incremental append \ (启用增量)
--check-column money \ (增量检查字段)
--last-value 500 \ (增量字段值)
上面三个参数的意思是:--incremental append 启用增量模式,该模式会把MySQL中新增的数据传递到hdfs上而非所有的MySQL数据。
该模式下不会因为目的路径已存在就无法执行MR。
设置新增的依据是:--check-column 后面的字段
判断是否为新增字段的依据是:--check-column 所标注字段的值是否大于 --last-value 所设置的值。
注意:因为需要比较值,所以MySQL中该字段一般设置为自增的主键,而且不能为varchar类型,sqoop认为varchar的value无法比较。
在这里的含义就是money>500的字段被认为是新增字段,将这些符合要求的字段传入hdfs,也就是说我的本意是将今天MySQL新增的字段增量传入hdfs但是我设置的是比较money的值,那么哪怕是昨天的数据只要符合money大于500也会被认为是新增字段传入hdfs,所以-check-column字段的设置需要注意。
(3)在Hive上创建与MySQL同字段表
bin/sqoop create-hive-table \
--connect jdbc:mysql://hadoop002:3306/ct \
--username root \
--password 123456 \
--table test_call \
--hive-table ct.hive_test_call \
--fields-terminated-by '\t' \
一定要记得加上最后的(--fields-terminated-by '\t' )--fields-terminated-by 默认值是','而非'\t',如果不加该字段选择使用默认值时,那么导入数据时也要记得分割字段是','。否则可能出现多列数据串行的情况。
(4)MySQL数据导入Hive(全量读取,增量添加)
这里的全量指的是把整个MySQL的数据导入Hive
bin/sqoop import \
--connect jdbc:mysql://hadoop002:3306/ct \
--username root \
--password 123456 \
--table test_call \
--hive-import \
--hive-table ct.hive_test_call \
--fields-terminated-by '\t' \
-m 1
--hive-overwrite \ (覆盖hive,默认无该参数,也就是说导入的方式为追加)
--create-hive-table \ #创建表(默认也会自动创建表)
应该比较好理解
(5)MySQL数据导入Hive(增量读取增量添加)
需要注意的是导入hive无
--incremental append \ (启用增量读取)
--check-column money \ (增量检查字段)
--last-value 500 \ (增量字段值)
这三个参数。
但是可以直接通过hdfs的方式将数据导入hive对应数据库下的文件夹中
参考(2)其实就是hive的追加导入
另一种方式
使用参数 --where
bin/sqoop import \
--connect jdbc:mysql://hadoop002:3306/ct \
--username root \
--password 123456 \
--table test_call \
--hive-import \
--hive-table ct.hive_test_call \
--fields-terminated-by '\t' \
--where "tel!=1289919603" \
-m 1
筛选符合要求的行添加到hive,这种方式和hdfs的增量模式其实类似
--query ‘select tel,money,date from test_call where tel="1289919603" and $CONDITIONS’
也可以把符合要求的数据从MySQL读取到hdfs但是只能全量导入
注意:where可以和hive import联用
而query只能和传统hdfs数据导入方式联用,且必须设置--target-dir 所以无法按照hive的增量方式将数据增量添加到hive中,但可以通过将数据按照hdfs方式导入hive存储位置的方式导入hive中。
但若以传统hdfs导入方式,想要实现增量读取又需要设置
--incremental append \ (启用增量读取)
--check-column money \ (增量检查字段)
--last-value 500 \ (增量字段值)
这三个字段,可能会和query有筛选条件上的冲突,所以query一般用于(搭配--delete-target-dir \)做全量导入,即覆盖hdfs上已有数据的导入方式。
bin/sqoop import \
--connect jdbc:mysql://hadoop002:3306/ct \
--username root \
--password 123456 \
--hive-import \
--hive-table ct.hive_test_call \
--target-dir /user/hive/warehouse/ct.db/hive_test_call \
--query 'select tel,money,date from test_call where tel="1289919603" and $CONDITIONS' \
--delete-target-dir \
--fields-terminated-by '\t' \
-m 1
通过上述方式,就可以实现全量导入MySQL的指定字段
(6)MySQL数据导入Hbase
bin/sqoop import \
--connect jdbc:mysql://hadoop02:3306/mysql \
--username root \
--password 123456 \
--table help_keyword \
--hbase-table new_help_keyword \ (hbase表名)
--column-family person \ (列族名)
--hbase-row-key help_keyword_id (对应hbase上rowkey的MySQL字段,该字段将被设置为rowkey)
导出
拿别人的贴一贴
可以看到hive的导出也需要用传统的hdfs导出方式。
总结:
Sqoop的增量读取,导出到hive上。主要还是通过传统hdfs直接增量读取直接写入到hive路径或使用where这两种方式。
hive的导入默认是增量,想要全量导入只要设置 --hive-overwrite 即可。
query则是特殊情况如,选择MySQL的几个字段而非全部字段导入hive中的这种情况下使用,但是因为sqoop并不会智能的匹配hive中的字段,所以若hive表并非通过sqoop自动生成,很容易出现格式上的错误。
还是尽可能把sqoop的任务设置为简单的导入导出。