当前位置: 首页 > news >正文

【赵渝强老师】大数据交换引擎Sqoop

1

​Sqoop是SQL To Hadoop的简称,它是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(Oracle、MySQL等)间进行数据的传递。通过使用Sqoop可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop是基于MapReduce完成数据的交换,因此在使用Sqoop之前需要部署Hadoop环境;另一方面,由于Sqoop交换的是关系型数据库中的数据,因此底层需要JDBC驱动的支持。

Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。

image.png
点击这里查看视频讲解:【赵渝强老师】大数据交换引擎Sqoop

一、 准备Sqoop环境

Apache Sqoop的安装部署比较简单,直接解压后就可以使用。由于Sqoop底层需要JDBC的支持。因此需要将对应关系型数据库的JDBC Driver复制到Sqoop的lib目录下。这里将在bigdata111的虚拟主机上来完成安装和部署,并采集之前部署好的MySQL数据库中的数据。下面通过具体的步骤来演示Sqoop的部署。

(1)将Sqoop的安装包解压到/root/training目录。

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ~/training/

(2)将Sqoop的目录进行重命名。

cd ~/training/
mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop/

(3)将MySQL的JDBC Driver复制到Sqoop的lib目录下。

cp mysql-connector-java-5.1.43-bin.jar ~/training/sqoop/lib/

(4)编辑文件/root/.bash_profile设置Sqoop相应的环境变量。

SQOOP_HOME=/root/training/sqoop
export SQOOP_HOMEPATH=$SQOOP_HOME/bin:$PATH
export PATH

(5)生效环境变量。

source /root/.bash_profile

(6)启动Hadoop环境。

start-all.sh

(7)登录MySQL数据库执行下面的脚本建立测试数据。

create database if not exists demo;
use demo;create table emp 
(empno int primary key,
ename varchar(10),
job varchar(10),
mgr int,
hiredate varchar(10),
sal int,
comm int,
deptno int);create table dept
(deptno int primary key,
dname varchar(10),
loc varchar(10)
);insert into emp values(7369,'SMITH','CLERK',7902,'1980/12/17',800,0,20);
insert into emp values(7499,'ALLEN','SALESMAN',7698,'1981/2/20',1600,300,30);
insert into emp values(7521,'WARD','SALESMAN',7698,'1981/2/22',1250,500,30);
insert into emp values(7566,'JONES','MANAGER',7839,'1981/4/2',2975,0,20);
insert into emp values(7654,'MARTIN','SALESMAN',7698,'1981/9/28',1250,1400,30);
insert into emp values(7698,'BLAKE','MANAGER',7839,'1981/5/1',2850,0,30);
insert into emp values(7782,'CLARK','MANAGER',7839,'1981/6/9',2450,0,10);
insert into emp values(7788,'SCOTT','ANALYST',7566,'1987/4/19',3000,0,20);
insert into emp values(7839,'KING','PRESIDENT',-1,'1981/11/17',5000,0,10);
insert into emp values(7844,'TURNER','SALESMAN',7698,'1981/9/8',1500,0,30);
insert into emp values(7876,'ADAMS','CLERK',7788,'1987/5/23',1100,0,20);
insert into emp values(7900,'JAMES','CLERK',7698,'1981/12/3',950,0,30);
insert into emp values(7902,'FORD','ANALYST',7566,'1981/12/3',3000,0,20);
insert into emp values(7934,'MILLER','CLERK',7782,'1982/1/23',1300,0,10);insert into dept values(10,'ACCOUNTING','NEW YORK');
insert into dept values(20,'RESEARCH','DALLAS');
insert into dept values(30,'SALES','CHICAGO');
insert into dept values(40,'OPERATIONS','BOSTON');

二、 使用Sqoop完成数据交换

下面将通过具体的操作步骤来演示如何使用Sqoop完成与关系型数据库MySQL的数据交换。

(1)使用Sqoop执行一个简单的查询。这里将查询10号部门的员工姓名、职位、薪水和部门号,结果如下图所示。

sqoop eval --connect jdbc:mysql://localhost:3306/demo?useSSL=false \
--username root --password Welcome_1 --query \
"select ename,job,sal,deptno from emp where deptno=10"

2

(2)根据MySQL数据库中的表结构生成对应的Java Class。

sqoop codegen --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1 --table emp# 输出的日志如下所示:
2021-04-22 14:34:42,491 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /root/training/hadoop-3.1.2
Note: /tmp/sqoop-root/compile/2abad54ace6665327b12e83a02b14a8f/emp.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
2021-04-22 14:34:45,173 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-root/compile/2abad54ace6665327b12e83a02b14a8f/emp.jar# 执行成功后,会自动将/tmp目录下生成的emp.java拷贝至当前目录,部分代码如下:
public class emp extends SqoopRecord  implements DBWritable, Writable {private final int PROTOCOL_VERSION = 3;public int getClassFormatVersion() { return PROTOCOL_VERSION; }public static interface FieldSetterCommand {void setField(Object value);  }  protected ResultSet __cur_result_set;private Map<String, FieldSetterCommand> setters = new HashMap<String, FieldSetterCommand>();private void init0() {setters.put("empno", new FieldSetterCommand() {@Overridepublic void setField(Object value) {emp.this.empno = (Integer)value;}});setters.put("ename", new FieldSetterCommand() {@Override# 这里可以看到emp类实现了Writable接口。按照开发MapReduce程序的要求,
# 该类可以作为MapReduce的Key或者Value。

(3)根据MySQL数据库中的表结构生成对应的Hive表结构。命令执行完成后,查看Hive中的表结构信息如下图所示。

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*sqoop create-hive-table --connect jdbc:mysql://localhost:3306/demo  \
--username root --password Welcome_1 --table emp --hive-table emphive

3

(4)将MySQL数据库中的emp表导入到HDFS。命令执行完成后,查看HDFS目录的内容,如下图所示。

sqoop import --connect jdbc:mysql://localhost:3306/demo  \
--username root --password Welcome_1 --table emp --target-dir /myempdata

4

(5)将HDFS的数据导出到MySQL数据库中。命令执行完成后,在MySQL中验证数据是否导入如下图所示。

# 先在MySQL中创建对应的表
create table mynewemp like emp;# 执行导入
sqoop export --connect jdbc:mysql://localhost:3306/demo  \
--username root --password Welcome_1 \
--table mynewemp --export-dir /myempdata

5

(6)将MySQL数据库中的所有表导入到HDFS。执行完成后默认将导入HDFS的/user/root目录,如下图所示。

sqoop import-all-tables --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1

6

(7)列出MySQL的所有数据库。命令执行完成后,如下图所示。

sqoop list-databases --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1

7

(8)列出MySQL数据库中所有的表,执行结果如下图所示。

sqoop list-tables --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1

8

(9)将MySQL表的数据导入HBase。

#进入HBase Shell创建表
create 'emp','empinfo'#执行导入
sqoop import --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1 --table emp \
--columns empno,ename,sal,deptno \
--hbase-table emp --hbase-row-key empno --column-family empinfo# Sqoop导入数据到HBase时,HBase的版本不能太高,建议使用HBase 1.3.6。
http://www.gsyq.cn/news/108195.html

相关文章:

  • 17、网络服务与应用:比特币汇率查询、邮件获取与文本翻译
  • 如何快速配置Mesop Select组件默认值:新手开发者的完整指南
  • 3小时精通POCO C++库:从零开始的跨平台网络编程实战
  • palera1n越狱终极指南:从零开始解锁iOS设备完整教程
  • 深入掌握Flutter网络请求:Dio与Provider架构完美融合实践
  • Z-Image: An Efficient Image Generation Foundation Model with Single-Stream Diffusion Transformer
  • Wechaty v1.20.2终极指南:5大RPA功能让聊天机器人开发效率飙升300%
  • 为什么Langchain-Chatchat成为本地知识库问答标杆?
  • 解锁PS3全部潜能:webMAN MOD终极指南,打造完美游戏娱乐中心
  • 现代化存储系统架构设计与优化策略完整指南
  • 开源vs商业大模型之争:Anything-LLM能否替代ChatGPT?
  • 3步搞定Hadoop在Kubernetes的存储配置:PVC与StorageClass实战指南
  • DSU-Sideloader:安卓双系统体验的革命性突破
  • 基于Transformer的嵌入模型如何增强Anything-LLM的搜索精度?
  • B站广告一键跳过神器:BilibiliSponsorBlock完全使用指南
  • Typst数学公式完美对齐指南:告别错位困扰
  • 终极CompreFace人脸识别部署指南:从零到生产的完整解决方案
  • CloudStream智能文件管理:告别杂乱无章的媒体库
  • Linly-Talker与Hugging Face模型生态的兼容性测试
  • C语言HTML5解析终极指南:gumbo-parser完整使用手册
  • ExoPlayer状态恢复:如何让视频播放器记住你的“续播点“?
  • FreeCAD Python自动化脚本终极指南:从零到精通
  • 秒开体验:SmartTube视频缩略图加载与缓存优化实战
  • Auto-Subtitle终极教程:3步为视频添加智能字幕
  • LangFlow拖拽式界面让AI工作流开发变得如此简单
  • 构建专属AI客服系统——基于Anything-LLM的智能问答架构设计
  • 前端剪贴板革命:告别Flash,用clipboard.js实现优雅复制
  • ComfyUI与Golang后端服务集成:高性能接口支撑
  • SmartTube视频缩略图优化:3大策略让加载速度提升5倍
  • 告别多线程调试困境:5个技巧掌握VS Code的Worker_threads调试实战