hadoop离线分析(简单版)-sqoop

23 篇文章 0 订阅
22 篇文章 0 订阅

目录

 

sqoop概述

sqoop注意点

sqoop1和sqoop2区别

sqoop1安装部署


sqoop概述

Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。

sqoop注意点

sqoop尽管有很多的优点,在使用Sqoop的时候还有一些事情需要注意:

对于默认的并行机制要小心。默认情况下的并行意味着Sqoop假设大数据是在分区键范围内均匀分布的。这在当你的源系统是使用一个序列号发生器来生成主键的时候工作得很好。打个比方,当你有一个10个节点的集群,那么工作负载是在这10台服务器上平均分配的。但是,如果你的分割键是基于字母数字的,拥有比如以“A”作为开头的键值的数量会是“M”作为开头键值数量的20倍,那么工作负载就会变成从一台服务器倾斜到另一台服务器上。如果你最担心是性能,那么可以研究下直接加载。直接加载绕过通常的Java数据库连接导入,使用数据库本身提供的直接载入工具,比如MySQL的mysqldump。但是有特定数据库的限制。比如,你不能使用MySQL或者PostgreSQL的连接器来导入BLOB和CLOB类型。也没有驱动支持从视图的导入。Oracle直接驱动需要特权来读取类似dba_objects和v_$parameter这样的元数据。请查阅你的数据库直连驱动程序局限性的相关文档。进行增量导入是与效率有关的最受关注的问题,因为Sqoop专门是为大数据集设计的。Sqoop支持增量更新,将新记录添加到最近一次的导出的数据源上,或者指定上次修改的时间戳。由于Sqoop将数据移入和移出关系型数据库的能力,其对于Hive—Hadoop生态系统里的著名的类SQL数据仓库—有专门的支持不足为奇。命令“create-hive-table”可以用来将数据表定义导入到Hive。

sqoop1和sqoop2区别

这两个版本是完全不兼容的,其具体的版本号区别为1.4.x为sqoop1,1.99x为sqoop2。sqoop1和sqoop2在架构和用法上已经完全不同。在架构上,sqoop2引入了sqoop server(具体服务器为tomcat),对connector实现了集中的管理。其访问方式也变得多样化了,其可以通过REST API、JAVA API、WEB UI以及CLI控制台方式进行访问。另外,其在安全性能方面也有一定的改善,在sqoop1中我们经常用脚本的方式将HDFS中的数据导入到mysql中,或者反过来将mysql数据导入到HDFS中,其中在脚本里边都要显示指定mysql数据库的用户名和密码的,安全性做的不是太完善。在sqoop2中,如果是通过CLI方式访问的话,会有一个交互过程界面,你输入的密码信息不被看到。

sqoop他人使用总结:

在sqoop2的升级部署以及使用的过程中有诸多吐槽的地方。第一,sqoop2的部署相比于sqoop1复杂的多,虽然官方网站中的install guide中的文档还是比较详细的,但是其中没有考虑到hadoop和sqoop webSite包冲突问题,以及没有对在部署过程中有可能出现的问题进行相关提示。第二,sqoop2和sqoop1的兼容性问题没有做到很好的处理,这个是我个人最不能忍受的地方。
其中,体现的最明显的地方就是,之前我在公司写项目的时候是用sqoop1的import或者export脚本去实现HDFS和RDBMS之间的数据转移的,现在我将sqoop1升级到sqoop2之后,import和export脚本再也无法使用了,这样的话我不得不重新将在项目中用sqoop1中的import和export脚本实现的功能用JAVA API去重新编写,这样使得升级超级不平滑,我认为这个是sqoop2做的最不好的地方。

sqoop1安装部署

安装一个节点即可,本次安装在hadoop01

根据sqoop1和sqoop2区别,和官网里的一句话:

Note that 1.99.7 is not compatible with 1.4.7 and not feature complete, it is not intended for production deployment.

最后决定使用sqoop稳定版,当前时间点(2017/05/07)最新的sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz sqoop前提环境:

linux系统、jdk、hadoop

1)配置
上传sqoop-1.4.7.tar.gz到ubuntu16.04
cd /usr/software
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
出现目录:sqoop-1.4.7.bin__hadoop-2.6.0,加软连接:ln -s sqoop-1.4.7.bin__hadoop-2.6.0 sqoop
把mysql的jdbc驱动mysql-connector-java-5.1.46.jar复制到sqoop项目的lib目录下
☆基础框架的generatorConfig.xml中使用的是mysql-connector-java-5.1.30.jar
配置环境变量:
vim /etc/profile
export SQOOP_HOME=/usr/software/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
export LOGDIR=$SQOOP_HOME/logs
source /etc/profile
修改sqoop-env.sh:
cd /usr/software/sqoop/conf
cp -r sqoop-env-template.sh sqoop-env.sh
vim flume-env.sh
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HBASE_HOME=${HBASE_HOME}
export HIVE_HOME=${HIVE_HOME}
export ZOOCFGDIR=${ZOOKEEPER_HOME}/conf
保存sqoop-env.sh

2)sqoop测试

sqoop version或sqoop help    
正确显示版本号,但是出现警告:    
Warning: /usr/software/sqoop/../hcatalog does not exist! HCatalog jobs will fail.    
Please set $HCAT_HOME to the root of your HCatalog installation.    
Warning: /usr/software/sqoop/../accumulo does not exist! Accumulo imports will fail.    
Please set $ACCUMULO_HOME to the root of your Accumulo installation.    
Warning: /usr/software/sqoop/../zookeeper does not exist! Accumulo imports will fail.    
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.    
前两个警告因为集群没有安装HCatalog和Accumulo导致    
修改sqoop安装目录bin文件夹下的configure-sqoop文件,找到如下位置并注释    
## Moved to be a runtime check in sqoop.    
#if [ ! -d "${HCAT_HOME}" ]; then    
  #echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."    
  #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 will fail."    
  #echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'    
#fi    
#if [ ! -d "${ZOOKEEPER_HOME}" ]; then    
  #echo "Warning: $ZOOKEEPER_HOME does not exist! Accumulo imports will fail."    
  #echo 'Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.'    
#fi    
注释三部分

a.测试连接:
cd /usr/software/sqoop/bin
sqoop list-databases --connect jdbc:mysql://hadoop01:3306/ -username root -P

root@hadoop01:/usr/software/sqoop/bin# /usr/local/bin/ndb_mgm -e show    
Connected to Management Server at: 10.10.100.19:1186    
Cluster Configuration    
---------------------    
[ndbd(NDB)]    3 node(s)
id=6    @10.10.100.19  (mysql-5.7.17 ndb-7.5.5, Nodegroup: 0, *)
id=7    @10.10.100.18  (mysql-5.7.17 ndb-7.5.5, Nodegroup: 0)
id=8    @10.10.100.17  (mysql-5.7.17 ndb-7.5.5, Nodegroup: 0)
    
[ndb_mgmd(MGM)]    1 node(s)
id=1    @10.10.100.19  (mysql-5.7.17 ndb-7.5.5)
    
[mysqld(API)]    7 node(s)
id=21    @10.10.100.19  (mysql-5.7.17 ndb-7.5.5)
id=22    @10.10.100.18  (mysql-5.7.17 ndb-7.5.5)
id=23    @10.10.100.17  (mysql-5.7.17 ndb-7.5.5)
id=24    @10.10.100.16  (mysql-5.7.17 ndb-7.5.5)
id=25    @10.10.100.15  (mysql-5.7.17 ndb-7.5.5)
id=26 (not connected, accepting connect from any host)    
id=27 (not connected, accepting connect from any host)    
    
sqoop list-tables --connect jdbc:mysql://hadoop01:3306/test_mysqlcluster -username root -P    
连接成功!!

 b.使用Sqoop导入数据到HDFS

create table test01(test01_id INT NOT NULL AUTO_INCREMENT,test01_name VARCHAR(20) NOT NULL,PRIMARY KEY(test01_id));    
create table test02(test02_id INT NOT NULL AUTO_INCREMENT,test02_name VARCHAR(20) NOT NULL,PRIMARY KEY(test02_id));    
insert into test01 values ('0','mike');    
insert into test01 values ('1','michael');    
insert into test01 values ('2','green');    
insert into test01 values ('3','lebron');    
insert into test01 values ('4','cury');    
insert into test02 values ('0','durent');    
insert into test02 values ('1','jordan');    
insert into test02 values ('2','porl');    
insert into test02 values ('3','back');    
insert into test02 values ('4','plan');    
insert into test02 values ('5','heihei');    
    
sqoop import --connect jdbc:mysql://hadoop01:3306/test_mysqlcluster -username root -P --table test01 --target-dir /user/sqoop/test -m 4

-m 表示Map并发数    
若是不写--target-dir 则默认是hdfs上的user/username/tablename 路径    
如果重复执行,会提示目录已经存在,可以手动删除

执行成功!!

c.把HDFS中数据导入到Mysql表中,mysql中需要预先建立空表

sqoop export --connect jdbc:mysql://hadoop01:3306/test_mysqlcluster --table test01 --username root -P --export-dir hdfs://mycluster1/user/sqoop/test/

执行成功!!
查看表中存在导入的数据!!
以上是sqoop简易测试~~ 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戰士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值