sqoop搭建测试

环境相关:
HADOOP版本:hadoop-2.6.0-cdh5.7.1
HIVE版本:apache-hive-1.1.0-cdh5.7.1-bin

相关说明

CDH对应版本的sqoop下载地址:http://archive.cloudera.com/cdh5/cdh/5/

找到cdh5.7.1对应的sqoop进行下载:sqoop-1.4.6-cdh5.7.1.tar.gz

对应的CDH的相关版本文档:http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.7.1/

如果想要做源码编译,sqoop的源码编译和hadoop或者hive的源码编译类似,并且需要以下组件:
* Apache ant (1.7.1)
* Java JDK 1.6
* python 2.5+
* findbugs (1.3.9)
* cobertura (1.9.4.1)
* checkstyle (5.x)
* yum 安装 asciidoc make xmlto tar gzip

安装配置

# 安装sqoop:
cd /usr/local/
tar -xf /tmp/sqoop-1.4.6-cdh5.7.1.tar.gz
ln -s sqoop-1.4.6-cdh5.7.1 sqoop
chown hadoop: sqoop-1.4.6-cdh5.7.1 -R
chown hadoop: sqoop -R
echo 'export SQOOP_HOME=/usr/local/sqoop'>>/etc/profile
echo 'export PATH=$SQOOP_HOME/bin:$PATH'>>/etc/profile

# 配置sqoop:
su - hadoop
cd /usr/local/sqoop/conf/
cp -av sqoop-env-template.sh sqoop-env.sh
echo "export HADOOP_COMMON_HOME=$HADOOP_HOME" >> sqoop-env.sh
echo "export HADOOP_MAPRED_HOME=$HADOOP_HOME" >> sqoop-env.sh
echo "export HIVE_HOME=$HIVE_HOME" >> sqoop-env.sh
# 如果需要把RDBMS导入到HBASE的时候,需要设置 export HBASE_HOME=...
# 因为环境中没有安装zookeeper,也不需要设置export ZOOCFGDIR=...

# 解决BUG问题:
cd /usr/local/hive/lib
cp -av mysql-connector-java-5.1.45-bin.jar /usr/local/sqoop/lib/
# 我们在编译安装hive的时候就有一个mysql的连接jar包缺失的问题
# SQOOP也有这个问题,需要将对应的jar包cp到SQOOP的lib目录下

cd /usr/local/sqoop/lib
unzip /tmp/java-json.jar.zip
# 将mysql库中的表导入到hdfs中时,报错缺包java-json.jar
# 该包的下载地址:http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm

cd /usr/local/sqoop/lib
cp -av /usr/local/hive/lib/hive-common-1.1.0-cdh5.7.1.jar .
cp -av /usr/local/hive/lib/hive-shims-* .
# 存在BUG,需要复制包,否则sqoop import到hive的时候报错

sqoop帮助和list

sqoop help
# 查看帮助,命令语法格式为 usage: sqoop COMMAND [ARGS]
# 根据Available commands参数,进一步查看帮助,如:
sqoop help list-databases

sqoop list-databases \
--connect jdbc:mysql://127.0.0.1:3306 \
--username root --password vincent
# 查看mysql库中的所有数据库

sqoop list-table \
--connect jdbc:mysql://127.0.0.1:3306/vincent_hive \
--username root --password vincent
# 查看mysql某个库中的所有表

sqoop import

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password vincent \
--table user
# 当前系统用户是hadoop,该表默认存放到了 /user/hadoop/ 目录之下的 user目录
# user目录就是mysql库的user表名对应的目录
hdfs dfs -text /user/hadoop/user/part-*
# 使用命令查看所有的分出来的 part文件,看到user表的所有信息
# 在敲 sqoop import 的对应路径下会生成一个user.java文件
# 通过网页也能查到 Name:    user.jar 这个信息,即mapreduce的默认任务名
# 这是一个文本文件,内容是整个 sqoop import 行为的调用的所有源码操作
# 因为在SQOOP里面默认的map task是4,因此sqoop import 将user表拆成了四个文件

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password vincent \
--table user \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--columns "Host,User" \
--target-dir /user/hadoop/USER_COLUMN_SPLIT \
--where "Host='localhost'"
# --mapreduce-job-name 指定mapreduce任务名
# --delete-target-dir 删除HDFS上对应的目录(如果import前就存在的话)
# --fields-terminated-by 指定列分隔符为tab
# --num-mappers 指定map task的数量,-m 是其缩写
# --null-non-string 指定使用0代替列值null
# --columns "Host,User" 指定只import库中mysql.user表中的相应列,列名大小写不敏感
# --target-dir 指定存储到对应的HDFS目录路径中
# --where 加入where条件对表进行筛选
hdfs dfs -ls /user/hadoop/user/
hdfs dfs -text /user/hadoop/USER_COLUMN_SPLIT/part*

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password vincent \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--target-dir /user/hadoop/USER_COLUMN_SPLIT \
--query "select Host,User from mysql.user where host='localhost' and \$CONDITIONS" \
--split-by 'host' \
--direct
# --query 使用SQL查询筛选数据,此时不能再有--table和--columns参数,防止冲突
#      参数 $CONDITIONS 必须出现在where条件中,因为是双引号,shell中$字符会尝试转义成变量
#      因此需要转义,如果是单引号括起来的SQL语句,则不需要转义
# 指定map task的数量不为1时(--num-mappers参数),会并行启动多个map task
#      如果表没有主键的时候,需要指定一个列作分割的依据,或者指定-m 1
#      --split-by 'host'就是指定host列作为分割的依据列
# 使用--direct进行优化,需要库版本支持,如mysql 5.0+、oracle 10.2.0+ 等
#      详细参见官方文档的7.2.6 Controlling the Import Process 相关解释

# 可以将以上命令参数放到一个文件中,然后使用sqoop命令调用:
vi /home/hadoop/imp.txt
import
--connect
jdbc:mysql://127.0.0.1:3306/mysql
--username
root
--password
vincent
--mapreduce-job-name
FromMySQL2HDFS
--delete-target-dir
--fields-terminated-by
\t
--num-mappers
2
--null-non-string
0
--target-dir
/user/hadoop/USER_COLUMN_SPLIT
--query
select Host,User from mysql.user where host='localhost' and $CONDITIONS
--split-by
'host'
--direct
sqoop --options-file /home/hadoop/imp.txt
# 写一个命令参数文件,文件格式是一行命令一行参数
# 需要将SQL语句两边引起来的单引号和双引号去掉,一些需要引号引起来的参数也不在需要引号了
# 因为是写入文件之中的,脱离了shell直接执行的情况,$符号不需要转义了

sqoop eval

sqoop eval \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password vincent \
--query "select Host,User from mysql.user where 1=1"
# 使用eval指定一个SQL查询,将查询的结果直接显示到控制台上
# 不再需要参数$CONDITIONS了

sqoop export

# 使用export导出HDFS中的表到mysql中,用法和import相类似
# 区别是 需要提前在mysql中创建能够存放导出数据的表,字段数量类型要一致
# 因为导入到hdfs中的表是mysql.user,因此创建表结构为:
echo "create table user_test as select Host,User from user where 1=2;"|mysql -uroot -pvincent -Dmysql
sqoop export \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password vincent \
--table user_test \
--export-dir /user/hadoop/USER_COLUMN_SPLIT \
--input-fields-terminated-by '\t'
echo "select * from user_test;"|mysql -uroot -pvincent -Dmysql
# --export-dir 需要指定HDFS导出的路径目录
# --input-fields-terminated-by 需要指定该目录下文件中数据的列的分隔符

sqoop import/export hive table

sqoop import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password vincent \
--table user \
--columns "Host,User" \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--target-dir /user/hadoop/USER_COLUMN_SPLIT \
--split-by 'host' \
--direct \
--hive-import \
--create-hive-table \
--hive-database prd \
--hive-table mysql_user \
--hive-overwrite
# 使用--hive-import标志导入到hive中
# 不建议使用--create-hive-table导入时创建表
#       应当提前创建表,对应的列类型以及外部表或者分区表等参数需要指定
# 是否使用参数 --hive-overwrite 需要考虑

echo "create table user_test2 as select Host,User from user where 1=2;"|mysql -uroot -pvincent -Dmysql
sqoop export \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root --password vincent \
--table user_test2 \
--export-dir /user/hadoop/USER_COLUMN_SPLIT \
--input-fields-terminated-by '\t'
# 将hive的表导出到mysql中,和将hdfs的目录导出到mysql中是一样的
# 直接指定目录导出即可

sqoop job

sqoop job --create myjob \
-- import \
--connect jdbc:mysql://127.0.0.1:3306/mysql \
--username root \
--password vincent \
--table user \
--mapreduce-job-name FromMySQL2HDFS \
--delete-target-dir \
--fields-terminated-by '\t' \
--num-mappers 2 \
--null-non-string 0 \
--columns "Host,User" \
--target-dir /user/hadoop/USER_COLUMN_SPLIT

sqoop job --list

sqoop job --show myjob
# 提示要输入密码,我们并没有设置密码
# 实际上这个是mysql的密码
# 因为我们只是查看,并不是要连接mysql做import操作
# 因此直接回车即可
echo '\n'|sqoop job --show myjob
# 既然需要一个回车,那就给他一个回车

sqoop job --exec myjob
# 此时需要交互的输入mysql对应用户的密码
# 也就是说--password参数没有生效

cd /usr/local/sqoop/conf/
vi sqoop-site.xml
# 在<configuration>这里添加配置</configuration>
  <property>
    <name>sqoop.metastore.client.record.password</name>
    <value>true</value>
  </property>

sqoop job --delete myjob
# 删除 myjob

sqoop job --create myjob ...
# 对于已经存在的job需要重建,加上密码参数
sqoop job --show myjob
sqoop job --exec myjob
# 此时就不需要输入mysql的密码了

sqoop不支持lob

数据库的mysql.user是包含BLOB字段的,sqoop不能够直接支持LOB类型的字段的导入导出,具体处理方法需要开发UDF进行转换。

[TOC]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值