当前位置:   article > 正文

sqoop导入mysql数据到Hive的各种方案_sqoop将mysql数据导入hive

sqoop将mysql数据导入hive

mysql数据导入数据仓库Hive的各种方案
采用sqoop向hive中导入原始数据形成ODS层,之后可以在原始数据的基础上进行增量备份数据(定时同步)或者通过canal解析binlog(实时同步)日志进行同步数据。

1.sqoop向hive中导数据的原理
sqoop在向hive中导入数据时,是先将数据上传到hdfs中,然后创建表,最后再将hdfs中的数据load到表目录下。

我们采用sqoop直接导入hive并自动创建hive表,产生的是hive内部表。

可以通过查看表的位置信息识别(desc formatted table_name;),
 

  1. 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),由hive自身管理
  2. 外部表的存储位置可以自定义,由HDFS管理,
  3. 删除内部表会直接删除元数据(metadata)及存储数据;
  4. 删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。

2.sqoop导入hive的具体种类

sqoop导入数据到hive其实细分很多种情况:

全量备份(初次导入原始数据)

  1. 1.先将数据导入hdfs中,然后在hive中自己建内部表,将数据load进hive中(load完之后hdfs中的数据就会消失)
  2. 2.先将数据导入hdfs,然后自己建hive外部表,设置location hdfs的路径,做数据关联(源数据路径不变)
  3. 3.将数据直接导入已创建好的hive表中(需要你手动建表)
  4. 4.将数据导入hive中,hive表不存在,导入的时候自动创建hive表
  5. 5.表如果过多,可以考虑使用import-all-tables工具一次性全库导入,导入的同时自动生成表,但是必须满足以下条件:
  6. 5.1.每个表必须具有主键或使用--autoreset-to-one-mapper选项。
  7. 5.2.会导入每张表的所有列。
  8. 5.3.使用默认拆分列,不能使用WHERE条件

增量备份(后续在原始数据的基础上做数据同步)

  1. 1.Append方式,以唯一id为依据,在指定值的基础上导入新数据
  2. 2.lastModify方式,以最后修改时间为依据,同步指定时间节点之后修改的数据

3.sqoop导入的一些参数说明

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

4.实际导入代码,已亲测,可直接复制执行(记得换自己的数据库连接)

  1. # 全量备份(将数据导入到HDFS指定目录)
  2. sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
  3. --username root --password 123456 \
  4. --query 'select * from useradmin where id>10 and $CONDITIONS' \
  5. --target-dir /user/root/test/ \
  6. --delete-target-dir \
  7. --fields-terminated-by '\t' \
  8. --hive-drop-import-delims \
  9. --null-string '\\N' \
  10. --null-non-string '\\N' \
  11. --split-by id \
  12. -m 1
  13. 全量备份(导入已有的hive表)
  14. sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
  15. --username root --password 123456 --table useradmin \
  16. --hive-import \
  17. --hive-database test \
  18. --hive-table useradmin \
  19. --fields-terminated-by '\t' \
  20. --hive-overwrite \
  21. --null-string '\\N' \
  22. --null-non-string '\\N' \
  23. --split-by id \
  24. -m 1
  25. 全量备份(hive表不存在,导入时自动创建hive表)
  26. sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
  27. --username root --password 123456 --table users \
  28. --hive-import \
  29. --hive-database test1 \
  30. --create-hive-table \
  31. --fields-terminated-by '\t' \
  32. --null-string '\\N' \
  33. --null-non-string '\\N' \
  34. --split-by id \
  35. -m 1
  36. 全库导入
  37. sqoop import-all-tables "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
  38. --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
  39. --username root \
  40. --password 123456 \
  41. --hive-import \
  42. --hive-overwrite \
  43. --hive-database original_usercenter_test \
  44. --fields-terminated-by '\t' \
  45. --exclude-tables 'drop_table' \
  46. --as-parquetfile
  47. #--exclude-tables 'drop_table' \ (此参数可以 exclude掉不需要import的表(多个表逗号分隔))
  48. #--create-hive-table \ (不能和as-parquetfile共用)
  49. #--direct \ (只支持文本格式,不能和as-parquetfile共用)
  50. #--as-textfile \
  51. 增量备份lastmodified模式不支持直接导入Hive表(但是可以使用导入HDFS的方法,只不过--target-dir设置成Hive table在HDFS中的关联位置即可)
  52. sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
  53. --username root --password 123456 --table useradmin \
  54. --target-dir /user/hive/warehouse/test.db/useradmin \
  55. --null-string '\\N' \
  56. --null-non-string '\\N' \
  57. --split-by id \
  58. -m 1 \
  59. --fields-terminated-by '\t' \
  60. --hive-drop-import-delims \
  61. --incremental lastmodified \
  62. --check-column CreateTime \
  63. --last-value '2019-06-04 14:29:01' \
  64. --append
  65. 增量备份append模式,可以增量的导入hive表
  66. sqoop import --connect jdbc:mysql://11.25.57.18:3306/usercenter_test \
  67. --username root --password 123456 --table useradmin \
  68. --hive-import \
  69. --hive-database test \
  70. --hive-table useradmin \
  71. --hive-drop-import-delims \
  72. --fields-terminated-by '\t' \
  73. --null-string '\\N' \
  74. --null-non-string '\\N' \
  75. --incremental append \
  76. --check-column id \
  77. --last-value 18 \
  78. --split-by id \
  79. -m 1

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/822589
推荐阅读
相关标签
  

闽ICP备14008679号