黑马程序员技术交流社区

标题: Sqoop总结和踩坑 [打印本页]

作者: 西早boy    时间: 2019-10-21 18:27
标题: Sqoop总结和踩坑
Sqoop安装环境Centos7.6 + Hadoop 3.2.0 + Hive3 + sqoop-1.4.7.bin__hadoop-2.6.0
【sqoop-部署】快速入门(安装与使用)
Sqoop架构以及应用介绍
Sqoop架构介绍 Sqoop在业务当中的实际地位 一个流程图介绍Hadoop业务的开发流程以及Sqoop在业务当中的实际地位。
如上图所示:在实际的业务当中,我们首先对原始数据集通过MapReduce进行数据清洗,然后将清洗后的数据存入到Hbase数据库中,而后通过数据仓库Hive对Hbase中的数据进行统计与分析,分析之后将分析结果存入到Hive表中,然后通过Sqoop这个工具将我们的数据挖掘结果导入到MySql数据库中,最后通过Web将结果展示给客户。
Sqoop的概念     正如Sqoop的名字所示:Sqoop是一个用来将关系型数据库和Hadoop中的数据进行相互转移的工具,
可以将一个关系型数据库(例如Mysql、Oracle)中的数据导入到Hadoop(例如HDFS、Hive、Hbase)中,
也可以将Hadoop(例如HDFS、Hive、Hbase)中的数据导入到关系型数据库(例如Mysql、Oracle)中。#(例子1)【将mysql中的hive数据库中的consumer表通过sqoop导入到HDFS中】
#建表
mysql>create table consumer(
id int unsigned NOT NULL AUTO_INCREMENT,
name varchar(32),
sex varchar(32),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
#插入数据
insert into consumer values(null,'xiaoming迷宫','man');
insert into consumer values(null,'leyan','man');
insert into consumer values(null,'theShy','man');
insert into consumer values(null,'theshygirlfriend','woman');

#开始sqoop导入
sqoop import --connect jdbc:mysql://node1:3306/hive --table  consumer --username root --password  root123456 --target-dir /sqoopout/  --fields-terminated-by '\t'  -m 1;
数据
#user.txt
字段  属性  备注  
uname   varchar 用户名
vnum    int 视频数
fnum    int 朋友数
mysql>create database sqoop;
mysql>use sqoop;
mysql>create table user(
uname varchar(32),
vnum  varchar(32),
fnum  varchar(100)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
hdfs dfs -put user.txt  hdfs://node1:9000/input/
sqoop export \
--connect 'jdbc:mysql://node1:3306/sqoop' \
--username 'root' \
--password 'root123456' \
--table 'user' \
--export-dir '/input/user.txt' \
--columns 'uname,vnum,fnum' \
--mapreduce-job-name 'hdfs to mysql' \
--input-fields-terminated-by '\t' \
--input-lines-terminated-by '\n';
抽取Mysql数据到Hive#---(案例1)---
#需求: 将mysql表consumer中的数据导入hive的consumer_hive表,hive的consumer表不存在。
sqoop import --connect jdbc:mysql://node1:3306/hive --username root --password root123456 --table consumer  --hive-table hive.mysql_to_hive_consumer --hive-import -m 1 --delete-target-dir ;

#mysql的数据
mysql> select * from consumer;
+----+------------------+-------+
| id | name             | sex   |
+----+------------------+-------+
| 20 | xiaoming迷宫     | man   |
| 21 | leyan            | man   |
| 22 | theShy           | man   |
| 23 | theshygirlfriend | woman |
+----+------------------+-------+
#导入结果
jdbc:hive2://node1:10000> select * from mysql_to_hive_consumer;
+----------------------------+------------------------------+-----------------------------+
| mysql_to_hive_consumer.id  | mysql_to_hive_consumer.name  | mysql_to_hive_consumer.sex  |
+----------------------------+------------------------------+-----------------------------+
| 20                         | xiaoming迷宫                 | man                         |
| 21                         | leyan                        | man                         |
| 22                         | theShy                       | man                         |
| 23                         | theshygirlfriend             | woman                       |
+----------------------------+------------------------------+-----------------------------+
#---(案例2)---
#需求: 在(案例1)的基础上,分别进行overwrite(覆盖)导入和into(直接加入)导入。
into: 命令同(案例1)
overwrite:
    sqoop import --connect jdbc:mysql://node1:3306/hive --username root --password root123456 --table consumer --hive-table hive.mysql_to_hive_consumer --hive-import -m 1 --hive-overwrite;
   
#修改mysql
mysql> update consumer set sex='woman,man' where id=23;
mysql> update consumer set sex='man,workman' where id=22;
mysql> update consumer set sex='man,workman,iconman' where id=21;
mysql> select * from consumer;
+----+------------------+---------------------+
| id | name             | sex                 |
+----+------------------+---------------------+
| 20 | xiaoming迷宫     | man                 |
| 21 | leyan            | man,workman,iconman |
| 22 | theShy           | man,workman         |
| 23 | theshygirlfriend | woman,man           |
+----+------------------+---------------------+
#原来的hive表
+----------------------------+------------------------------+-----------------------------+
| mysql_to_hive_consumer.id  | mysql_to_hive_consumer.name  | mysql_to_hive_consumer.sex  |
+----------------------------+------------------------------+-----------------------------+
| 20                         | xiaoming迷宫                  | man                         |
| 21                         | leyan                        | man                         |
| 22                         | theShy                       | man                         |
| 23                         | theshygirlfriend             | woman                       |
+----------------------------+------------------------------+-----------------------------+
#执行覆盖语句后的hive表
jdbc:hive2://node1:10000> select * from mysql_to_hive_consumer;
+----------------------------+------------------------------+-----------------------------+
| mysql_to_hive_consumer.id  | mysql_to_hive_consumer.name  | mysql_to_hive_consumer.sex  |
+----------------------------+------------------------------+-----------------------------+
| 20                         | xiaoming迷宫                  | man                         |
| 21                         | leyan                        | man,workman,iconman         |
| 22                         | theShy                       | man,workman                 |
| 23                         | theshygirlfriend             | woman,man                   |
+----------------------------+------------------------------+-----------------------------+
#---(案例3)---
#需求: 在(案例2)的基础上,通过增加mysql的consumer表数据,增量导入到hive表中。

#增加mysql的consumer表数据
insert into consumer values(null,'世纪大道东','man');
insert into consumer values(null,'皇后大道','woman');
insert into consumer values(null,'sky','man');
insert into consumer values(null,'OhYesYes','woman');
mysql> select * from consumer;
+----+------------------+---------------------+
| id | name             | sex                 |
+----+------------------+---------------------+
| 20 | xiaoming迷宫     | man                 |
| 21 | leyan            | man,workman,iconman |
| 22 | theShy           | man,workman         |
| 23 | theshygirlfriend | woman,man           |
| 24 | 世纪大道东        | man                 |
| 25 | 皇后大道          | woman               |
| 26 | sky              | man                 |
| 27 | OhYesYes         | woman               |
+----+------------------+---------------------+
#hive增量插入前的数据
+----------------------------+------------------------------+-----------------------------+
| mysql_to_hive_consumer.id  | mysql_to_hive_consumer.name  | mysql_to_hive_consumer.sex  |
+----------------------------+------------------------------+-----------------------------+
| 20                         | xiaoming迷宫                  | man                         |
| 21                         | leyan                        | man,workman,iconman         |
| 22                         | theShy                       | man,workman                 |
| 23                         | theshygirlfriend             | woman,man                   |
+----------------------------+------------------------------+-----------------------------+

#执行增量导入语句
sqoop import --connect jdbc:mysql://node1:3306/hive --username root --password root123456 --table consumer --where "id>23" --hive-table hive.mysql_to_hive_consumer --hive-import -m 1;

#执行结果
jdbc:hive2://node1:10000> select * from mysql_to_hive_consumer;
+----------------------------+------------------------------+-----------------------------+
| mysql_to_hive_consumer.id  | mysql_to_hive_consumer.name  | mysql_to_hive_consumer.sex  |
+----------------------------+------------------------------+-----------------------------+
| 20                         | xiaoming迷宫                  | man                         |
| 21                         | leyan                        | man,workman,iconman         |
| 22                         | theShy                       | man,workman                 |
| 23                         | theshygirlfriend             | woman,man                   |
| 24                         | 世纪大道东                    | man                         |
| 25                         | 皇后大道                      | woman                       |
| 26                         | sky                          | man                         |
| 27                         | OhYesYes                     | woman                       |
+----------------------------+------------------------------+-----------------------------+#---(案例4)---
#需求: 将consumer表中的数据导出到使用','分割字段的hive表(hivetest2)中。

#consumer表的数据
mysql> select * from consumer;
+----+------------------+---------------------+
| id | name             | sex                 |
+----+------------------+---------------------+
| 20 | xiaoming迷宫     | man                 |
| 21 | leyan            | man,workman,iconman |
| 22 | theShy           | man,workman         |
| 23 | theshygirlfriend | woman,man           |
| 24 | 世纪大道东        | man                 |
| 25 | 皇后大道          | woman               |
| 26 | sky              | man                 |
| 27 | OhYesYes         | woman               |
+----+------------------+---------------------+

#创建hivetest2表
jdbc:hive2://node1:10000>create table hivetest2(id int,name string,sex string) row format delimited fields terminated by ',';

#执行导入数据命令
sqoop import --connect jdbc:mysql://node1:3306/hive --username root --password root123456 --table consumer --hive-table hive.hivetest2 --hive-import -m 1 --fields-terminated-by ",";

#执行结果
jdbc:hive2://node1:10000> select * from hivetest2;
+---------------+-------------------+----------------+
| hivetest2.id  |  hivetest2.name   | hivetest2.sex  |
+---------------+-------------------+----------------+
| 20            | xiaoming迷宫       | man            |
| 21            | leyan             | man            |
| 22            | theShy            | man            |
| 23            | theshygirlfriend  | woman          |
| 24            | 世纪大道东         | man            |
| 25            | 皇后大道           | woman          |
| 26            | sky               | man            |
| 27            | OhYesYes          | woman          |
+---------------+-------------------+----------------+
#---(案例5)---
#需求: 在案例4的基础上,把mysql的数据导入数据到hdfs中。

#consumer表的数据
mysql> select * from consumer;
+----+------------------+---------------------+
| id | name             | sex                 |
+----+------------------+---------------------+
| 20 | xiaoming迷宫     | man                 |
| 21 | leyan            | man,workman,iconman |
| 22 | theShy           | man,workman         |
| 23 | theshygirlfriend | woman,man           |
| 24 | 世纪大道东        | man                 |
| 25 | 皇后大道          | woman               |
| 26 | sky              | man                 |
| 27 | OhYesYes         | woman               |
+----+------------------+---------------------+

#执行导入命令
sqoop import --connect jdbc:mysql://node1:3306/hive --username root --password root123456 --table consumer --target-dir /sqooptxt/consumer_mysql.txt -m 1;