Sqoop数据迁移
一、Sqoop概述
Sqoop是什么?
Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具。
将数据从RDBMS(Relational Database Management System)导入到HDFS、Hive、HBase
从HDFS导出数据到RDBMS
使用MapReduce导入和导出数据,提供并行操作和容错。
对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时,确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。
二、Sqoop数据迁移
1.从RDB(Relational Database)导入数据到HDFS
准备工作:
素材下载:retail_db.sql脚本及customer.csv表数据
链接:https://pan.baidu.com/s/1GlFMDnN21kiIsKa1MyR5KQ
提取码:wmm1
-
首先将sql文件 retail_db.sql 上传至linux /opt/software/sqoop/ 目录下
-
mysql中建库建表:
//创建数据库
mysql> create database retail_db;
mysql> use retail_db;
//执行sql语句
mysql> source /opt/software/sqoop/retail_db.sql
mysql> show tables;
展示如下:
1.1全量导入数据(customers)
在linux命令行执行:
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
相关参数解析:\ 表示换行
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \ #配置数据库连接为mysql数据库
--driver com.mysql.jdbc.Driver \ #加载jdbc驱动
--table customers \ #将customer表上传至hdfs中
--username root \ #mysql的用户名
--password ok \ #mysql用户名密码
--target-dir /data/retail_db/customers \ #指定hdfs上传的路径
-m 3 #设置Mapper的数量
注: -m 参数能够设置导入数据的 map 任务数量,m>1 表示导入方式为并发导入,这时我们必须同时指定 - -split-by (分割列 int)参数指定根据哪一列来实现哈希分片,从而将不同分片的数据分发到不同 map 任务上去跑,避免数据倾斜。
执行完成可以在hdfs web端50070端口 /data/retail_db/customers 路径下看到customers表信息,12435条数据被分成了3个分区存储
在linux上查看导入的customers表数据:
hdfs dfs -cat /data/retail_db/customers/part-m-00000
如下:
1.2通过Where语句过滤导入表(orders)
where条件: order_id < 500
sqoop import \
--connect jdbc:mysql://localhost:3306/retail_db \
--driver com.mysql.jdbc.Driver \
--table orders \
--where "order_id < 500" \
--username root \
--password ok \
--delete-target-dir \
--target-dir /data/retail_db/orders \
-m 3
注: 此处 delete-target-dir 表示删除hdfs目标路径的目录,因为之前1.1中已经创建过目标customers表文件,产生了数据,所以需先删除原先的目标路径文件,不然会起冲突报错
执行成功如图:
在linux上查看导入的orders表数据:
hdfs dfs -cat /data/retail_db/orders/part-m-00002
如下:
可以看到order_id最大为499,满足where条件,导入执行成功
1.3通过COLUMNS过滤导入表(customers)
选择导入字段: customer_id,customer_fname,customer_lname
sqoop import \
--connect jdbc