目录
一,Sqoop的概述
Sqoop 是一个用于在 Hadoop 和关系型数据库之间高效传输数据的工具。
它主要用于将关系型数据库中的数据导入到 Hadoop 的 HDFS(Hadoop Distributed File System)、Hive 或 HBase 中,也可以将 Hadoop 中的数据导出到关系型数据库。
- sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
- 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;
- 导出数据:从Hadoop的HDFS、HIVE中导出数据到关系数据库mysql等。
Sqoop的工作机制:
Sqoop工作机制是将导入或导出命令翻译mapreduce(只有map没有reduce)程序来实现。
二,Sqoop的特点
- 高效的数据传输:Sqoop 利用了 MapReduce 框架的并行处理能力,可以快速地在关系型数据库和 Hadoop 之间传输大量数据。
- 多种数据库支持:Sqoop 可以与多种关系型数据库进行交互,如 MySQL、Oracle、PostgreSQL 等。
- 灵活的数据导入和导出:可以根据需求选择不同的导入和导出方式,如全表导入、增量导入、条件导入等。
- 易于使用:Sqoop 提供了简单的命令行接口,使得用户可以方便地进行数据传输操作。
三,Sqoop的安装
安装前提
- 确保已经安装了 Hadoop 环境,并且配置正确。
- 安装 Java 环境,Sqoop 是用 Java 编写的,需要 Java 运行时环境。
#你的hive安装在哪一台主机,你的sqoop就要装在哪一台主机,该操作是以node1为例
1、在node1中,上传sqoop的安装包到/export/software目录
2、在node1中,解压sqoop安装包到/export/server目录
下载 Sqoop
- 从 Apache Sqoop 官方网站下载合适版本的 Sqoop 安装包。
- sqoop.apache.org
解压安装包
- 将下载的安装包解压到指定目录。
tar -xvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /export/server/
配置环境变量
- 设置 Sqoop 的环境变量,使得系统可以找到 Sqoop 的安装路径。
配置数据库连接
- 根据要连接的数据库,配置相应的数据库驱动和连接参数。
#你的hive安装在哪一台主机,你的sqoop就要装在哪一台主机,该操作是以node1为例
1、在node1中,上传sqoop的安装包到/export/software目录
2、在node1中,解压sqoop安装包到/export/server目录
tar -xvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /export/server/
3、在node1中,对解压后的sqoop目录进行重命名
cd /export/server/
mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7
4、在node1中,修改sqoop的配置文件,
cd /export/server/sqoop-1.4.7/conf
mv sqoop-env-template.sh sqoop-env.sh
修改sqoop-env.sh 文件,设置以下内容
export HADOOP_COMMON_HOME=/export/server/hadoop-3.3.0
export HADOOP_MAPRED_HOME=/export/server/hadoop-3.3.0
export HIVE_HOME=/export/server/hive-3.1.2
5、在node1中,加入mysql的jdbc驱动包和hive的执行包
cp /export/server/hive-3.1.2/lib/mysql-connector-java-5.1.32-bin.jar /export/server/sqoop-1.4.7/lib/
cp /export/servers/hive-3.1.2/lib/hive-exec-3.1.2.jar /export/servers/sqoop-1.4.7/lib/
cp /export/server/hive-3.1.2/hcatalog/share/hcatalog/hive-hcatalog-core-3.1.2.jar /export/server/sqoop-1.4.7/lib/
6、在node1,node2、node3中,配置环境变量
vim /etc/profile
添加以下内容
export SQOOP_HOME=/export/server/sqoop-1.4.7
export PATH=:$SQOOP_HOME/bin:$PATH
# HCatelog
export HCAT_HOME=/export/server/hive-3.1.2/hcatalog
export hive_dependency=$HIVE_HOME/conf:$HIVE_HOME/lib/*:$HIVE_HOME/hcatalog/share/hcatalog/hive-hcatalog-core-3.1.2.jar
添加完之后一定要保存退出,执行以下命令
source /etc/profile
7、在node1中,测试sqoop
sqoop list-databases \
--connect jdbc:mysql://node1:3306/ \
--username root --password 123456
测试有无成功 查看mysql中所有的数据库
#测试你的sqoop是否能查看MySQL中所有的数据库
sqoop list-databases \
--connect jdbc:mysql://up01:3306/ \
--username root \
--password 123456
四,Sqoop快速入门
在mysql中准备数据
drop database if exists test cascade ;
create database if not exists test;
-- 手动在hive中建一张表
create table test.emp_hive
(
id int,
name string,
deg string,
salary int,
dept string
)
row format delimited fields terminated by '\t'
stored as orc;
在liunx中执行代码
#这是liunx执行的代码
sqoop list-databases \
--connect jdbc:mysql://up01:3306/ \
--username root \
--password 123456
# 以下是解释
#测试你的sqoop是否能查看MySQL中所有的数据库
sqoop list-databases \ # 这个是查看数据库的全部库
--connect jdbc:mysql://up01:3306/ \ #这个是连接数据库信息
--username root \ #用户名
--password 123456 #主机
五,从MySQL中导入数据到HDFS中
sqoop import \
--connect jdbc:mysql://替换为你的主机名:3306/mysql中的库名 \
--username root \
--password 123456 \
--target-dir /sqoop/result2 \
--delete-target-dir \
--table emp \
--m 1
#这是注释
sqoop import \ #sqoop导入
--connect jdbc:mysql://up01:3306/userdb \ #要连接的数据库主机名和数据库名字
--table emp \ #表名
--username root \ #用户名
--password 123456 \ #密码
--target-dir /sqoop/result1 \ #HDFS的目标目录
--delete-target-dir \ #如果HDFS的目标目录存在,则删除
--m 1 #开启一个Map任务
或导入到HDFS中,使用指定分隔符
sqoop import \
--connect jdbc:mysql://主机名:3306/库名 \
--username root \
--password 123456 \
--target-dir /sqoop/result2 \
--delete-target-dir \
--fields-terminated-by '\t' \
--table emp \
--m 1
或设置任务并行度
sqoop import \
--connect jdbc:mysql://up01:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoop/result3 \
--delete-target-dir \
--fields-terminated-by '\t' \
--split-by id \
--table emp \
--m 2
#参数解释
--split-by id #按照id列将整个表拆分成2部分,分别由两个Map进行数据导入,id一般是数值列
#内部是获取id列的最大值和最小值进行均分
第一个Map任务: 1201 1202
第二个Map任务: 1203 1204 1205
SELECT MIN(`id`), MAX(`id`) FROM `emp` # (最大 - 最小) / Map任务的数量
六,从MySQL导入数据到Hive中
hive会自动创建表,默认使用的分隔符是 逗号 ,
sqoop import \
--connect jdbc:mysql://up01:3306/userdb \
--table emp_conn \
--username root \
--password 123456 \
--hive-import \
--hive-database test \
--m 1
或指定分隔符导入
# 2、手动指定hive分隔符 '\t',使用默认的hive表名(和MySQL表名相同)
sqoop import \
--connect jdbc:mysql://up01:3306/userdb \
--table emp_conn \
--username root \
--password 123456 \
--fields-terminated-by '\t' \
--hive-import \
--hive-database test \
--m 1
或指定表导入
# 2、手动指定hive分隔符 '\t',使用默认的hive表名(和MySQL表名相同)
sqoop import \
--connect jdbc:mysql://up01:3306/userdb \
--table emp_conn \
--username root \
--password 123456 \
--fields-terminated-by '\t' \
--hive-import \
--hive-database test \
--m 1
七,从MySQL导入到Hive中并且存储格式是ORC
如果hive表 存储格式想选择是orc模式 则就需要HCatalog API插件了
在hive中建表 选择存储格式是orc
# 2、手动指定hive分隔符 '\t',使用默认的hive表名(和MySQL表名相同)
sqoop import \
--connect jdbc:mysql://up01:3306/userdb \
--table emp_conn \
--username root \
--password 123456 \
--fields-terminated-by '\t' \
--hive-import \
--hive-database test \
--m 1
迁移jar包
# 1、从Hive拷贝jar包到Sqoop
cp /export/server/hive-2.1.0/hcatalog/share/hcatalog/hive-hcatalog-core-2.1.0.jar /export/server/sqoop-1.4.6-cdh5.14.0/lib/
配置环境变量
#2、在/etc/profile配置环境变量
export HCAT_HOME=/export/server/sqoop-1.4.6-cdh5.14.0/hcatalog
export hive_dependency=$HIVE_HOME/conf:$HIVE_HOME/lib/*:$HIVE_HOME/hcatalog/share/hcatalog/hive-hcatalog-core-2.1.0.jar
使用Sqoop导入数据
#如果要将从MySQL导入到Hive的ORC格式的表,必须手动在Hive中先创建表
#如果你的hive表是ORC格式,必须先建表,然后使用带--hcatalog方式来导入
sqoop import \
--connect jdbc:mysql://up01:3306/userdb \
--username root \
--password 123456 \
--table emp \
--fields-terminated-by '\t' \
--hcatalog-database test \
--hcatalog-table emp_hive \
-m 1
八,Sqoop和DataX以及Kettle的区别
一、Sqoop
主要功能:
- Sqoop 主要用于在 Hadoop 生态系统(如 Hive、HBase)和关系型数据库之间进行高效的数据传输。
- 支持将关系型数据库中的数据导入到 Hadoop 中,也可以将 Hadoop 中的数据导出到关系型数据库。
特点:
- 基于 Hadoop 的 MapReduce 框架,具有良好的并行处理能力,能够处理大规模数据的传输。
- 对关系型数据库和 Hadoop 生态系统的集成较为紧密,特别适用于在这两者之间进行数据迁移。
- 提供了丰富的命令行参数,可以进行全表导入、增量导入等操作。
适用场景:
- 当需要在 Hadoop 生态系统和关系型数据库之间进行大规模数据迁移时,Sqoop 是一个很好的选择。
- 适用于企业中已经部署了 Hadoop 环境,并且需要与关系型数据库进行数据交互的场景。
二、DataX
主要功能:
- DataX 是一个通用的数据同步工具,可以在各种数据源之间进行数据交换。
- 支持的数据源非常广泛,包括关系型数据库、NoSQL 数据库、文件系统等。
特点:
- 采用插件化的架构,易于扩展,可以方便地添加新的数据源和数据转换功能。
- 具有高并发、高性能的数据传输能力,能够满足大规模数据集成的需求。
- 配置灵活,可以通过简单的 JSON 配置文件来定义数据同步任务。
适用场景:
- 当需要在多种不同类型的数据源之间进行数据集成时,DataX 具有很大的优势。
- 适用于企业中存在多种数据源,需要进行复杂的数据同步和转换的场景。
三、Kettle
主要功能:
- Kettle(Pentaho Data Integration)是一个功能强大的 ETL(Extract, Transform, Load)工具。
- 可以从各种数据源抽取数据,进行数据清洗、转换和加载操作,将数据集成到目标系统中。
特点:
- 提供了可视化的设计界面,用户可以通过拖拽组件的方式来构建数据集成流程。
- 支持多种数据转换功能,如字段映射、数据过滤、聚合计算等。
- 可以进行复杂的任务调度和监控,方便管理数据集成任务。
适用场景:
- 当需要进行复杂的数据清洗和转换操作时,Kettle 是一个很好的选择。
- 适用于企业中需要进行数据仓库建设、数据分析等场景,需要对数据进行全面的 ETL 处理。
四、总结
功能侧重:
- Sqoop 主要专注于 Hadoop 生态系统和关系型数据库之间的数据传输。
- DataX 是一个通用的数据同步工具,支持多种数据源。
- Kettle 则是一个全面的 ETL 工具,提供了丰富的数据转换功能。
架构特点:
- Sqoop 基于 Hadoop 的 MapReduce 框架。
- DataX 采用插件化架构,易于扩展。
- Kettle 提供可视化设计界面,方便用户操作。
适用场景:
根据不同的需求和数据集成场景,可以选择合适的工具。
- 如果主要是在 Hadoop 和关系型数据库之间进行数据迁移,可以选择 Sqoop;
- 如果需要在多种数据源之间进行数据同步,DataX 是一个不错的选择;
- 如果需要进行复杂的数据清洗和转换,Kettle 则更为适合。