大数据Sqoop_09

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 ;

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值