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.
原因是:
新的Hbase版本使用了新的Api,不支持老的api了。Sqoop-1.4.6需要使用Hbase-1.0(包括1.0)以前的版本
解决办法:将自己的sqoop版本提高或者将hbase的版本降低
https://blog.csdn.net/w3045872817/article/details/78175959 //待测试