Advertisement

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'

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

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

方案二:授权法:

例如,你想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

解决完上述问题之后,再次执行导入命令,得到结果:结果存在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包

全部评论 (0)

还没有任何评论哟~