大数据组件-Apache Sqoop,工作机制,安装配置,全量增量导入到hdfs,hive数仓,导出

版本规划:
jdk 1.8.0_141
zookeeperk

Sqoop适用场景

Sqoop主要解决的问题是:数据在Hadoop生态(HDFS,HBase,hive)数据存储端和RDBMS(mysql)数据来源端之间交互的工具
Sqoop可以简单理解为:SQL到Hadoop和Hadoop到SQL

Sqoop工作机制

在这里插入图片描述

Sqoop安装

sqoop是基于MR的,所以要想安装sqoop必须已经安装完成java和hadoop环境
使用版本:1.4.6
sqoop下载地址
在这里插入图片描述

1. 解压安装sqoop

tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha -C /export/servers
cd /exprot/servers
mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop    //做一下重命名

2. 配置文件修改

cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh  //把env的模板复制一份

使用notepad++连接虚拟机对sqoop-env.sh进行修改

export HADOOP_COMMON_HOME= /export/servers/hadoop-2.7.5
export HADOOP_MAPRED_HOME= /export/servers/hadoop-2.7.5
export HIVE_HOME= /export/servers/apache-hive-2.1.1-bin

在这里插入图片描述

3. 加入mysql的jdbc驱动

上传mysql的jdbc驱动包到sqoop的lib目录下
在这里插入图片描述

4. 配置环境变量

vim /etc/profile
export SQOOP_HOME=/export/servers/sqoop
export PATH=:$SQOOP_HOME/bin:$PATH

在这里插入图片描述不要忘记让修改生效

source /etc/profile

5. 验证启动

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

使用sqoop连接mysql数据库
在这里插入图片描述显示以上信息就算是安装成功了

Sqoop导入

导入:将RDBMS数据->HDFS中

  • 准备一个数据集,用作后面的操作,在 mysql 中创建数据库 userdb,然后执行以下的 sql 脚本:
    创建三张表: emp 雇员表、 emp_add 雇员地址表、emp_conn 雇员联系表。
create table emp (
  id int not null,
  name varchar(20),
  deg varchar(20),
  salary int,
  dept char(10)

)character set utf8;

insert into emp values (1201,"gopal","manager",50000,"TP");
insert into emp values (1202,"manisha","Proof reader",50000,"TP");
insert into emp values (1203,"khalil","php dev",30000,"AC");
insert into emp values (1204,"prasanth","php dev",30000,"AC");
insert into emp values (1205,"kranthi","admin",20000,"TP")


create table emp_add(
  id int,
  hon varchar(20),
  street varchar(20),
  city varchar(20)

)character set utf8;

insert into emp_add values (1201,"288A","vgiri","jublee");
insert into emp_add values (1202,"108I","aoc","sec-bad");
insert into emp_add values (1203,"144Z","pgutta","hyd");
insert into emp_add values (1204,"78B","old city","sec-bad");
insert into emp_add values (1205,"720X","hitec","sec-bad");

create table emp_conn(
  id int,
  phno int,
  email varchar(20)


)character set utf8;

insert into emp_conn values (1201,2356742,"[email protected]");
insert into emp_conn values (1202,1661663,"[email protected]");
insert into emp_conn values (1203,8887776,"[email protected]");
insert into emp_conn values (1204,9988774,"[email protected]");
insert into emp_conn values (1205,1231231,"[email protected]");

1.全量导入mysql表数据到HDFS

  • 全量数据:从o开始到现在的所有数据就叫作全量数据

(1)sqoop命令mysql数据导入hdfs设置

下面的命令用于从 MySQL 数据库服务器中的 emp 表导入 HDFS。

sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--delete-target-dir \   //如果导入的文件路径存在提前帮你删除
--target-dir /sqoopresult \
--table emp --m 1   //表名称  --m 1指定有几个maptesk个数,这里是一行行的读数据,并不涉及聚合操作,所以这里是没有reduce的,

其中–target-dir 用来指定导入的HDFS路径;
mysql jdbc url 请使用 ip 地址。
为了验证在 HDFS 导入的数据,请使用以下命令查看导入的数据也可以使用web页面查看:

hdfs dfs -cat /sqoopresult/part-m-00000

在这里插入图片描述

(2)sqoop导入hdfs数据分隔符设置

在这里插入图片描述

可以看出它会在 HDFS 上默认用逗号,分隔 emp 表的数据和字段。可以通过

--fields-terminated-by '\t'  //指定分隔符。
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult213 \
--fields-terminated-by '\t' \
--table emp --m 1 

在这里插入图片描述

(3)maptest个数设置

设置maptesk为多个,需要指定分隔的字段, 他会首先来有主键按照主键来分,没有主键就要指定字段,指定字段后,先是看一下字段的最大值最小值,来计算下字段的中间区间是多少,然后根据指定的并行度(maptesk个数),进行一个数据的划分

sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult214 \
--fields-terminated-by '\t' \
--split-by id \
--table emp --m 2 

在这里插入图片描述

(4)全量导入数据注意事项

  1. mysql的地址尽量不要使用localhost请使用ip或者host
  2. 如果不指定,导入到hdfs数据默认分隔符为逗号
  3. –fields-terminated-by ‘\t’ 指定具体的分隔符
  4. 如果表的数据比较大,可以并行启动多个maptesk执行导入操作,如果表没有主键,请指定根据那个字段进行切分–split-by id \

2.全量导入mysql表数据到HIVE

(1)方式一:先复制表结构到hive中在导入数据

  1. 将关系型数据的表结构复制到 hive 中
sqoop create-hive-table \
--connect jdbc:mysql://node02:3306/userdb \
--table emp_add \
--username root \
--password 123456 \
--hive-table test.emp_add_sp

其中:
–table emp_add 为 mysql 中的数据库 sqoopdb 中的表。
–hive-table emp_add_sp 为 hive 中新建的表名称。

  1. 从关系数据库导入文件到 hive 中
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--hive-table test.emp_add_sp \
--hive-import \
--m 1

(2)方式二:直接复制表结构带hive中

sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table emp_conn \
--hive-import \
--m 1 \
--hive-database test;

在这里插入图片描述

3.导入数据表的子集

(1)增加where过滤条件

–where 可以指定从关系数据库导入数据时的查询条件。它执行在数据库服务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。

sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add \
--m 1

–target-dir /wherequery 导入到HDFS这个 /wherequery路径下

(2)增加query查询

注意事项:
使用 query sql 语句来进行查找不能加参数–table ;
并且必须要添加 where 条件;
并且 where 条件后面必须带一个$CONDITIONS 这个字符串;
并且这个 sql 语句必须用单引号,不能用双引号;

sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 2

在这里插入图片描述

4.增量导入

所谓的增量数据值的是上次至今中间新增加的数据

--check-column (col)

用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据
进行导入,和关系型数据库中的自增字段及时间戳类似。
注意:这些被指定的列的类型不能使任意字符类型,如 char、varchar 等类
型都是不可以的,要满足自增长不重复,一般都是主键类型.同时-- check-column 可以去指定多个列。

--incremental (mode)  //增量导入模式

append:追加,比如对大于 last-value 指定的值之后的记录进行追加导入。
lastmodified:最后的修改时间,追加 last-value 指定的日期之后的记录

--last-value (value) //指定值

指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值

(1)Append 模式增量导入

append追加:根据数值类型的字段进行追加导入,大于指定的last-value

  1. 首先先执行以下指令将我们之前的数据全量导入HDFS
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--target-dir /appendresult \
--table emp \
--m 1

在这里插入图片描述

  1. 然后我们在mysql的emp表中插入2条新的数据
insert into emp values (1206,"allen","admin","30000","tp");
insert into emp values (1207,"woon","admin","40000","tp");
  1. 执行以下命令实现增量导入
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table emp \
--m 1 \
--target-dir /appendresult \
--incremental append \
--check-column id \
--last-value 1205

在这里插入图片描述

(2)Lastmodified模式增量导入

根据时间戳类型字段进行追加大于等于指定的last-value

1.appen附加模式

  1. 首先创建一个customer表,指定一个时间戳
create table customertest(
  id int,
  name varchar(20),
  last_mod timestamp default current_timestamp on update current_timestamp
)character set utf8; -- 默认是当前世界戳,如果更新数据更新数据的时间戳也为当前时间的
  1. 分别插入以下记录
insert into customertest(id,name) values (1,"neil");
insert into customertest(id,name) values (2,"jack");
insert into customertest(id,name) values (3,"martin");
insert into customertest(id,name) values (4,"tony");
insert into customertest(id,name) values (5,"eric");
  1. 首先我们对mysql的customertest表全量导入到HDFS中
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table customertest \
--target-dir /lastmodifiedresult \
--m 1
  1. 再次插入一条数据进入customertest表中
insert into customertest (id,name) values (6,"james");
  1. 使用incremental方式进行增量导入
sqoop import \
--connect jdbc:mysql://node02:3306/userdb \
--username root \
--password 123456 \
--table customertest \
--target-dir /lastmodified \
--check-column last_mod \
--incremental lastmodified \
--last-value "2020-05-12 13:55:01" \
--m 1 \
--append
  • 特别注意:
    lastmodified模式去处理增量数据时,会将大于等于last-value值得数据当做增量插入,区别于append的大于,他是大于等于,这点一定要注意

2.merge-key合并模式

在这里插入代码片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章