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。