一、Sqoop 介绍
Sqoop 是一款用于 hadoop 和关系型数据库之间数据导入导出的工具。可以通过 Sqoop 把数据从数据库(比如 mysql,oracle)导入到 hdfs 中;也可以把数据从 hdfs 中导出到关系型数据库中。
通过将 Sqoop 的操作命令转化为 Hadoop 的 MapReduce 作业(通常只涉及到 Map 任务)进行导入导出,即 Sqoop 生成的 Job 主要是并发运行 MapTask 实现数据并行传输以提升数据传送速度和效率,如果使用 Shell 脚本来实现多线程数据传送则存在很大的难度。
Sqoop2(Sqoop1.99.7)需要在 Hadoop 安装目录下的配置文件中设置代理,属于重量级嵌入安装,文中使用 Sqoop1(Sqoop1.4.7)。
二、Sqoop 安装
安装前提:
已经具备了Java和hadoop的环境。
下载安装包:
http://mirror.bit.edu.cn/apache/sqoop/1.4.7/
解压:
sudo tar -zxv -f sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
sudo mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
配置环境变量:
export SQOOP_HOME=/opt/sqoop
export PATH=SQOOP_HOME/bin
使配置生效:
source /etc/profile
上传 mysql 驱动至 Sqoop lib 下:
cp mysql-connector-java-5.1.46.jar /opt/sqoop/lib/
修改 Sqoop 配置:
cd /opt/sqoop/conf/
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/hadoop
Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/hadoop
set the path to where bin/hbase is available
export HBASE_HOME=/opt/hbase
Set the path to where bin/hive is available
export HIVE_HOME=/opt/hive
Set the path for where zookeper config dir is
export ZOOCFGDIR=/opt/zookeeper/conf
注意:这里的 HADOOP_COMMON_HOME 和 HADOOP_MAPRED_HOME 配成一个就行了,因为现在安装的 hadoop 的开源的版本,但是在 hadoop 的商业版本中这两个配置是分别安装在不同的目录下的。
三、验证安装是否成功
执行 sqoop version,看到版本信息,即安装成功。
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
四、测试
4.1、mysql 整个表导入 hdfs
运行下面的指令前确保 mysql 中存在 test db 和 mysql_input table。
sqoop import
--connect jdbc:mysql://master:3306/test
--username root
--password xxx
--table mysql_input
--target-dir /user/sqoop/data_from_mysql
运行后有报错:
ERROR tool.ImportTool: Import failed: No primary key could be found for table mysql_input. Please specify one with --split-by or perform a sequential import with '-m 1'.
因为没有主键,又没有指定切分的列,Sqoop 不知道用多少个 map 进行数据同步,可以通过设置 split-by 和 -m 1来规避。
当-m 设置的值大于1时,split-by 必须设置字段。
4.2、mysql 表按查询条件导入 hdfs
sqoop import
--connect jdbc:mysql://master:3306/test
--username root
--password xxx
--query 'select * from mysql_input where size>1 and $CONDITIONS'
--target-dir /user/sqoop/data_from_mysql
-m 1