Sqoop 数据迁移

Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具
将数据从RDBMS导入到Hadoop
HDFS、Hive、HBase
从Hadoop导出数据到RDBMS
将导入或导出命令翻译成MapReduce程序来并行操作和容错
目标用户
系统管理员、数据库管理员
大数据分析师、大数据开发工程师等

MySQL数据导入HDFS

准备工作:mysql中建库建表
mysql> create database retail_db;

mysql> use retail_db;

mysql> source /root/data/sqoop/retail_db.sql

使用sqoop将customers表导入到hdfs上

sqoop import --connect jdbc:mysql://localhost:3306/retail_db --driver com.mysql.jdbc.Driver --table customers --username root --password ok --target-dir /data/retail_db/customers --m 3

报错

Exception in thread “main” java.lang.NoClassDefFoundError: org/json/JSONObject
at org.apache.sqoop.util.SqoopJsonUtil.getJsonStringforMap(SqoopJsonUtil.java:43)
at org.apache.sqoop.SqoopOptions.writeProperties(SqoopOptions.java:784)
at org.apache.sqoop.mapreduce.JobBase.putSqoopOptionsToConfiguration(JobBase.java:392)
at org.apache.sqoop.mapreduce.JobBase.createJob(JobBase.java:378)
at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:256)
at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:692)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:513)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.json.JSONObject

拷贝jar包
cp /opt/software/java-json.jar /opt/install/sqoop-1.4.6-cdh5.14.2/lib/

重新执行

使用where过滤
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--where "order_id<100" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data/retail_db/orders \
--m 3
使用columns过滤
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table customers \
--columns "customer_id,customer_fname,customer_lname" \
--username root \
--password root \
--delete-target-dir \
--target-dir /data/retail_db/customers \
--m 3
使用查询语句进行过滤
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \

select * from orders ;

并行计算,–m 3 ,假设只有90个order_id
select * from orders where order>=0 and order <30;
select * from orders where order>=30 and order <60;
select * from orders where order>=60 and order <90;

如果按照日期进行指定的话
假设有3天,其中第一天10订单,第二天50订单,第3天20订单
select * from orders where order_date>=2020-7-20 and order_date<2020-7-21;
select * from orders where order_date>=2020-7-21 and order_date<2020-7-22;
select * from orders where order_date>=2020-7-22 and order_date<2020-7-23;

**增量导入**
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--incremental append \
--check-column order_date \
--last-value '2013-07-24 00:00:00'
--target-dir /data/retail_db/orders \
--m 3

SELECT MIN(order_id), MAX(order_id) FROM orders WHERE ( order_date > ‘2013-07-24 00:00:00’ AND order_date <= ‘2014-07-24 00:00:00.0’ )
insert into orders values(99999,‘2015-05-30 00:00:00’,11599,‘CLOSED’);

sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--incremental append \
--check-column order_date \
--last-value '0'
--target-dir /data/retail_db/orders \
--m 3

SELECT MIN(order_id), MAX(order_id) FROM orders WHERE ( order_date > ‘2014-07-24 00:00:00.0’ AND order_date <= ‘2015-05-30 00:00:00.0’ )

创建job

sqoop job --create mysql2hdfs \
-- import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--incremental append \
--check-column order_date \
--last-value '0' \
--target-dir /data/retail_db/orders \
--m 3

查看job
sqoop job --list

执行job
sqoop job --exec mysql2hdfs

insert into orders values(999999,‘2016-05-30 00:00:00’,11599,‘CLOSED’);

SELECT MIN(order_id), MAX(order_id) FROM orders WHERE ( order_date > ‘2015-05-30 00:00:00.0’ AND order_date <= ‘2016-05-30 00:00:00.0’ )

每次job执行成功之后都会修改 --last-value 值 将最后一次的最大值填充进去
这里的 ‘0’ 没有实际含义,只是为了保证第一次数据导入时值最小

每天可以定时执行
crontab -e

  • 2 */1 * * sqoop job --exec mysql2hdfs

导入数据到Hive中

先在Hive中创建表
hive -e “create database if not exists retail_db;”


```c

```c

```c

```c

```c

```c
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--username root \
--password root \
--hive-import \
--create-hive-table \
--hive-database retail_db \
--hive-table orders \
--m 3

报错,输出路径已存在
20/07/15 22:29:04 ERROR tool.ImportTool: Import failed: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://hadoop1:9000/user/root/orders already exists
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:270)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:143)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1307)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1304)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1304)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1325)
at org.apache.sqoop.mapreduce.ImportJobBase.doSubmitJob(ImportJobBase.java:203)
at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:176)
at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:273)
at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:692)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:513)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
删除已存在的目录
[root@hadoop1 lib]# hdfs dfs -rmr hdfs://hadoop1:9000/user/root/orders

又报错
20/07/15 22:26:56 ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:50)
at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392)
at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379)
at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:530)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

缺少hive-common-1.1.0-cdh5.14.2.jar,所以从Hive的lib中进行拷贝
cp /opt/install/hive-1.1.0-cdh5.14.2/lib/hive-common-1.1.0-cdh5.14.2.jar /opt/install/sqoop-1.4.6-cdh5.14.2/lib/

再执行又报错
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader
at org.apache.hadoop.hive.conf.HiveConf$ConfVars.(HiveConf.java:370)
at org.apache.hadoop.hive.conf.HiveConf.(HiveConf.java:108)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)
at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392)
at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379)
at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:530)
at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)
at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.shims.ShimLoader

缺少jar包,需要从Hive中进行拷贝
cp /opt/install/hive-1.1.0-cdh5.14.2/lib/hive-shims* /opt/install/sqoop-1.4.6-cdh5.14.2/lib/

**

导入数据到Hive分区中

**
删除Hive表
drop table if exists orders;
导入
sqoop import
–connect jdbc:mysql://localhost:3306/retail_db
–driver com.mysql.jdbc.Driver
–query “select order_id,order_status from orders where order_date>=‘2013-11-03’ and order_date <‘2013-11-04’ and $CONDITIONS”
–username root
–password root
–delete-target-dir
–target-dir /data/retail_db/orders
–split-by order_id
–hive-import
–hive-database retail_db
–hive-table orders
–hive-partition-key “order_date”
–hive-partition-value “2013-11-03”
–m 3

注意:分区字段不能当成普通字段导入表中

导入数据到HBase中

1.在HBase中建表
create ‘products’,‘data’,‘category’
2.sqoop导入
sqoop import
–connect jdbc:mysql://localhost:3306/retail_db
–driver com.mysql.jdbc.Driver
–username root
–password root
–table products
–hbase-table products
–column-family data
–m 3

HDFS 向MySQL中导出数据

1.MySQL中建表
create table customers_demo as select * from customers where 1=2;

2.上传数据
hdfs dfs -mkdir /customerinput
hdfs dfs -put customers.csv /customerinput

3.导出数据
sqoop export
–connect jdbc:mysql://localhost:3306/retail_db
–driver com.mysql.jdbc.Driver
–username root
–password root
–table customers_demo
–export-dir /customerinput
–m 1

sqoop 脚本

1.编写脚本 job_RDBMS2HDFS.opt
import
–connect
jdbc:mysql://localhost:3306/retail_db
–driver
com.mysql.jdbc.Driver
–table
customers
–username
root
–password
root
–target-dir
/data/retail_db/customers
–delete-target-dir
–m
3

2.执行脚本
sqoop --options-file job_RDBMS2HDFS.opt

### Sqoop 数据迁移的使用方法及应用场景 #### 1. Sqoop 数据迁移的基本原理 Apache Sqoop 是一种用于在关系型数据库(RDBMS)和 Hadoop 生态系统之间高效传输大数据的工具[^2]。它通过 MapReduce 任务将数据从关系型数据库导入到 Hadoop 分布式文件系统(HDFS)、Hive 或 HBase 中,或者将 Hadoop 中的数据导出到关系型数据库中。值得注意的是,Sqoop 的实现只涉及 Map 阶段,而没有 Reduce 阶段[^3]。 #### 2. Sqoop 数据迁移的实现方式 Sqoop数据迁移主要分为两种模式:**导入**和**导出**。 - **导入模式**: - 将关系型数据库中的数据迁移到 Hadoop 系统中。 - 支持全量导入和增量导入[^4]。 - 示例代码如下,展示如何将 MySQL 数据库中的表 `employees` 导入到 HDFS 中: ```bash sqoop import \ --connect jdbc:mysql://localhost:3306/company \ --username root \ --password password \ --table employees \ --target-dir /user/hadoop/employees ``` - **导出模式**: - 将 Hadoop 系统中的数据迁移到关系型数据库中。 - 示例代码如下,展示如何将 HDFS 中的数据导出到 MySQL 表 `employees` 中: ```bash sqoop export \ --connect jdbc:mysql://localhost:3306/company \ --username root \ --password password \ --table employees \ --export-dir /user/hadoop/employees ``` #### 3. Sqoop 的应用场景 Sqoop 在实际项目中广泛应用于以下场景: - **大规模数据迁移**: - 当企业需要将传统的关系型数据库中的数据迁移到 Hadoop 平台进行大数据分析时,Sqoop 提供了高效的解决方案[^1]。 - **增量数据同步**: - 对于需要频繁更新的数据集,Sqoop 支持基于时间戳或主键的增量导入功能。 - **数据湖建设**: - Sqoop 可以作为数据湖的一部分,用于将结构化数据从 RDBMS 导入到 Hadoop 平台中[^2]。 - **ETL 流程**: - 在 ETL(Extract, Transform, Load)流程中,Sqoop 负责数据抽取阶段,后续结合其他工具完成数据转换和加载。 #### 4. Sqoop 的挑战与解决方案 在实际应用中,Sqoop 可能面临以下挑战及相应的解决方案: - **数据量过大**: - 解决方案:采用分批次迁移策略,避免单次迁移导致系统资源耗尽。 - **网络不稳定**: - 解决方案:启用断点续传功能,确保在网络中断后能够继续完成任务。 - **数据质量问题**: - 解决方案:在迁移前对数据进行预处理,例如清理空值、去重等操作[^1]。 - **迁移失败重试**: - 解决方案:创建 Sqoop Job,并设置自动重试机制,减少人工干预。 #### 5. Sqoop 的未来发展趋势 随着大数据技术的不断发展,Sqoop 也在持续演进。未来的 Sqoop 可能会更加注重与其他新技术的集成,例如支持云原生架构、增强对非结构化数据的支持以及优化性能以适应更大规模的数据迁移需求[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值