转载文章 https://www.cnblogs.com/zdy0521/p/11850315.html 张先森
Sqoop工具
1…协助RDBMS与Hadoop之间进行高效的大数据交流
把关系型数据库的数据导入Hadoop与其相关的系统(HBASE,HIVE)
同时也可以把数据从Hadoop系统抽取并导出到关系型数据库中。
Sqoop中一大亮点是可以通过Hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS
Sqoop就是一个转换工具,用于在关系型数据库与HDFS之间进行数据转换
项目使用场景:
1.业务场景存放在关系型数据库中,如果数据达到一定规模后,需要对其进行分析或统计,单纯使用关系型数据库可能会有瓶颈,这时可将数据从业务数据库导入import到Hadoop平台进行离线分析
2.对大规模的数据在Hadoop平台上分析后,肯恩恶搞需要将结果同步到关系型数据库中作为业务辅助数据,这时候需要将Hadoop平台分析后的数据导出export到关系型数据库。
一、sqoop与mysql
1.列出musql数据库中的所有数据库
sqoop list-databases -connect jdbc:mysql://hdp-qm-01:3306\
-username hadoop -password hadoop
2.列出数据库hivedb1711中的所有数据表
sqoop list-tables -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop
3.通过sqoop执行SQL语句
sqoop eval -connect jdbc:mysql://hdp-qm-01:3306/jivedb1711\
-username hadoop -password hadoop -query ‘select * from EMP’
二,sqoop与hdfs(mysql数据库与hdfs)
1.将hivedb1711.EMP表中的数据导入HDFS的/sqfs目录下
sqoop import -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop -table EMP -m 1 -target-dir /sqfs/emp1
解释
(1)-table EMP表示导出的表
(2)-m 1 表示使用一个maptask操作
(3)-target-dir /sqfs/emp1数据导到/sqfs/emp1位置
注意:执行过程走MapReduce,所以要保证每一个集群节点能访问hivedb1711数据库
grant all privileges on hivedb1711.* to ‘hadoop@’%'identified by ‘hadoop’;
使用SQL语句过滤满足条件的数据,将其导入hdfs系统(注意:and $CONDITIONS)
sqoop import -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711 \
-username hadoop -password hadoop -query ‘select * from EMP where emgr=10 and $CONDITIONS’\ -m 2 --split-by eNo -target-dir /sqfs/emp3;
没有过滤,使用SQL语句导入所有数据到hdfs(注意:where$CONDITION)
sqoop import -connect jdbc:mysql://hdp-qm-01:3306/jivedb1711\
-username hadoop -password hadoop -query ‘select * from EMP where $CONDITIONS’\
-m 2 --split-by eNo -target-dir /sqfs/emp4;
注意:这种方式和1里面的操作是一个效果
2.将HDFS上/sqfs目录下的数据导入hivedb1711.emp2表中
(1).hivedb1711.emp2表结构必须存在
create table if not exists emp2(
eno int(25)not null primary key,
ename varchar(45),
ejob varchar(45),
emgr int(25),
ehiredate date,
esal int(45),
ecomm int(45),
dp_no int(25));
(2)导出数据到emp2表的命令
sqoop export -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop -table emp2\
-m 1 -export-dir /sqfs/emp3
三,sqoop与hive
1.将关系型数据的表emp表结构复制到hive中
sqoop create-hive-table -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop -table emp2 -hive-table demo_log.emp\
-fields-terminated-by “|” -lines-terminated-by “\n”
2.将关系型数据库中的emp表的数据导入文件到hive1表中
sqoop inport -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop -table emp2 -hive-table demo_log.emp -m 3\
-fields-terminated-by “|” -hive-import
3.将hive中的表demo_log.emp数据导入到mysql数据库emp3表中
(1)先在mysql数据库中简历表的结构
create table if not exists emp3(
eno int(25) not null primary key,
ename varchar(45),
emgr int(25),
ehiredate date,
esal int(45),
ecomm int(45),
dp_no int(25));
(2)导出数据到emp3
sqoop export -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop -table emp3\
-export-dir /user/hive/warehouse/demo_log.db/emp/* \
-input-fields-terminated-by ‘|’
说明:-input-fields-terminated-by ‘|’ 分隔符是根据export-dir 指定目录下文件内容的分隔符来确定的
四,sqoop与Hbase
1.mysql中的EMP表中的数据导入数据到HBASE的qm170701:mysql_emp表中
(1)先在hbase表中创建HBASE表:
create ‘qm170701:mysql_emp’,‘cf’
(2)导入数据到Hbase的全貌70701:mysql_emp表
sqoop import -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop\
-table EMP\
-hbase-table qm170701:mysql_emp\
-column-family ‘cf’\
-hbase-row-key eno -m 1
2.将mysql数据库emp表不同列的数据添加到emp3表中不同列族中
(1)先在hbase表中创建hbase表:
create ‘qm170701:mysql_emp2’,‘cf1’,‘cf2’
(2)导入数据到Hbase的qm170701:mysql_emp2表
A.先将emp表的eName,eJob列中的数据到cf1列族中
sqoop import -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop\
-table EMP\
-hbase-table qm170701:mysql_emp2\
-column-family ‘cf1’\
-hbase-row-key eno -m 1 -columns eno,ename,ejob
B.将EMP表的emgr,ehiredate,esal,ecomm,dp_no列中的数据到cf2列族中
sqoop import -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711\
-username hadoop -password hadoop\
-table EMP
-hbase-table qm170701:mysql_emp2\
-column-family ‘cf2’\
-hbase-row-key eno -m 1 -colimns eno,emgr,ehiredate,esal,ecomm,dp_no
例子:
各个部门中工资大于1500员工数及部门名称
sqoop import -connect jdbc:mysql://hdp-qm-01:3306/hivedb1711 \
-username hadoop -password hadoop \
-query ‘select d1.dp_name as dname,e2.nums as nums from(select e1.dp_no,count(e1.eno) as nums from EMP e1 where e1.esal>1500 group by dp_no)e2 left join dept d1 on d1.dp_no = e2.dp_no where $CONDITIONS’ \
-m 1 --split-by e2.dname -target-dir /sqfs/emp122