目录
sqoop是什么
sqoop是传统数据库与hadoop之间的数据同步工具。主要依托MapReduce分布式批处理。
sqoop官网手册 http://sqoop.apache.org/docs/1.4.4/SqoopUserGuide.html
只有Map阶段,没有Reduce阶段的任务。
sqoop基本命令
sqoop hive ------> mysql
sqoop export -m 1 --connect jdbc:mysql://192.168.17.128:3306/test --username root --password 123456 --table u --export-dir /hadoopmr/flow.txt --input-fields-terminated-by ',' --mysql-delimiters
sqoop oracle ------> hive
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table cities
--where "country = 'USA'"
--target-dir /etl/input/cities
--warehouse-dir /etl/input/
--num-mappers 10
--null-string '\\N' \
--null-non-string '\\N'
--incremental append \
--check-column id \
--last-value 1
--connnect: 指定JDBC URL
--username/password:mysql数据库的用户名
--table:要读取的数据库表
--where:导入数据的过滤条件
--target-dir:HDFS中导入表的存放目录
--warehouse-dir:指定表存放的父目录,只需要指定一次,下次存放时会在该目录下自动以该表名命名
--num-mappers:并发的map数
--null-string:null值时,HDFS存储为N
--null-non-string:非字符类型的字段为空时,存储为N
--incremental append或lastmodified:自动增量方式
--check-column
--last-value:上一次导入的最后一个值
sqoop import \
--query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \
--split-by a.id --target-dir /user/foo/joinresults
sqoop expert ........... 从hadoop里导出数据
sqoop import ........... 导入数据到hadoop里
sqoop处理hive与mysql的空值
--null-string '\\N' \
--null-non-string '\\N' 这俩参数重要 。因为hive和mysql里对于空值的默认形式不一样,hive是 '\N' ,mysql是 'null'
sqoop导出数据一致性
sqoop导出数据时默认用4个map,有些map可能成功了,数据进入目标表了,有些map可能失败了,数据没能进入目标表。用来汇报的表数据就不全,这种情况是不允许的。可以通过参数
--staging-table方式
sqoop export --connect jdbc:mysql://192.168.137.10:3306/user_behavior --username root --password 123456 --table app_cource_study_report --columns watch_video_cnt,complete_video_cnt,dt --fields-terminated-by "\t" --export-dir "/user/hive/warehouse/tmp.db/app_cource_study_analysis_${day}" --staging-table app_cource_study_report_tmp --clear-staging-table --input-null-string '\N'
sqoop导数据时数据倾斜
1.设置 -m map数设置多些
2.--split-by参数 搭配 创建虚拟列 ( row_number() over() as COLA )
涉及参数 --query、--split-by、--boundary-query
--query: select column1、 column2、 column3、 columnN from (select ROWNUM() OVER() AS ETL_ID, T.* from table T where xxx ) where $CONDITIONS
--split-by: ETL_ID
--boundary-query: select 1 as MIN , sum(1) as MAX from table where xxx
sqoop与datax性能比较
sqoop毕竟是分布式的MR,datax是单机式的。
sqoop比datax导数据速度快,sqoop大概是20M/s,datax是5M/s。
但是sqoop主要支持各传统关系型数据库与HADOOP之间的导数据,
datax支持的数据种类丰富 hbase,mysql,pg,oracle,mongodb.......等