sqoop导入导出数据

导入:MySQL==> HDFS、Hive、Hbase

导出:HDFS、Hive、Hbase ==>  MySQL

一、安装,配置环境

1、下载压缩包

2、配置文件sqoop.env.sh

3、验证:bin/sqoop  help

4、拷贝jdbc驱动到sqoop/lib

5、连接MySQL

[root@master sqoop-1.4.7]# ./bin/sqoop list-databases --connect jdbc:mysql://master:3306/ --username root --password 111111

 


二、实践

1、启动MySQL:

mysql -uroot -p111111

2、创建员工表

-- 创建公司company数据库
create database company

-- 在公司company数据库下创建员工表staff
create table company.staff(id int(4) primary key not null auto_increment,
                           name varchar(255),                             
                           sex varchar(255));


-- 在员工表中插入数据
insert into company.staff(name,sex) values('Thomes','Male');
insert into company.staff(name,sex) values('Catalina','Female');

全量数据导入:

./bin/sqoop import \
--connect jdbc:mysql://localhost:3306/company \
--username root \
--password 111111 \
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t"

错误一:

Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLException: null,  message from 
server: "Host 'slave1' is not allowed to connect to this MariaDB server"

表示该对象不是远程对象,不能通过该对象远程访问数据

方案一:改表:

use mysql ;select user,host,password from user;

update user set host = '%' where user='root';

执行方法一时:遇到ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'

sqoop导入导出数据_第1张图片

解决方法:不予理会,直接执行  flush privileges;然后重连数据库

sqoop导入导出数据_第2张图片

方法二没用,暂时不知道是否能解决问题:

方案二:授权法:

例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。 
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; 
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码 
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

错误2:

Error: Java.lang.RuntimeException: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

sqoop导入导出数据_第3张图片

 

 

解决完上述问题之后,再次执行导入命令,得到结果:结果存在HDFS目录上:

二、查询导入

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <= 1 and $CONDITION'
-- 使用双引号需要使用 \ 在$CONDITION前 进行转义
--query "select name,sex from staff where id <= 1 and \$CONDITION"

三、导入指定的列

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns id,sex \
--table staff

四、关键字筛选

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"

五、关键字和指定关键字同时使用

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--columns id,sex \
--where "id=1"

二、MySQL数据导入Hive

数据先上传至HDFS的   /user/root/staff    目录(系统默认路径:/user/系统目录(root)/表名(staff))下,

然后再存入hive表(hive表对应的HDFS仓库位置:/user/hive/warehouse/staff_hive)

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive

执行遇到的坑:

坑一:

 java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

问题原因:缺少jar包

问题解决:复制hive lib 包下面的hive-common-1.1.0-cdh5.7.0.jar 至sqoop lib 包下

坑二:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader

问题原因:缺少jar包

问题解决:拷贝 hive lib 包下 hive-exec-1.1.0-cdh5.7.0.jar 至 sqoop 的lib包下

 

三、MySQL数据导入Hbase

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

坑一:

Sqoop HBase导入:java.lang.NoSuchMethodError:org.apache.hadoop.hbase.HTableDescriptor.addFamily

问题分析:版本不兼容;sqoop1.4.6 只支持Hbase1.0及其以前的版本

问题解决:手动创建Hbase表,如下:

hbase(main):001:0> create 'hbase_company','info'

然后重新执行sqoop语句:

./bin/sqoop import \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_company" \
--num-mappers 1 \
--split-by id

四、Hive或HDFS数据导入MySQL

./bin/sqoop export \
--connect jdbc:mysql://master:3306/company \
--username root \
--password 111111 \
--table staff \
--num-mappers 1 \
--export-dir /user/hive/warehouse/staff_hive \
--input-fields-terminated-by "\t"

五、脚本执行

vi jobs/sqp.opt


./bin/sqoop export \
--connect 
jdbc:mysql://master:3306/company 
--username 
root
--password
111111
--table
staff
--num-mappers
1
--export-dir 
/user/hive/warehouse/staff_hive 
--input-fields-terminated-by 
"\t"

--执行:
[root@master sqoop-1.4.6]# ./bin/sqoop --options-file /usr/local/src/test4/sqp_job/sqp.opt

坑一:MySQL在centos7中重设密码:

Centos7重置mysql密码

"Host 'xxx' is not allowed to connect to this MySQL server":

MySQL导入hive报错——缺少jar包

你可能感兴趣的:(MySQL,Hbase,Hive)