一、Sqoop常用的关系型数据库导入与导出


以下是本篇文章正文内容,如有错误麻烦请指出。 谢谢 !!!


一、简介

  1. Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具;
  2. 关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS;
  3. Hadoop上HDFS的数据导出到关系型数据库中;
  4. Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务(MR任务)处理。

二、sqoop-import命令使用

2.1、Sqoop查看关系型数据库信息

  1. 1. 查看关系型数据库的库名
sqoop list-databases \
# --connect jdbc:oracle:thin:@ip:port \   # Oracle数据库连接
--connect jdbc:mysql://ip:port \          # MySQL数据库连接
--username root \
--password ******
  1. 2. 查看关系型数据库对应库名下的表名
sqoop list-tables \
--connect jdbc:mysql://ip:port/库名 \
--username root \
--password ******

2.2、关系型数据库数据导入到HDFS上

  1. 1. 指定表名导入到HDFS
sqoop-import --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task \
--where 'id < 100' \
--columns packages,requireno \
--target-dir /user/edq/sqoop-import/20210311 \
--delete-target-dir \
--compress \
--as-textfile \                      # 文件格式: 文本
-m 1
  1. 2. 指定SQL语句导入到HDFS
sqoop-import --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--query 'select * from task where 1 = 1 and \$CONDTIONS' \
--fields-terminated-by '@' \             # 指定字段之间的分隔符
--target-dir /user/edq/sqoop-import/20210311 \
--delete-target-dir \
--compress \
--as-textfile \
-m 1
  1. 3. 指定增量方式导入到HDFS
sqoop-import --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task \
--where 'id < 100' \
--columns packages,requireno \       # 不设置字段的情况下,默认是入全字段
--hive-drop-import-delims \          # 从字符串中删除Hive record \0x01和分隔符(\n\r)
--fields-terminated-by '@' \         # 指定字段之间的分隔符
--incremental append \               # 增量导入数据到HDFS的模式:append
--check-column lanuchdate \          # 增量导入数据到HDFS上需要检查的字段
--last-value '2021-02-03' \          # 增量导入数据到HDFS上需要检查上次拉取的最大值
--target-dir /user/edq/sqoop-import/20210311 \
--delete-target-dir \
--compress \
--as-textfile \
-m 1
  1. 4. 参数说明
--autoreset-to-one-mapper   # 如果没有拆分键可用,则将map的数量重置为1(注:不能和参数‘--split-by’一起用)
--split-by                  # 根据字段分割map个数
--split-limit               # 根据行数分割map个数
--as-avrodatafile           # 文件格式:avro
--as-parquetfile            # 文件格式:parquet
--as-sequencefile           # 文件格式:sequence
--as-avrodatafile           # 文件格式:avro
--warehouse-dir             # 导入HDFS的父路径
--enclosed-by               # 设置所需字段的封闭字符
--escaped-by                # 设置转义字符

2.3、关系型数据库数据导入到Hive上

  1. 1. 关系型数据库导入到Hive上(注:自动创建表)
sqoop-import --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task \
--where 'id < 100' \
--target-dir /user/edq/sqoop-import/20210311 \
--delete-target-dir \
--hive-import \                      # 执行Hive导入功能
--hive-database mysql_sqoop \        # Hive的库名
--hive-table task \                  # Hive表名
--fields-terminated-by '@' \         # 设置字段分隔符
--lines-terminated-by '\n' \         # 设置行分隔符
--hive-delims-replacement ' ' \      # 用自定义的空格字符串替换导入Hive字段中的Hive record \0x01和分隔符(\n\r)
--mapreduce-job-name 'mysql_to_hive' \
-m 1
  1. 2. 关系型数据库导入到Hive已存在的表中,并指定MapReduce任务结果数据的存放目录
sqoop-import --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task \
--where 'id < 100' \
--hive-import \                      # 执行Hive导入功能
--create-hive-table \                # 导入Hive时,自动创建表,表存时则报错!!!
--hive-database mysql_sqoop \        # Hive的库名
--hive-table task \                  # Hive表名
--fields-terminated-by '@' \         # 设置字段分隔符
--lines-terminated-by '\n' \         # 设置行分隔符
--hive-drop-import-delims \          # 从字符串中删除Hive record \0x01和分隔符(\n\r)
--hive-overwrite \                   # 覆盖Hive表中现有数据
--mapreduce-job-name 'mysql_to_hive' \
-m 1
  1. 3. 关系型数据库导入到Hive已存在的分区表中,并指定分区值
sqoop-import --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--query 'select * from task where 1 = 1 and \$CONDTIONS' \
--fields-terminated-by '@' \         # 设置字段分隔符
--lines-terminated-by '\n' \         # 设置行分隔符
--target-dir /user/edq/sqoop-import/20210311 \
--delete-target-dir \
--hive-import \                      # 执行Hive导入功能
--hive-database mysql_sqoop \        # Hive的库名
--hive-table task \                  # Hive表名
--hive-drop-import-delims \          # 从字符串中删除Hive record \0x01和分隔符(\n\r)
--hive-partition-key 'part_date' \   # 导入Hive的分区字段
--hive-partition-value '20210302' \  # 导入Hive分区字段的值
--hive-overwrite \                   # 覆盖Hive表中现有数据
--mapreduce-job-name 'mysql_to_hive' \
-m 1
  1. 4. 关系型数据库导入到HBASE
sqoop-import --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--query 'select column1,column2,...... from task where 1 = 1 and \$CONDTIONS' \
--fields-terminated-by '@' \         # 设置字段分隔符
--lines-terminated-by '\n' \         # 设置行分隔符
--target-dir /user/edq/sqoop-import/20210311 \
--delete-target-dir \
--hbase-create-table \               # 创建HBASE表,表存在也不会报错
--hbase-table 'namespace:table' \    # 指定HBASE的表名
--hbase-row-key id \                 # 指定HBASE的RowKey字段名
--column-family info \               # 自定义HBASE的列族名
--hbase-bulkload \                   # 加载数据到HBASE的方式:bulkload
--mapreduce-job-name 'mysql_to_hbase' \
-m 1

三、sqoop-export命令使用

3.1、全量导出HDFS数据到MySQL

sqoop-export --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task_test \                  # 到出到MySQL表
--fields-terminated-by '@' \         # 导出到MySQL时,指出HDFS数据的分隔符
--export-dir /user/edq/sqoop-import/20210311 \   # HDFS源数据目录
--mapreduce-job-name 'hdfs_to_mysql' \
-m 1

3.2、导出HDFS数据到MySQL关于参数‘–update-mode’的应用

  1. 1. updateonly模式: 根据指定字段的Key与HDFS上的数据进行对比更新,只更新MySQL中存在的Key,不存在的则不更新
sqoop-export --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task_test \                  # 到出到MySQL表
--fields-terminated-by '@' \         # 导出到MySQL时,指出HDFS数据的分隔符
--export-dir /user/edq/sqoop-import/20210311 \   # HDFS源数据目录
--update-mode updateonly \           # 指定更新模式
--update-key 'id' \                  # 指定主键
--mapreduce-job-name 'hdfs_to_mysql' \
-m 1
  1. 2. allowinsert模式: 新增源数据
sqoop-export --connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task_test \                  # 到出到MySQL表
--fields-terminated-by '@' \         # 导出到MySQL时,指出HDFS数据的分隔符
--export-dir /user/edq/sqoop-import/20210311 \   # HDFS源数据目录
--update-mode allowinsert \          # 指定更新模式
--mapreduce-job-name 'hdfs_to_mysql' \
-m 1

四、sqoop-job命令使用

4.1 创建Job任务

  1. 1. 创建Job,并导出数据(注:参数‘–last-value’的值是根据每次任务Job执行成功之后都会将最后一次的最大值填充进去)
sqoop-job \
--create 'mysql_to_hdfs_job'         # 设置Job名称
-- import                            # -- 与 import之间需要有空格,不然会报错
--connect jdbc:mysql://ip:port/库名 \
--driver com.mysql.jdbc.Driver \
--username root \
--password ****** \
--table task \                       # 到出到MySQL表
--fields-terminated-by '@' \
--line-terminated-by '\n' \
--incremental append \               # 增量导入数据到HDFS的模式:append
--check-column lanuchdate \          # 增量导入数据到HDFS上需要检查的字段
--last-value '0' \          # 增量导入数据到HDFS上需要检查上次拉取的最大值
--target-dir /user/edq/sqoop-import/20210311 \
-m 1
  1. 2. sqoop-job基本使用
# 查看Job
sqoop-job  --list
# 执行Job
sqoop-job  --exec mysql_to_hdfs_job(Job名称)
# 删除Job
sqoop-job  --delete mysql_to_hdfs_job(Job名称)
# 查看Job每次执行完成后详细信息,包括参数‘--last-value’的值
sqoop-job --show mysql_to_hdfs_job(Job名称)
  1. **3. ** 关于每次执行Job时需要输入密码设置
# 修改配置文件conf/sqoop-site.xml中对应的参数
sqoop.metastore.client.record.password 对应的值为 true
# 从而可以取消每次执行Job时输入密码,使用Job中执定的密码

对以前的知识回顾,加深基础知识!
每天进步一点点,也许某一天你也会变得那么渺小!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值