Sqoop
文章目录
- Sqoop
- Chapter1 Sqoop介绍
- Chapter2 Sqoop导入
- Chapter3 Sqoop导出
- Chapter4 Sqoop Job作业
- Chapter5 Q&A
-
- 1.1 Error: java.io.IOException: Can't export data, please check failed map task logs
- 1.2 ERROR tool.ExportTool: Encountered IOException running export job: java.io.IOException: No columns to generate for ClassWriter
- 1.3 sqoop从hive中导入数据到mysql出现中文乱码
- 1.4 sqoop跑太慢
- 1.5 Error parsing arguments for import
- 1.6 java.lang.NumberFormatException: For input string: "kranthi"
- 1.7 免密执行job时报错
Chapter1 Sqoop介绍
Apache Sqoop是在Hadoop生态体系和RDBMS体系之间传送数据的一种工具
工作机制是将导入或者导出命令翻译成mr程序来实现,在翻译出的mr中主要是对inputformat和outputformat进行定制
hadoop生态系统包括:hdfs,hive,hbase等
rdbms体系包括:mysql,oracle,db2,postgresql
sqoop可以理解为:sql 到 Hadoop和Hadoop 到 sql
1.1 安装
安装 sqoop 的前提是已经具备 java 和 hadoop 的环境
最新稳定版: 1.4.6
配置文件修改:
cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
export HADOOP_COMMON_HOME= /export/servers/hadoop-2.7.5
export HADOOP_MAPRED_HOME= /export/servers/hadoop-2.7.5
export HIVE_HOME= /export/servers/hive
加入 mysql 的 jdbc 驱动包
cp /hive/lib/mysql-connector-java-5.1.32.jar $SQOOP_HOME/lib/
安装完成之后可以用如下方式测试:
sqoop list-databases --connect jdbc:mysql://master:3306/ --username root --password 123456
或者
sqoop list-databases \
--connect jdbc:mysql://master:3306/ \
--username root --password 123456
Chapter2 Sqoop导入
2.1 导入和导出
import:数据导入,RDBMS->Hadoop
export:数据导出,Hadoop->RDBMS
2.2 全量导入Mysql数据到hdfs
bin/sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://master:3306/userdb \
--username root \
--password 123456 \
--target-dir /sqoopresult \
--table emp --m 1 \
--delete-target-dir
这里的--delete-target-dir 后面不要加目录,表示如果目标路径存在就先删除
--connect中最好不要用localhost,使用ip地址或者映射
未指定分隔符,默认是逗号分隔
可以使用--fields-terminated-by '\t'来指定
--m 表示启动多少个maptask来执行,如果启动多个maptask,需要
如果表的数据比较大 可以并行启动多个maptask执行导入操作,如果表没有主键,可以不用指定切分字段(会使用主键切分),如果没有主键,请指定根据哪个字段进行切分,例如
--split-by id \,如果既没有主键,又没有指定切分字段,maptask只能为1
2.3 全量导入mysql表数据到hive
2.3.1 先复制表结构到hive中再导入数据
sqoop create-hive-table \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://master:3306/userdb \
--table emp_add \
--username root \
--password 123456 \
--hive-table test.emp_add_sp
sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://master:3306/userdb \
--username root \
--password 123456 \
--table emp_add \
--hive-table test.e \
--hive-import \
--m 1
2.3.2 直接导入mysql数据到hive中
sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://master:3306/userdb \
--username root \
--password 123456 \
--table emp_conn \
--hive-import \
--m 1 \
--hive-database test;
如果hive中表不存在就创建,表名和mysql表名相同
2.3.3 导入表数据子集(where过滤)
sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://master:3306/userdb \
--username root \
--password 123456 \
--whe