前提条件:
安装好hadoop2.7.3(Linux系统下)
安装好sqoop(Linux系统下),参考:Sqoop安装配置
安装好MySQL(Windows系统下或者Linux系统下)
安装好Hive(Linux系统下)参考:Hive安装配置
安装好HBase(Linux系统下)参考:HBase1.3.1安装配置 HBase常用shell命令
题目:
一.MySQL与HDFS数据互导(相互导入导出)
二.MySQL与Hive数据互导
三.MySQL与HBase数据互导
实验步骤:
数据准备
进入mysql创建一个名为ua1的数据库
mysql> create database ua1;
使用ua1数据库
mysql> use ua1;
准备mysql数据:EMP表和DEPT表
-- 创建EMP表
CREATE TABLE IF NOT EXISTS `EMP`(
`empno` INT,
`ename` VARCHAR(10),
`job` VARCHAR(9),
`mgr` int,
`hiredate` date,
`sal` int,
`comm` int,
`deptno` int,
PRIMARY KEY ( `empno` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据到EMP表
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-2-20', 1600, 300, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-2-22', 1250, 500, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-4-2', 2975, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-9-28', 1250, 1400, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-5-1', 2850, NULL, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-6-9', 2450, NULL, 10);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-4-19', 3000, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-9-8', 1500, NULL, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-5-23', 1100, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-3', 950, NULL, 30);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-3', 3000, NULL, 20);
INSERT INTO `EMP` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-1-23', 1300, NULL, 10);
-- 创建DEPT表
CREATE TABLE IF NOT EXISTS `DEPT`(
`deptno` INT,
`dname` VARCHAR(14),
`loc` VARCHAR(13)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据到DEPT表
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO `DEPT` (`deptno`, `dname`, `loc`) VALUES (40, 'OPERATIONS', 'BOSTON');
查看EMP表和DEPT表
mysql> select * from EMP;
mysql> select * from DEPT;
一.MySQL与HDFS数据互导
1. MySQL ---导入到--> HDFS
sqoop import --connect jdbc:mysql://10.90.26.101:3306/ua1 --username root -P --table EMP -target-dir /user/ua02/zhangsan -m 1
注意:
10.90.26.101为登录的IP, 注意修改!
/user/ua02/zhangsan 其中ua02为用户名,注意修改,zhangsan为目录名,可自定义。
回车执行后需要输入mysql数据库密码
打开新的终端,查看HDFS数据
$ hdfs dfs -ls /user/ua02/zhangsan
ua02为用户名,注意按实际修改
$ hdfs dfs -cat /user/ua02/zhangsan/part-m-00000
2. HDFS---导出到--> MySQL
在MySQL新建一张表:EMP_HDFS_zhangsan
create table EMP_HDFS_zhangsan like EMP;
执行导出语句
sqoop export --connect jdbc:mysql://10.90.26.101:3306/ua1 --table EMP_HDFS_zhangsan --export-dir /user/ua02/zhangsan/part-m-00000 --username ua1 -P -m 1
注意:
10.90.26.101为登录的IP, 注意修改!
/user/ua02/zhangsan 其中ua02为用户名,zhangsan为原来导入到HDFS的目录,注意修改。
回车执行后需要输入mysql数据库密码
mysql中查看数据是否导入成功
mysql> select * from EMP_HDFS_zhangsan;
二.MySQL与Hive数据互导
1. MySQL---导入到-->Hive
执行导入到Hive命令
$ sqoop import --connect jdbc:mysql://10.90.26.101:3306/ua1 --username root --password 123456 --table EMP --fields-terminated-by '\t' --num-mappers 1 --hive-database default --hive-import --hive-table hive_zhangsan
注意:
ua1为mysql的数据库名
hive_zhangsan为导入到Hive的表名,为了不冲突,建议取带有学号的表名,例如:hive_zhangsan001 ,Hive的表名对大小写不敏感。
若出现如下报错:
ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
解决办法:点这里解决sqoop报错问题
进入hive环境
$ hive
hive> use default;
查看hive的表
hive> show tables;
找到导入的表名:HIVE_zhangsan
查看hive_zhangsan表内容:
select * from hive_zhangsan;
2. Hive---导出到--> MySQL
在mysql新建一张EMP_from_hive001表,用于接收数据
mysql> create table EMP_from_hive001 like EMP;
查看hive表存储路径
hive> show create table hive_zhangsan;
hive_zhangsan为hibe表名,注意修改。
复制出hive表存储路径:
/apps/hive/warehouse/hive_zhangsan
执行导出语句:
sqoop export --connect jdbc:mysql://10.90.26.101:3306/ua1 --username ua1 -P --table EMP_from_hive001 --export-dir /apps/hive/warehouse/hive_zhangsan/part-m-00000 --input-fields-terminated-by '\t'
查看MySQL表内容:
三.MySQL与HBase数据互导
1. MySQL ---导入到--> HBase
进入hbase shell环境
$ hbase shell
在hbase中创建一个空表
查看表
执行导入语句
sqoop import --connect jdbc:mysql://10.90.26.101:3306/ua1 --username ua1 --password ua1 --table EMP --hbase-table EMP_HBASE --column-family EMPINFO --hbase-row-key empno
查看EMP_HBASE表内容:
scan 'EMP_HBASE'
2. HBase---导出到--> MySQL
目前没有命令可以直接将 hbase 中的数据导出到 mysql。解决思路hbase-->HDFS-->mysql或hbase-->hive-->mysql。
完成!enjoy it!