sqoop概述
简介
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
数据导入
导入工具从RDBMS向HDFS导入单独的表。表中的每一行都被视为HDFS中的记录。所有记录都以文本文件的形式存储在文本文件中或作为Avro和Sequence文件中的二进制数据存储。
数据导出
导出工具将一组文件从HDFS导出回RDBMS。给Sqoop输入的文件包含记录,这些记录在表中被称为行。这些被读取并解析成一组记录并用用户指定的分隔符分隔。
sqoop安装
Sqoop是Hadoop的子项目,因此需要先安装Java以及hadoop
1.sqoop下载:http://archive.apache.org/dist/sqoop/
2.安装包解压到指定目录。
3.修改配置文件:
$ cd $SQOOP_HOME/conf
$ mv sqoop-env-template.sh sqoop-env.sh
打开sqoop-env.sh并编辑下面几行:
export HADOOP_COMMON_HOME=/usr/local/apps/hadoop-2.7.7
export HADOOP_MAPRED_HOME=/usr/local/apps/hadoop-2.7.7
export HIVE_HOME=/home/hadoop/apps/hive-2.3.7
4.加入mysql的jdbc驱动包
驱动包下载参考:https://blog.csdn.net/weixin_41804049/article/details/87719574
然后把安装包复制到**$SQOOP_HOME/lib/**目录下。
5.添加环境变量
vi /etc/profile
添加以下内容:
export SQOOP_HOME=/usr/local/apps/sqoop-1.4.4
export PATH = $SQOOP_HOME/bin
6.验证启动
sqoop-version
到此,整个sqoop安装完成。
sqoop数据导入
导入单个表从关系数据库到HDFS。表中的每一行被视为HDFS的记录。所有记录都存储为文本文件的文本数据。
1.语法
下面的语法用于将数据导入HDFS:
2.实例
在mysql中有一个库userdb中三个表:emp, emp_add和emp_conn
2.1导入数据到hdfs:
sqoop-import \
--connect jdbc:mysql://slave1:3306/test \
--username root \
--password root \
--table emp \
--m 1
为了验证在HDFS导入的数据,请使用以下命令查看导入的数据:
2.2导入到HDFS指定目录
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
以下是指定目标目录选项的Sqoop导入命令的语法:
下面的命令是用来导入emp_add表数据到’/queryresult’目录:
sqoop-import \
--connect jdbc:mysql://slave1:3306/test \
--username root \
--password root \
--target-dir /queryresult \指定目录
--fields-terminated-by ‘\001’ \指定分隔符
--table emp
--split-by id
--m 1
如果设置了 --m 1,则意味着只会启动一个maptask执行数据导入;
如果不设置 --m 1,则默认为启动4个map task执行数据导入,则需要指定一个列来作为划分map task任务的依据。
3.导入关系表到HIVE
sqoop-import
--connect jdbc:mysql://slave1:3306/test
--username root
--password root
--table emp
--hive-import \增加导入hive声明
--split-by id
--m 1
4.导入表数据子集
我们可以使用Sqoop导入工具导入表的"where"子句的一个子集。它执行在各自的数据库服务器相应的SQL查询,并将结果存储在HDFS的目标目录。
下面的命令用来导入emp_add表数据的子集。子集查询检索员工ID和地址,居住城市为(sec-bad):
sqoop-import \
--connect jdbc:mysql://slave1:3306/test \
--username root \
--password root \
--where "city ='sec-bad'" \子集条件声明
--target-dir /wherequery \
--table emp_add \
--m 1
Sqoop数据导出
将数据从HDFS文件导出到关系型数据库
语法:
示例:
数据是在HDFS 中“EMP/”目录的emp_data文件中。
1.首先需要手动创建mysql中的目标表
$ mysql
mysql> USE db;
mysql> CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(10));
2.然后执行导出命令
sqoop-export \
--connect jdbc:mysql://slave1:3306/test \
--username root \
--password root \
--table employee \
--export-dir /user/hadoop/emp/
3.验证表mysql命令行