【赵渝强老师】大数据交换引擎Sqoop
Sqoop是SQL To Hadoop的简称,它是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(Oracle、MySQL等)间进行数据的传递。通过使用Sqoop可以将一个关系型数据库中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。Sqoop是基于MapReduce完成数据的交换,因此在使用Sqoop之前需要部署Hadoop环境;另一方面,由于Sqoop交换的是关系型数据库中的数据,因此底层需要JDBC驱动的支持。
Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
视频讲解如下 |
---|
【赵渝强老师】大数据交换引擎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)根据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
(4)将MySQL数据库中的emp表导入到HDFS。命令执行完成后,查看HDFS目录的内容,如下图所示。
sqoop import --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1 --table emp --target-dir /myempdata
(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
(6)将MySQL数据库中的所有表导入到HDFS。执行完成后默认将导入HDFS的/user/root目录,如下图所示。
sqoop import-all-tables --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1
(7)列出MySQL的所有数据库。命令执行完成后,如下图所示。
sqoop list-databases --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1
(8)列出MySQL数据库中所有的表,执行结果如下图所示。
sqoop list-tables --connect jdbc:mysql://localhost:3306/demo \
--username root --password Welcome_1
(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。