sqoop安装配置
一、介绍
Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases.
http://sqoop.apache.org/
二、软件
hadoop-2.4.1
sqoop-1.4.6
http://www.apache.org/dyn/closer.lua/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
三、资料
Documents
Sqoop User Guide
http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html
Sqoop Developer’s Guide v1.4.6
http://sqoop.apache.org/docs/1.4.6/SqoopDevGuide.html
Api
http://sqoop.apache.org/docs/1.4.6/api/index.html
四、安装
gtar -zxvf /root/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz /usr/local/
cd /usr/local
ln -s sqoop-1.4.4.bin__hadoop-2.0.4-alpha sqoop
五、环境变量
/etc/profile
export MAVEN_HOME=/usr/local/maven
export JAVA_HOME=/root/jdk1.8
export PROTOC_HOME=/tmp/protobuf-2.5.0
export SQOOP_HOME=/usr/local/sqoop-1.4.6
export ZOOKEEPER=/usr/local/zookeeper
# Hadoop
export HADOOP_PREFIX="/usr/local/hadoop"
export HADOOP_HOME=${HADOOP_PREFIX}
export PATH=$PATH:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin
export HADOOP_COMMON_HOME=${HADOOP_PREFIX}
export HADOOP_HDFS_HOME=${HADOOP_PREFIX}
export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}
export HADOOP_YARN_HOME=${HADOOP_PREFIX}
# Native Path
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib/native"
# Hadoop end
#Hive
export HIVE_HOME=/usr/local/hive
export PATH=$HIVE_HOME/bin:$PATH
#HBase
export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE
sqoop/bin/configure-sqoop里面的如下三段内容注释掉
#if [ -z "${HBASE_HOME}" ]; then
# if [ -d "/usr/lib/hbase" ]; then
# HBASE_HOME=/usr/lib/hbase
# else
# HBASE_HOME=${SQOOP_HOME}/../hbase
# fi
#fi
#if [ -z "${HCAT_HOME}" ]; then
# if [ -d "/usr/lib/hive-hcatalog" ]; then
# HCAT_HOME=/usr/lib/hive-hcatalog
# elif [ -d "/usr/lib/hcatalog" ]; then
# HCAT_HOME=/usr/lib/hcatalog
# else
# HCAT_HOME=${SQOOP_HOME}/../hive-hcatalog
# if [ ! -d ${HCAT_HOME} ]; then
# HCAT_HOME=${SQOOP_HOME}/../hcatalog
# fi
# fi
#fi
#if [ -z "${ACCUMULO_HOME}" ]; then
# if [ -d "/usr/lib/accumulo" ]; then
# ACCUMULO_HOME=/usr/lib/accumulo
# else
# ACCUMULO_HOME=${SQOOP_HOME}/../accumulo
# fi
#fi
六、配置Sqoop参数
复制<SQOOP_HOME>/conf/sqoop-env-template.sh文件重命名<SQOOP_HOME>/conf/sqoop-env.sh
vi <SQOOP_HOME>/conf/sqoop-env.sh
# 指定各环境变量的实际配置
如果/etc/profile已经配置,这个文件配置可以忽略
七、下载jjbc驱动
把jdbc驱动放到<SQOOP_HOME>/lib目录下
oracle的驱动是ojdbc6.jar
http://www.micmiu.com/bigdata/sqoop/sqoop-setup-and-demo/
八、导入SCOTT用户EMP表的所有字段
//注意:EMP一定要大写
sqoop import --connect jdbc:oracle:thin:@192.168.1.100:1521:ORCL --username SCOTT --password tiger --table EMP -m 1;
查看执行结果:
#hadoop fs -ls EMP
-rw-r--r-- 3 root supergroup 0 2016-01-28 14:05 EMP/_SUCCESS
-rw-r--r-- 3 root supergroup 115 2016-01-28 14:05 EMP/part-m-00000
-rw-r--r-- 3 root supergroup 117 2016-01-28 14:05 EMP/part-m-00001
-rw-r--r-- 3 root supergroup 238 2016-01-28 14:05 EMP/part-m-00002
-rw-r--r-- 3 root supergroup 347 2016-01-28 14:05 EMP/part-m-00003
# hadoop fs -cat EMP/part-m-00000
7369,SMITH,CLERK,7902,1980-12-17 00:00:00.0,800,null,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00.0,1600,300,30
说明:
1)默认导入到HDFS的路径是:/user/hadoop(用户名)/EMP (表名),如果EMP目录已经存在,则报错;
需要先删除已经存在的目录:hadoop fs -rm /user/hadoop/EMP;
如果相同的命令导入多次,也会报错的,需要先删除已经存在的目录;
2)-m 1表示使用几个map任务处理,sqoop默认采用4个map任务,有几个任务在HDFS的执行结果中就有几个part-m;
3)sqoop默认从数据库导入到HDFS的分隔符是逗号;
4)空列的值使用null;
5)sqoop中的map数设置原则:一个表的数据抽取不超过3分钟,否则就增加map数;
九、导入表的指定字段并指定目标地址
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--target-dir EMP_COLUMN -m 1;
说明:
1)通过--target-dir指定导入到HDFS的具体位置;
2)通过--columns指定需要导入的列;
十、导入表的指定字段并指定目标地址使用指定的分隔符
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--target-dir EMP_COLUMN_SPLIT \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '' --null-non-string '0' -m 2;
由于这里使用了2个map任务,所以在hdfs的文件中就有了2个part; 由于COMM是NUMBER类型,所以HDFS中就是0。
说明:
1)--null-string '': 当string类型的字段为空时,使用''代替
2)--null-non-string 0 : 当非string类型的字段为空时,使用0代替,项目中不常使用这个配置。
3)--fields-terminated-by '\t':字段之间采用tab分隔
4)--lines-terminated-by '\n':行之间采用回车分隔
十、根据条件导入数据
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP \
--columns "EMPNO,ENAME,JOB,SAL,COMM" \
--target-dir EMP_COLUMN_WHERE \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--where 'SAL>2000' \
--null-string '' --null-non-string '0' -m 1 ;
十一、保护数据库密码方式
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT \
--target-dir EMP_COLUMN_PASSWORD1 \
--table EMP -m 1 \
-P;
Enter password:
//密码放置到一个文件中
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT \
--table EMP \
--target-dir EMP_COLUMN_PASSWORD2 \
--password-file /home/hadoop/my-sqoop-password -m 1 ;
十二、更改导入文件格式
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP -m 1 \
--target-dir EMP_SEQUENCEFILE \
--as-sequencefile ;
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP -m 1 \
--target-dir EMP_AVRODATAFILE \
--as-avrodatafile ;
十三、增量数据导入
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table EMP -m 1 \
--target-dir EMP_APPEND \
--incremental append \
--check-column EMPNO \
--last-value 7788 ;
十四、导入没有主键的表到HDFS中
//表SALGRADE为例
sqoop import --connect jdbc:oracle:thin:@192.168.1.107:1521:ORCL \
--username SCOTT --password tiger \
--table SALGRADE \
--target-dir SALGRADE \
--fields-terminated-by '\t' --lines-terminated-by '\n' \
--null-string '' --null-non-string '0' -m 2;
十五、文件脚本导入命令
编辑emp.opt
import
--connect
jdbc:oracle:thin:@192.168.1.100:1521:ORCL
--username
SCOTT
--password
tiger
--table
EMP
--target-dir
EMP_OPTIONS_FILE
-m
sqoop --options-file ./emp.opt
错误处理
1、
//sqoop/bin/configure-sqoop里面的如下三段内容注释掉
Warning: /usr/local/sqoop-1.4.6/../hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/local/sqoop-1.4.6/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/local/sqoop-1.4.6/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation
2、
//这个原因是因为:-username micmiu 用户名这个参数, 需要把用户名大写:-username MICMIU ,再执行就ok了
16/01/28 11:57:43 ERROR tool.ImportTool: Imported Failed: There is no column found in the target table merchant. Please ensure that your table name is correct.
3、
报错:
ERROR tool.ImportTool: Error during import: No primary key could be found for table SALGRADE. Please specify one with
--split-by or perform a sequential import with '-m 1'.
原因是没有找到主键,详见《数据库导入到HDFS原理》,解决办法如下:
1)添加主键;
2)使用--split-by ' GRADE';
3)使用-m 1,m为几那么在HDFS上就会生成几个文件,就不存在按照字段拆分多个任务的问题;