sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
核心的功能有两个:导入、导出
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等
sqoop本质是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序
hive本质就是执行计算,依赖于HDFS存储数据,把SQL转换成MR程序
sudo -u hive sqoop import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_brd_info \
-m 1 \
--fields-terminated-by '\t' \
--delete-target-dir \
--target-dir /user/hive/epp_brd_info
--fields-terminated-by 指定分隔符
--delete-target-dir 若目标路径存在则先删除
--target-dir 指定目标路径
-m 表示并发启动map的数量 -m 1表示启动一个map, 指定-m > 1时,必须添加 --split-by 指定分割列,
,分割列要求至少满足两个条件中任一个:1)目标表有主键 2)有num 类型或者date类型,因为会执行 min(split_column),max(split_column)操作来决定如何分割,否则无法启用多个map
hadoop fs -cat /user/hive/epp_brd/part-m-00000 查看导入文件
sudo -u hive sqoop import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--query "select affiliation_name,brand_cname from epp_brd_info where affiliation_no='U010102' and \$CONDITIONS" \
-m 1 \
--target-dir /user/hive/epp_brd_info
# Note: --query 带了where条件时需要加上 $CONDITIONS,使用双引号时 $CONDITIONS要转义成 \$CONDITIONS
sudo -u hive sqoop import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_org_region \
-m 1 \
--columns region_no,region_name \
--fields-terminated-by "\t" \
--delete-target-dir \
--target-dir /user/hive/epp_org_region
Sqoop 导入关系型数据到 hive 的过程是先导入到 hdfs,然后再 load 进入 hive
# 列出MySQL数据的数据库(测试连接)
/usr/bin/sqoop list-databases --connect jdbc:mysql://10.234.7.xx:3306/sso --username xx --password xx
# 在hive创建mysql的表
sudo -u hive sqoop create-hive-table \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_brd_info \
--hive-table zxl_test.epp_brd_info_empty;
# 单表全导入到hive
sudo -u hive sqoop import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_brd_info \
-m 1 \
--hive-import \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--delete-target-dir \
--hive-overwrite \
--hive-table zxl_test.epp_brd_info_empty;
导入mysql数据到hive
sudo -u hive sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://10.234.7.xx:3306/wm?tinyInt1isBit=false \
--username xx \
--password xx \
--table admin_user_app \
--query "select id,user_id,app_id,o_id,c_id,status,date_format(update_time, '%Y-%m-%d %H:%i:%s') update_time,date_format(create_time, '%Y-%m-%d %H:%i:%s') create_time from admin_user_app where 1=1 and \$CONDITIONS" \
--hive-import \
-m 1 \
--null-string '\\N' \
--null-non-string '\\N' \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--delete-target-dir \
--target-dir /user/hive/admin_user_app \
--hive-overwrite \
--hive-table zxl_test.admin_user_app;
Note:
time,date,datetime ,timestamp(都是非string类型)导入到hive时时间格式会有问题,如:“2018-07-17 10:01:54.0”;需要在导入时进行处理 —query。
tinyInt1isBit=false 是为了解决sqoop从mysql导入数据到hive时tinyint(1)格式自动变成Boolean;
并行导入mysql数据到hive
nohup sqoop import -D mapred.job.queue.name=root.belle -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:oracle:thin:@10.240.xx.xx:1521:xx \
-e "SELECT ID,ORDER_NO,REF_BILL_NO,SHOP_NO,SHOP_NO_FROM,PRODUCT_NO,SIZE_TYPE_NO,SIZE_NO,BRAND_DETAIL_NO,ITEM_FLAG,SCORE_AMOUNT,COLOR_NO,TAG_PRICE,SALE_PRICE,DISC_PRICE,SETTLE_PRICE,REDUCE_PRICE,REBATE_AMOUNT,QTY,AMOUNT,PREF_PRICE,PRO_NO,SPECIAL_SELL_FLAG,DISCOUNT,DISCOUNT_CODE,DISCOUNT_TYPE,DISCOUNT_SOURCE_ID,BILLING_CODE,BALANCE_BASE,VIP_DISCOUNT,BASE_SCORE,PRO_SCORE,COST_SCORE,ITEM_DISCOUNT,REDUCE_PRICE_REASON,BILL_TRANSFER_NO,PRICE_CHANGE_BILL_NO,RETURN_EXCHANGE_NUM,to_char(CREATE_TIME,'YYYY-MM-DD HH24:MI:SS') as CREATE_TIME,to_char(UPDATE_TIME,'YYYY-MM-DD HH24:MI:SS') as UPDATE_TIME,OUT_DATE_OLD,THIRD_TICKET_AMOUNT,CONTRACT_DISCOUNT FROM U_PD_DW.T04_SAL_ORDER_POS_DTL WHERE 1=1 and \$CONDITIONS" \
--hive-import \
--username xx \
--password xx \
--hive-database=retail_pos_bak \
--hive-table t04_sal_order_pos_dtl_bak \
--hive-partition-key data_base_partition \
--hive-partition-value 2016 \
--null-string '\\N' \
--null-non-string '\\N' \
--target-dir /user/zhang.xl/import/retail_pos_bak_tmp.t04_sal_order_pos_dtl_bak_2016 \
--delete-target-dir \
--hive-drop-import-delims \
--hive-overwrite \
--split-by OUT_DATE \
--m 10 &
Note:
-m 表示并发启动map的数量 -m 1表示启动一个map, 指定-m > 1时,必须添加 --split-by 指定分割列,
,分割列要求至少满足两个条件中任一个:1)目标表有主键 2)有num 类型或者date类型,因为会执行 min(split_column),max(split_column)操作来决定如何分割,否则无法启用多个map。
MySQL数据导入到HBase
sudo -u hive sqoop import \
--connect jdbc:mysql://10.234.7.xx:3306/wm \
--username xx \
--password xx \
--table admin_user_app \
--columns "id,user_id,app_id" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key id \
--hbase-table admin_user_app \
-m 1 \
--split-by id
Shylin