一、Sqoop常用的关系型数据库导入与导出
以下是本篇文章正文内容,如有错误麻烦请指出。 谢谢 !!!
一、简介
- Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具;
- 关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS;
- Hadoop上HDFS的数据导出到关系型数据库中;
- Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务(MR任务)处理。
二、sqoop-import命令使用
2.1、Sqoop查看关系型数据库信息
- 1. 查看关系型数据库的库名
sqoop list-databases \
# --connect jdbc:oracle:thin:@ip:port \ # Oracle数据库连接
--connect jdbc:mysql://ip:port \ # MySQL数据库连接
--username root \
--password ******
- 2. 查看关系型数据库对应库名下的表名
sqoop list-tables \
--connect jdbc:mysql://ip:port/库名 \
--username root \
--password ******
2.2、关系型数据库数据导入到HDFS上
- 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
- 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
- 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
- 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. 关系型数据库导入到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
- 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
- 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
- 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. 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
- 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. 创建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
- 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名称)
- **3. ** 关于每次执行Job时需要输入密码设置
# 修改配置文件conf/sqoop-site.xml中对应的参数
sqoop.metastore.client.record.password 对应的值为 true
# 从而可以取消每次执行Job时输入密码,使用Job中执定的密码
对以前的知识回顾,加深基础知识!
每天进步一点点,也许某一天你也会变得那么渺小!!!