Sqoop是一个用来将Hadoop(Hive、HBase)和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:MySQL ,Oracle,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中。
Sqoop目前已经是Apache的顶级项目了,目前版本是1.4.4 和 Sqoop2 1.99.3,本文以1.4.4的版本为例讲解基本的安装配置和简单应用的演示。
[一]、安装配置
选择Sqoop 1.4.4 版本:sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz
1.1、下载后解压配置:
1 | tar -zxvf sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz /usr/local/ | |
2 | cd /usr/local 建立软连接: |
3 | ln -s sqoop-1.4.4.bin__hadoop-2.0.4-alpha sqoop |
1.2、环境变量配置 vi ~/.bash_profile :
1 | #Sqoop add by micmiu.com | |
2 | export SQOOP_HOME=/usr/local/sqoop |
export PATH=$SQOOP_HOME/bin:$PATH | |
我们可以通过设置环境变量来简化操作。 [root@ www.linuxidc.com ~]# vi /etc/profile 加入一行 export PATH="$PATH:/usr/local/php/bin:/usr/local/mysql/bin" Source /etc/profile |
1.3、配置Sqoop参数:
复制<SQOOP_HOME>/conf/sqoop-env-template.sh 一份重命名为:<SQOOP_HOME>/conf/sqoop-env.sh
vi <SQOOP_HOME>/conf/sqoop-env.sh
1 | # 指定各环境变量的实际配置 | |
2 | # Set Hadoop-specific environment variables here. |
3 |
| |
4 | #Set path to where bin/hadoop is available |
5 | #export HADOOP_COMMON_HOME= | |
6 |
|
7 | #Set path to where hadoop-*-core.jar is available | |
8 | #export HADOOP_MAPRED_HOME= |
9 |
| ||
10 | #set the path to where bin/hbase is available |
11 | #export HBASE_HOME= | |
12 |
|
13 | #Set the path to where bin/hive is available | |
14 | #export HIVE_HOME= |
ps:因为我当前用户的默认环境变量中已经配置了相关变量,故该配置文件无需再修改:
1 | # Hadoop | |
2 | export HADOOP_PREFIX="/usr/local/hadoop" |
3 | export HADOOP_HOME=${HADOOP_PREFIX} | |
4 | export PATH=$PATH:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin |
5 | export HADOOP_COMMON_HOME=${HADOOP_PREFIX} | |
6 | export HADOOP_HDFS_HOME=${HADOOP_PREFIX} |
7 | export HADOOP_MAPRED_HOME=${HADOOP_PREFIX} |
8 | export HADOOP_YARN_HOME=${HADOOP_PREFIX} |
9 | # Native Path | ||
10 | export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native |
11 | export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib/native" | |
12 | # Hadoop end |
13 |
| |
14 | #Hive |
15 | export HIVE_HOME=/usr/local/hive |
16 | export PATH=$HIVE_HOME/bin:$PATH |
17 |
| |
18 | #HBase |
19 | export HBASE_HOME=/usr/local/hbase | |
20 | export PATH=$HBASE |
21 |
| |
22 | #add by micmiu.com |
1.4、驱动jar包
下面测试演示以MySQL为例,则需要把mysql对应的驱动lib文件copy到 <SQOOP_HOME>/lib 目录下。
[二]、测试数据准备
以MySQL 为例:
· 192.168.6.77(hostname:Master.Hadoop)
· database: test
· 用户:root 密码:micmiu
准备两张测试表一个有主键表demo_blog,一个无主键表 demo_log:
1 | CREATE TABLE `demo_blog` ( | |
2 | `id` int(11) NOT NULL AUTO_INCREMENT, |
3 | `blog` varchar(100) NOT NULL, | |
4 | PRIMARY KEY (`id`) |
5 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8; | |
1 | CREATE TABLE `demo_log` ( |
2 | `operator` varchar(16) NOT NULL, | |
3 | `log` varchar(100) NOT NULL |
4 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
插入测试数据:
1 | insert into demo_blog (id, blog) values (1, "micmiu.com"); |
2 | insert into demo_blog (id, blog) values (2, "ctosun.com"); |
3 | insert into demo_blog (id, blog) values (3, "baby.micmiu.com"); | |
4 |
|
5 | insert into demo_log (operator, log) values ("micmiu", "create"); |
6 | insert into demo_log (operator, log) values ("micmiu", "update"); |
7 | insert into demo_log (operator, log) values ("michael", "edit"); |
8 | insert into demo_log (operator, log) values ("michael", "delete"); |
[三]、导入数据到HDFS
3.1、导入有主键的表
比如我需要把表 demo_blog (含主键) 的数据导入到HDFS中,执行如下命令:
1 | sqoop import --connect jdbc:mysql://192.168.6.77/test --username root --password micmiu --table demo_blog |
执行过程如下:
验证导入到hdfs上的数据:
1 | $ hdfs dfs -ls /user/hadoop/demo_blog | |
8 | [hadoop@Master ~]$ hdfs dfs -cat /user/hadoop/demo_blog/part-m-0000* |
9 | 1,micmiu.com | ||
10 | 2,ctosun.com |
11 | 3,baby.micmiu.com |
ps:默认设置下导入到hdfs上的路径是: /user/username/tablename/(files),比如我的当前用户是hadoop,那么实际路径即: /user/hadoop/demo_blog/(files)。
如果要自定义路径需要增加参数:--warehouse-dir 比如:
1 | sqoop import --connect jdbc:mysql://Master.Hadoop/test --username root --password micmiu --table demo_blog --warehouse-dir /user/micmiu/sqoop |
3.2、导入不含主键的表
比如需要把表 demo_log(无主键)的数据导入到hdfs中,执行如下命令:
1 | sqoop import --connect jdbc:mysql://192.168.6.77/test --username root --password micmiu --table demo_log --warehouse-dir /user/micmiu/sqoop --split-by operator |
ps:无主键表的导入需要增加参数 --split-byxxx 或者 -m 1
执行过程:
验证导入的数据:
1 | $ hdfs dfs -ls /user/micmiu/sqoop/demo_log | |
8 | $ hdfs dfs -cat /user/micmiu/sqoop/demo_log/part-m-0000* |
9 | michael,edit | ||
10 | michael,delete |
11 | micmiu,create |
12 | micmiu,update |
[四]、导入数据到Hive
比如把表demo_blog 数据导入到Hive中,增加参数–hive-import :
1 | sqoop import --connect jdbc:mysql://localhost/test --username root --table demo_blog --warehouse-dir /user/sqoop --hive-import --create-hive-table |
执行过程如下:
Hive CLI中验证导入的数据:
1 | hive> show tables; |
[五]、导入数据到HBase
演示把表 demo_blog 数据导入到HBase ,指定Hbase中表名为demo_sqoop2hbase 的命令:
1 | sqoop import --connect jdbc:mysql://localhost/test --username root --table demo_blog --hbase-table demo_sqoop2hbase --hbase-create-table --hbase-row-key id --column-family url
--hbase-row-key id可以随便设,比如id+’==’+url |
执行过程:
hbase shell中验证导入的数据:
1 | hbase(main):009:0> list |
11 | hbase(main):010:0> scan "demo_sqoop2hbase" | ||
18 | hbase(main):011:0> describe "demo_sqoop2hbase" |
验证导入成功。
本文到此已经把MySQL中的数据迁移到 HDFS、Hive、HBase的三种基本情况演示结束。