Apache Sqoop_1

发布于:2022-10-28 ⋅ 阅读:(582) ⋅ 点赞:(0)

Apache Sqoop系列

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下Sqoop系列
#博学谷IT学习技术支持


`


在这里插入图片描述

前言

sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。
导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;
导出数据:从Hadoop的HDFS、HIVE中导出数据到关系数据库mysql等。
在这里插入图片描述


一、Sqoop工作机制

Sqoop工作机制是将导入或导出命令翻译成mapreduce程序来实现。
在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。
在这里插入图片描述

 #测试你的sqoop是否能查看MySQL中所有的数据库
 sqoop list-databases \
 --connect jdbc:mysql://hadoop01:3306/ \
 --username root \
 --password 123456
  • 全量数据(Full data)

    就是全部数据,所有数据。如对于表来说,就是表中的所有数据。

  • 增量数据(Incremental data)

    就是上次操作之后至今产生的新数据。

  • 数据子集

    也叫做部分数据。整体当中的一部分。

二、Sqoop数据导入至HDFS

1.准备数据

在MYSQL内准备3张表,作为测试数据

create  database userdb default character set utf8 collate utf8_general_ci;
;
use userdb;
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `emp`
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `deg` varchar(100) DEFAULT NULL,
  `salary` int(11) DEFAULT NULL,
  `dept` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of emp
-- ----------------------------
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');

-- ----------------------------
-- Table structure for `emp_add`
-- ----------------------------
DROP TABLE IF EXISTS `emp_add`;
CREATE TABLE `emp_add` (
  `id` int(11) DEFAULT NULL,
  `hno` varchar(100) DEFAULT NULL,
  `street` varchar(100) DEFAULT NULL,
  `city` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of emp_add
-- ----------------------------
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');

-- ----------------------------
-- Table structure for `emp_conn`
-- ----------------------------
DROP TABLE IF EXISTS `emp_conn`;
CREATE TABLE `emp_conn` (
  `id` int(100) DEFAULT NULL,
  `phno` varchar(100) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of emp_conn
-- ----------------------------
INSERT INTO `emp_conn` VALUES ('1201', '2356742', 'gopal@tp.com');
INSERT INTO `emp_conn` VALUES ('1202', '1661663', 'manisha@tp.com');
INSERT INTO `emp_conn` VALUES ('1203', '8887776', 'khalil@ac.com');
INSERT INTO `emp_conn` VALUES ('1204', '9988774', 'prasanth@ac.com');
INSERT INTO `emp_conn` VALUES ('1205', '1231231', 'kranthi@tp.com');

第一张emp表
在这里插入图片描述
第二张emp_add表
在这里插入图片描述
第三张emp_conn表
在这里插入图片描述

2.全量导入MySQL数据到HDFS

全量导入MySQL数据到HDFS

sqoop import \
--connect jdbc:mysql://hadoop01:3306/userdb \
--table emp \
--username root \
--password 123456 \
--target-dir /sqoop/result1 \
--delete-target-dir \
--m 1

#  --table emp  要导入mysql中的userdb数据库的emp表数据
#  --target-dir /sqoop/result1  表示要导入到hdfs的目标路径
#  --delete-target-dir          如果目标目录存在,则删除
#  --m 1                        使用一个Map线程来导入

导入HDFS之后,默认分隔符是逗号

在这里插入图片描述
指定分隔符

sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--table emp \
--username root \
--password 123456 \
--target-dir /sqoop/result2 \
--delete-target-dir \
--fields-terminated-by  '\t' \
--m 1

# --fields-terminated-by '\t'  指定HDFS上文件的分隔符是'\t'

在这里插入图片描述
指定任务并行度(maptask个数)

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


#如果你要指定多个maptask来完成数据的导入,也就是--m参数的值不是1,则必须添加一个参数--split-by
#该参数用来指定你原表的数据如何分配给多个线程来实现导入
#--split-by id  内部原理是获取id的最小值和id的最大值,进行平均划分
 SELECT MIN(`id`), MAX(`id`) FROM `emp`

#maptask1要导入的数据
1201	gopal	manager	50000	TP
1202	manisha	Proof reader	50000	TP


#maptask2要导入的数据
1203	khalil	php dev	30000	AC
1204	prasanth	php dev	30000	AC
1205	kranthi	admin	20000	TP

在这里插入图片描述

在这里插入图片描述

三.Sqoop数据导入至Hive

方式1-先复制mysql的表结构到Hive,然后再导入数据

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

其中:
 --table emp_add为mysql中的数据库userdb中的表。   
 --hive-table emp_add_sp 为hive中新建的表名称。
 复制表结构默认分隔符是'\001'

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

方式2:直接导入数据(建表 + 导入数据)

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

#如果多次导入,则会进行数据追加
#如果要覆盖操作,需要加参数:
 --hive-overwrite
-- 2、使用指定分隔符  '\0'
sqoop import \
--connect jdbc:mysql://192.168.88.80:3306/userdb \
--username root \
--password 123456 \
--table emp_conn \
--hive-import \
--hive-database test \
--fields-terminated-by '\t' \
--m 1 

总结

今天继续和大家分享一下Sqoop系列1,Sqoop工作机制,Sqoop数据导入至HDFS,Sqoop数据导入至Hive。