sqoop安装和使用

sqoop安装

sqoop镜像:

http://mirror.bit.edu.cn/apache/sqoop/  

https://mirrors.tuna.tsinghua.edu.cn/apache/sqoop/

http://archive.apache.org/dist/   #更多历史版本

 

本教程:

hadoop2.7.5   hdfs导入导出均成功

hbase2.1.8 不能导出到mysql,能导入到hbase

hive2.3.6  导入导出均成功

1.解压、添加环境变量

把sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz上传到linux的/opt/目录下,并解压。

[root@master opt]# tar -zxvf ./ sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz       #解压文件到当前/opt目录

[root@master opt]# mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop                #将文件夹名改为sqoop

 

添加环境变量:

[root@master opt]#  vi ~/.bash_profile

添加如下代码:

export SQOOP_HOME=/opt/sqoop

export PATH=$SQOOP_HOME/bin:$PATH

 

source ~/.bash_profile  #立即生效

 

2.配置sqoop-env.sh

[root@master conf]# cp sqoop-env-template.sh sqoop-env.sh  #赋值模板

[root@master conf]# vi sqoop-env.sh  #编辑内容如下

export HADOOP_COMMON_HOME=/opt/hadoop

export HADOOP_MAPRED_HOME=/opt/hadoop

export HBASE_HOME=/opt/hbase

export HIVE_HOME=/opt/hive

export ZOOCFGDIR=/opt/zookeeper

 

export ZOOKEEPER_HOME=/opt/zookeepe     #这个没有加进去,是否有必要?

 

3.拷贝JDBC驱动

把mysql-connector-java-5.1.46.jar上传到linux的/opt/目录下

[root@master opt]# cp mysql-connector-java-5.1.46.jar sqoop/lib

 

4.验证sqoop

[root@master opt]# sqoop version  #显示结果如下

19/12/06 10:01:16 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7

Sqoop 1.4.7

git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8

Compiled by maugli on Thu Dec 21 15:59:58 STD 2017

 

测试sqoop能否连接mysql数据库

[root@master bin]# ./sqoop list-databases --connect jdbc:mysql://master:3306/ --username root --password bigData@123    #显示结果如下

information_schema

hive

mysql

performance_schema

sys

 

到此说明sqoop安装正常。

5.sqoop的使用案例

sqoop的导入导出是相对hdfs而言,如果数据进入到hdfs,则为导入;从hdfs出则为导出。

提前准备,启动集群:

1.启动zookeeper

zookeeper/bin/zkServer.sh start     #三个节点都要执行

 

2.启动hadoop

start-all.sh      #主节点启动

 

3.启动hbase

注意hbase没有添加环境变量

hbase/bin/start-hbase.sh      #主节点启动

 

主节点进程:

[root@master opt]# jps

2737 HMaster

2865 HRegionServer

1891 NameNode

3061 Jps

1735 QuorumPeerMain

2056 SecondaryNameNode

2239 ResourceManager

 

在hdfs上创建目录/user/company

[root@master opt]# hadoop fs -mkdir -p /user/company

[root@master opt]# hadoop fs -ls /user

Found 3 items

drwxr-xr-x   - root supergroup          0 2019-12-06 11:01 /user/company

drwxr-xr-x   - root supergroup          0 2019-11-25 17:44 /user/hive

drwxr-xr-x   - root supergroup          0 2019-11-06 10:51 /user/root

到此,准备工作完成,下面开始导入导出数据。

5.1 导入数据

5.1.1 RDBMS到HDFS

1) 确定Mysql服务开启正常

2) 在Mysql中新建一张表并插入一些数据

 [root@master bin]# mysql -uroot -pbigData@123

mysql> create database company;   #创建数据库

mysql> create table company.staff(id int(4) primary key not null auto_increment, name varchar(255), sex varchar(255));   #创建表

mysql> insert into company.staff(name, sex) values('Thomas', 'Male');

mysql> insert into company.staff(name, sex) values('Catalina', 'FeMale');

mysql> select * from staff;

+----+----------+--------+

| id | name     | sex    |

+----+----------+--------+

|  1 | Thomas   | Male   |

|  2 | Catalina | FeMale |

+----+----------+--------+

2 rows in set (0.00 sec)

mysql>

 

3) 导入数据

         (1)全部导入

[root@master bin]#./sqoop import \

--connect jdbc:mysql://master:3306/company \

--username root \

--password bigData@123 \

--table staff \

--target-dir /user/company \

--delete-target-dir \

--num-mappers 1 \

--fields-terminated-by "\t"

查看hdfs上数据

[root@master bin]# hadoop fs -ls /user/company

Found 2 items

-rw-r--r--   1 root supergroup          0 2019-12-06 11:07 /user/company/_SUCCESS

-rw-r--r--   1 root supergroup         32 2019-12-06 11:07 /user/company/part-m-00000

[root@master bin]# hadoop fs -cat /user/company/part-m-00000

1       Thomas    Male

2       Catalina   FeMale

 

到此mysql-》hfs导入全部数据成功。

         (2)查询导入

[root@master bin]#./sqoop import \

--connect jdbc:mysql://master:3306/company \

--username root \

--password bigData@123 \

--target-dir /user/company \

--delete-target-dir \

--num-mappers 1 \

--fields-terminated-by "\t" \

--query 'select name,sex from staff where id <=1 and $CONDITIONS;'

提示:must contain '$CONDITIONS' in WHERE clause.

如果query后使用的是双引号,则$CONDITIONS前必须加转移符,防止shell识别为自己的变量。

 

[root@master bin]# hadoop fs -ls /user/company

Found 2 items

-rw-r--r--   1 root supergroup          0 2019-12-06 11:15 /user/company/_SUCCESS

-rw-r--r--   1 root supergroup         12 2019-12-06 11:15 /user/company/part-m-00000

[root@master bin]# hadoop fs -cat /user/company/part-m-00000

Thomas    Male

 

到此mysql-》hfs导入全部数据成功。

 

      (3)导入指定列

[root@master bin]#./sqoop import \

--connect jdbc:mysql://master:3306/company \

--username root \

--password bigData@123 \

--target-dir /user/company \

--delete-target-dir \

--num-mappers 1 \

--fields-terminated-by "\t" \

--columns id,sex \

--table staff

提示:columns中如果涉及到多列,用逗号分隔,分隔时不要添加空格

      (4)使用sqoop关键字筛选查询导入数据

[root@master bin]#./sqoop import \

--connect jdbc:mysql://master:3306/company \

--username root \

--password bigData@123 \

--target-dir /user/company \

--delete-target-dir \

--num-mappers 1 \

--fields-terminated-by "\t" \

--table staff \

--where "id=1"

 

5.1.2 RDBMS到Hive

./sqoop import \

--connect jdbc:mysql://master:3306/company \

--username root \

--password bigData@123 \

--table staff \

--num-mappers 1 \

--hive-import \

--fields-terminated-by "\t" \

--hive-overwrite \

--hive-table staff_hive

提示:该过程分为两步,第一步将数据导入到HDFS,第二步将导入到HDFS的数据迁移到Hive仓库,第一步默认的临时目录是/user/root/表名 ??是否需要配置

 

可能报错:见附件

成功后如下:

19/12/06 12:12:04 INFO hive.HiveImport: OK

19/12/06 12:12:04 INFO hive.HiveImport: Time taken: 7.881 seconds

19/12/06 12:12:05 INFO hive.HiveImport: Hive import complete.

[root@master bin]#hive   #启动hive客户端

[root@master bin]#show tables;

OK

staff_hive

tb_chengdu

Time taken: 15.665 seconds, Fetched: 2 row(s)

hive> select * from staff_hive;

OK

1       Thomas    Male

2       Catalina   FeMale

Time taken: 6.43 seconds, Fetched: 2 row(s)

hive>

 

到此,rdbms导入数据到hive,成功。

5.1.3 RDBMS到Hbase –待测试

启动hbase客户端

[root@master bin]# ./hbase shell

……

Took 0.0054 seconds                                                                                              

hbase(main):001:0>

 

提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能

hbase(main):001:0> create 'hbase_company','info'     #创建表

Created table hbase_company

Took 17.5040 seconds                                                                                             

=> Hbase::Table - hbase_company

hbase(main):002:0> scan 'hbase_company'     #查看该表

ROW                           COLUMN+CELL                                                                         

0 row(s)

Took 1.2565 seconds                                                                                              

hbase(main):003:0>

 

./sqoop import \

--connect jdbc:mysql://master:3306/company \

--username root \

--password bigData@123 \

--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

 

报错,见附件。先不调试这个。待测试

 

5.2、导出数据

在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS)中传输数据,叫做:导出,即使用export关键字。

5.2.1 HIVE/HDFS到RDBMS

./sqoop export \

--connect jdbc:mysql://master:3306/company \

--username root \

--password bigData@123 \

--table staff \

--num-mappers 1 \

--export-dir /user/hive/warehouse/staff_hive \

--input-fields-terminated-by "\t"

提示:Mysql中如果表不存在,不会自动创建

因为之前mysql的staff有两条记录,所以需要先删除掉。

……

19/12/06 20:13:13 INFO mapreduce.ExportJobBase: Exported 2 records.

[root@master bin]#

如上成功导出两条数据。

再到mysql客户端查询staff表,数据成功显示。

 

到此,hive导出数据到mysql完成。

5.3 脚本打包

使用opt格式的文件打包sqoop命令,然后执行。删除staff的两条记录。

delete from staff;

1) 创建一个.opt文件

[root@master sqoop]# mkdir opt

[root@master sqoop]# touch opt/job_HDFS2RDBMS.opt

[root@master sqoop]# vi opt/job_HDFS2RDBMS.opt     #编辑如下内容

2) 编写sqoop脚本

export

--connect

jdbc:mysql://master:3306/company

--username

root

--password

bigData@123

--table

staff

--num-mappers

1

--export-dir

/user/hive/warehouse/staff_hive

--input-fields-terminated-by

"\t"     #注意,这里必须换行,不能和参数写在一行

3) 执行该脚本

$ bin/sqoop --options-file opt/job_HDFS2RDBMS.opt

 

结果

19/12/06 20:38:23 INFO mapreduce.ExportJobBase: Transferred 178 bytes in 63.5468 seconds (2.8011 bytes/sec)

19/12/06 20:38:23 INFO mapreduce.ExportJobBase: Exported 2 records.

[root@master sqoop]#

上诉结果显示已成功导出。

查看mysql的staff表,数据已导入。

 

========

作者:geiliHe   2019年12月6日星期五 晚

=========

 

附件:

1:rdbms导入到hive错误

问题1:Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.Hi

#复制hive/lib/ hive-common-2.3.6.jar  到sqoop的lib下

[root@master lib]# cp hive-common-2.3.6.jar /opt/sqoop/lib

 

问题2:Output directory hdfs://master:9000/user/root/staff already exists

手动删除

[root@master bin]# hadoop fs -rm -R /user/root/staff

 

问题3:INFO conf.HiveConf: Found configuration file null.

这个错误主要的原因是没有配好 Hive-site.xml 的路径。

这个路径是通过HIVE_CONF_DIR来指定的,如果没有指定则需要 HIVE_HOME 定义好。

正确的配置是 HIVE_CONF_DIR=/opt/hive/conf 一定要定义到 conf 文件夹。

而定义这个HIVE_CONF_DIR的变量文件是 SQOOP_HOME/conf/sqoop-env.sh。

 

2.rdms导入数据到hbase错误

问题1:19/12/06 12:52:45 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.HBaseAdmin.<init>(Lorg/apache/hadoop/conf/Configuration;)V

 

原因是:

新的Hbase版本使用了新的Api,不支持老的api了。Sqoop-1.4.6需要使用Hbase-1.0(包括1.0)以前的版本

解决办法:将自己的sqoop版本提高或者将hbase的版本降低

https://blog.csdn.net/w3045872817/article/details/78175959  //待测试

 

posted @ 2020-02-07 00:06  geiliHe  阅读(1050)  评论(0编辑  收藏  举报