Sqoop简介
Sqoop框架:作用就是用来将结构化数据与HDFS数据(非结构化数据)的相互转换。
主要用于在Hadoop(Hive)与传统数据库(mysql)间进行数据的传递。
应用场景:随着数据量的增加关系数据库中的数据需要导到HDFS时,就得使用此框架(只需一个命令)。
注意: Sqoop的底层实现就是Mapreduce 。它有着自己的语法,一旦运行它会把其转换为mapreduce,然后把Mapreduce提交给yarn,在yarn上执行Mapreduce。说白了Sqoop就是一个工具,它可以将自己的语法转换为Mapreduce,不需要用户在额外的书写Mapreduce。
Sqoop安装与数据的转移
安装:在weekend08机器中安装sqoop到local目录下
sqoop安装:
安装在一台节点上就可以了。
1.上传sqoop
2.安装和配置
--在添加sqoop到环境变量
--将数据库连接驱动拷贝到$SQOOP_HOME/lib里
--重命名conf中的sqoop-env-template.sh 为 sqoop-env.sh
--sqoop-version 验证安装的版本
--sqoop list-databases -connect jdbc:mysql://weekend08:3306/ --username root --password hadoop
3.使用
第一类:数据库中的数据导入到HDFS上
sqoop import --connect jdbc:mysql://weekend08:3306/result_db --username root --password hadoop --table dimension_date --columns 'id, year, season,month,week,day,calendar,type'
指定输出路径、指定数据分隔符
sqoop import --connect jdbc:mysql://weekend08:3306/result_db --username root --password hadoop --table dimension_date --target-dir /sqoop/td --fields-terminated-by '\t'
指定Map数量 -m
sqoop import --connect jdbc:mysql://weekend08:3306/itcast --username root --password 123 --table trade_detail --target-dir /sqoop/td1 --fields-terminated-by '\t' -m 2
增加where条件, 注意:条件必须用引号引起来
sqoop import --connect jdbc:mysql://weekend08:3306/itcast --username root --password 123 --table trade_detail --where 'id>3' --target-dir '/sqoop/td2'
增加query语句(使用 \ 将语句换行)
sqoop import --connect jdbc:mysql://weekend08:3306/itcast --username root --password 123 \
--query 'SELECT * FROM trade_detail where id > 2 AND $CONDITIONS' --split-by trade_detail.id --target-dir '/sqoop/td3'
注意:如果使用--query这个命令的时候,需要注意的是where后面的参数,AND $CONDITIONS这个参数必须加上
而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS
如果设置map数量为1个时即-m 1,不用加上--split-by ${tablename.column},否则需要加上。
第二类:将HDFS上的数据导出到数据库中(不要忘记指定分隔符)
sqoop export --connect jdbc:mysql://weekend08:3306/result_db --username root --password hadoop --export-dir '/sqoop/td' --table dimension_date -m 1 --fields-terminated-by ','
总结:上述的执行命令语句,可以单独放在一个文件中,然后通过 sqoop -- option -file 文件名 命令执行。
sqoop-1.4.6-cdh5.8.3.tar.gz安装
(1)、下载地址: http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.6-cdh5.8.3.tar.gz
解压到/opt/sqoop
(2)、拷贝mysql的jdbc驱动包mysql-connector-java-5.1.31-bin.jar到sqoop/lib目录下。
(3)、配置环境变量
#sqoop
export SQOOP_HOME=/opt/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
(4)、复制sqoop/conf/sqoop-env-template.sh为sqoop-env.sh
添加相关的配置
#Setpath to where bin/hadoop is available
exportHADOOP_COMMON_HOME=/opt/hadoop
#Setpath to where hadoop-*-core.jar isavailable
exportHADOOP_MAPRED_HOME=/opt/hadoop
#setthe path to where bin/hbase isavailable
exportHBASE_HOME=/opt/hbase
#与hive集成
exportHIVE_HOME= /opt/hive
#Setthe path for where zookeper config diris
exportZOOCFGDIR= /opt/zookeeper
(5)、测试Sqoop
发现有警告
修改$SQOOP_HOME/bin/configure-sqoop
注释掉HCatalog,Accumulo检查(除非你准备使用HCatalog,Accumulo等HADOOP上的组件)
## Moved to be a runtime check in sqoop.
#if [ ! -d "${HCAT_HOME}" ]; then
# echo "Warning: $HCAT_HOME does not exist! HCatalog jobs willfail."
# echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
#fi
#if [ ! -d "${ACCUMULO_HOME}" ];then
# echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports willfail."
# echo 'Please set $ACCUMULO_HOME to the root of your Accumuloinstallation.'
#fi
再次执行sqoop version
遇到的坑:
1、sqoop import 时报错Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
这是因为sqoop缺少java-json.jar包.去http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm下载,然后放到sqoop/lib目录即可。
2、sqoop create-hive-table 从mysql复制表结构到hive报错 :
Sqoop:Import failed: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
解决方法:将hive/lib 包下的 hive-common-1.1.0-cdh5.8.3.jar 拷贝到 sqoop/lib下
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader
解决方法:将hive/lib 包下的 hive-exec-1.1.0-cdh5.8.3.jar 拷贝到 sqoop/lib下
测试
1、将mysql表中的数据导入到HDFS
sqoop import --connect jdbc:mysql://netcloud03:3306/sqoop --username root --password hadoop \
--table sqoop --target-dir /sqoop/td2 --fields-terminated-by '\t' -m 1
2、将mysql的表结构复制到hive中
sqoop create-hive-table --connect jdbc:mysql://netcloud03:3306/sqoop --username root --password hadoop --table sqoop --hive-table test ;