赞
踩
mysql数据导入数据仓库Hive的各种方案
采用sqoop向hive中导入原始数据形成ODS层,之后可以在原始数据的基础上进行增量备份数据(定时同步)或者通过canal解析binlog(实时同步)日志进行同步数据。
1.sqoop向hive中导数据的原理
sqoop在向hive中导入数据时,是先将数据上传到hdfs中,然后创建表,最后再将hdfs中的数据load到表目录下。
我们采用sqoop直接导入hive并自动创建hive表,产生的是hive内部表。
可以通过查看表的位置信息识别(desc formatted table_name;),
- 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),由hive自身管理
- 外部表的存储位置可以自定义,由HDFS管理,
- 删除内部表会直接删除元数据(metadata)及存储数据;
- 删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
sqoop导入数据到hive其实细分很多种情况:
全量备份(初次导入原始数据)
- 1.先将数据导入hdfs中,然后在hive中自己建内部表,将数据load进hive中(load完之后hdfs中的数据就会消失)
- 2.先将数据导入hdfs,然后自己建hive外部表,设置location hdfs的路径,做数据关联(源数据路径不变)
- 3.将数据直接导入已创建好的hive表中(需要你手动建表)
- 4.将数据导入hive中,hive表不存在,导入的时候自动创建hive表
- 5.表如果过多,可以考虑使用import-all-tables工具一次性全库导入,导入的同时自动生成表,但是必须满足以下条件:
- 5.1.每个表必须具有主键或使用--autoreset-to-one-mapper选项。
- 5.2.会导入每张表的所有列。
- 5.3.使用默认拆分列,不能使用WHERE条件
增量备份(后续在原始数据的基础上做数据同步)
- 1.Append方式,以唯一id为依据,在指定值的基础上导入新数据
- 2.lastModify方式,以最后修改时间为依据,同步指定时间节点之后修改的数据
- --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 任务并发抽取。

- # 全量备份(将数据导入到HDFS指定目录)
- sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
- --username root --password 123456 \
- --query 'select * from useradmin where id>10 and $CONDITIONS' \
- --target-dir /user/root/test/ \
- --delete-target-dir \
- --fields-terminated-by '\t' \
- --hive-drop-import-delims \
- --null-string '\\N' \
- --null-non-string '\\N' \
- --split-by id \
- -m 1
-
-
- 全量备份(导入已有的hive表)
- sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
- --username root --password 123456 --table useradmin \
- --hive-import \
- --hive-database test \
- --hive-table useradmin \
- --fields-terminated-by '\t' \
- --hive-overwrite \
- --null-string '\\N' \
- --null-non-string '\\N' \
- --split-by id \
- -m 1
-
-
- 全量备份(hive表不存在,导入时自动创建hive表)
- sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
- --username root --password 123456 --table users \
- --hive-import \
- --hive-database test1 \
- --create-hive-table \
- --fields-terminated-by '\t' \
- --null-string '\\N' \
- --null-non-string '\\N' \
- --split-by id \
- -m 1
-
-
- 全库导入
- sqoop import-all-tables "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
- --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
- --username root \
- --password 123456 \
- --hive-import \
- --hive-overwrite \
- --hive-database original_usercenter_test \
- --fields-terminated-by '\t' \
- --exclude-tables 'drop_table' \
- --as-parquetfile
-
- #--exclude-tables 'drop_table' \ (此参数可以 exclude掉不需要import的表(多个表逗号分隔))
- #--create-hive-table \ (不能和as-parquetfile共用)
- #--direct \ (只支持文本格式,不能和as-parquetfile共用)
- #--as-textfile \
-
-
- 增量备份lastmodified模式不支持直接导入Hive表(但是可以使用导入HDFS的方法,只不过--target-dir设置成Hive table在HDFS中的关联位置即可)
- sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
- --username root --password 123456 --table useradmin \
- --target-dir /user/hive/warehouse/test.db/useradmin \
- --null-string '\\N' \
- --null-non-string '\\N' \
- --split-by id \
- -m 1 \
- --fields-terminated-by '\t' \
- --hive-drop-import-delims \
- --incremental lastmodified \
- --check-column CreateTime \
- --last-value '2019-06-04 14:29:01' \
- --append
-
-
-
- 增量备份append模式,可以增量的导入hive表
- sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
- --username root --password 123456 --table useradmin \
- --hive-import \
- --hive-database test \
- --hive-table useradmin \
- --hive-drop-import-delims \
- --fields-terminated-by '\t' \
- --null-string '\\N' \
- --null-non-string '\\N' \
- --incremental append \
- --check-column id \
- --last-value 18 \
- --split-by id \
- -m 1

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。