mysql分库分表数据导入hive之sqoop-shell脚本

sqoop分库分表shell导入脚本

之前的生产集群使用到了mysql的分库分表,所以抽取同一张表的数据就需要从不同的库与表中进行抽取了!话不多说先上图
分库
mysql分库分表数据导入hive之sqoop-shell脚本_第1张图片
分表
mysql分库分表数据导入hive之sqoop-shell脚本_第2张图片

一、sqoop导入脚本

#!/bin/bash
#coding=UTF-8

sqoop=/data/cloudera/parcels/CDH-5.14.4-1.cdh5.14.4.p0.3/bin/sqoop

$sqoop import \
-Dhadoop.security.credential.provider.path=jceks://hdfs/nameservice1/conf/ps/dev181ps \
--connect jdbc:mysql://ip:3306/mall_order0 \
--table orders_0 \
--username root \
--password-alias dev181ps \
--delete-target-dir \
--target-dir /warehouse/malls/ods/ods_mall_order

注:这里有用到sqoop密码加密,参考sqoop密码明文问题解决

二、sqoop分库分表全量导入脚本

这里的hive表是已经创建好了的

#!/bin/bash
#coding=UTF-8

MysqlDB=mall_order
sqoop=/data/cloudera/parcels/CDH-5.14.4-1.cdh5.14.4.p0.3/bin/sqoop

for((i=0; i<=3; i++)); do
	con_jdbc=jdbc:mysql://ip:3306/mall_order$i 
	echo -$con_jdbc
	for((j=0; j<=7; j++)); do
		$sqoop import \
		-Dhadoop.security.credential.provider.path=jceks://hdfs/nameservice1/conf/ps/dev181ps \
		--connect $con_jdbc \
		--table orders_$j \
		--username root \
		--password-alias dev181ps \
		--hive-import \
		--hive-database malls\
		--hive-table tmp_ods_mall_order \
		--fields-terminated-by '\001' 
	done
done

三、sqoop导入参数详解

当然这里只是举了一个简单的例子,你可以根据你的业务分库分表规则去自定义shell脚本的传入参数与分库分表规则,因为每个规则都不同所以这里不做态度阐述,但是会详细列出sqoop导入hive的参数含义

 --hive-import          插入数据到hive当中,使用hive的默认分隔符
  --hive-overwrite  重写插入
  --create-hive-table  建表,如果表已经存在,该操作会报错!
  --hive-table [table]  设置到hive当中的表名
  --hive-drop-import-delims  导入到hive时删除 \n, \r, and \01 
  --hive-delims-replacement  导入到hive时用自定义的字符替换掉 \n, \r, and \01 
  --hive-partition-key     hive分区的key
  --hive-partition-value   hive分区的值
  --map-column-hive       类型匹配,sql类型对应到hive类型
	--direct 是为了利用某些数据库本身提供的快速导入导出数据的工具,比如mysql的mysqldump
  性能比jdbc更好,但是不知大对象的列,使用的时候,那些快速导入的工具的客户端必须的shell脚本的目录下
	--columns <列名>   	指定列  
	-z, –compress	打开压缩功能
	–compression-codec < c >	使用Hadoop的压缩,默认为gzip压缩
	–fetch-size < n >	从数据库一次性读入的记录数
	–as-avrodatafile	导入数据格式为avro
	–as-sequencefile	导入数据格式为sqeuqncefile
	–as-textfile	导入数据格式为textfile
	--as-parquetfile 	导入数据格式为parquet
	--query 'select * from test_table where id>10 and $CONDITIONS' \	($CONDITIONS必须要加上就相当于一个配置参数,sql语句用单引号,用了SQL查询就不能加参数--table )
	--target-dir /sqoop/emp/test/ \ 		(指定导入的目录,若不指定就会导入默认的HDFS存储路径:/user/root/XXX.)
	--delete-target-dir  	(如果指定目录存在就删除它,一般都是用在全量导入,增量导入的时候加该参数会报错)
	--fields-terminated-by '\n' \		(指定字段分割符为',')
	--null-string '\\N' \		(string类型空值的替换符(Hive中Null用\n表示))
	--null-non-string '\\N' \		(非string类型空值的替换符)
	--split-by id \	(根据id字段来切分工作单元实现哈希分片,从而将不同分片的数据分发到不同 map 任务上去跑,避免数据倾斜。)
	-m 3 	(使用3个mapper任务,即进程,并发导入)
	 一般RDBMS的导出速度控制在60~80MB/s,每个 map 任务的处理速度5~10MB/s 估算,即 -m 参数一般设置4~8,表示启动 4~8 个map 任务并发抽取。

你可能感兴趣的:(大数据)