利用Sqoop将数据从数据库导入到HDFS

#Oracle的连接字符串,其中包含了Oracle的地址,SID,和端口号CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2#使用的用

基本使用

如下面这个shell脚本:

#Oracle的连接字符串,其中包含了Oracle的地址,SID,和端口号
CONNECTURL=jdbc:oracle:thin:@20.135.60.21:1521:DWRAC2
#使用的用户名
ORACLENAME=kkaa
#使用的密码
ORACLEPASSWORD=kkaa123
#需要从Oracle中导入的表名
oralceTableName=tt
#需要从Oracle中导入的表中的字段名
columns=AREA_ID,TEAM_NAME
#将Oracle中的数据导入到HDFS后的存放路径
hdfsPath=apps/as/hive/$oralceTableName

#执行导入逻辑。将Oracle中的数据导入到HDFS中
sqoop import –append –connect $CONNECTURL –username $ORACLENAME –password $ORACLEPASSWORD –target-dir $hdfsPath  –num-mappers 1 –table $oralceTableName –columns $columns –fields-terminated-by ”

执行这个脚本之后,导入程序就完成了。

接下来,用户可以自己创建外部表,将外部表的路径和HDFS中存放Oracle数据的路径对应上即可。

注意:这个程序导入到HDFS中的数据是文本格式,所以在创建Hive外部表的时候,不需要指定文件的格式为RCFile,而使用默认的TextFile即可。数据间的分隔符为”。如果多次导入同一个表中的数据,数据以append的形式插入到HDFS目录中。

并行导入

假设有这样这个sqoop命令,需要将Oracle中的数据导入到HDFS中:

sqoop import –append –connect $CONNECTURL –username $ORACLENAME –password $ORACLEPASSWORD –target-dir $hdfsPath  –m 1 –table $oralceTableName –columns $columns –fields-terminated-by ”  –where “data_desc=’2011-02-26′”

请注意,在这个命令中,,有一个参数“-m”,代表的含义是使用多少个并行,这个参数的值是1,说明没有开启并行功能。

现在,我们可以将“-m”参数的值调大,使用并行导入的功能,如下面这个命令:

sqoop import –append –connect $CONNECTURL –username $ORACLENAME –password $ORACLEPASSWORD –target-dir $hdfsPath  –m 4 –table $oralceTableName –columns $columns –fields-terminated-by ”  –where “data_desc=’2011-02-26′”

一般来说,Sqoop就会开启4个进程,同时进行数据的导入操作。

但是,如果从Oracle中导入的表没有主键,那么会出现如下的错误提示:

ERROR tool.ImportTool: Error during import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with –split-by or perform a sequential import with ‘-m 1’.

在这种情况下,为了更好的使用Sqoop的并行导入功能,我们就需要从原理上理解Sqoop并行导入的实现机制。

如果需要并行导入的Oracle表的主键是id,并行的数量是4,那么Sqoop首先会执行如下一个查询:

select max(id) as max, select min(id) as min from table [where 如果指定了where子句];

通过这个查询,获取到需要拆分字段(id)的最大值和最小值,假设分别是1和1000。

然后,Sqoop会根据需要并行导入的数量,进行拆分查询,比如上面的这个例子,并行导入将拆分为如下4条SQL同时执行:

select * from table where 0

select * from table where 250

select * from table where 500

select * from table where 750

注意,这个拆分的字段需要是整数。

从上面的例子可以看出,如果需要导入的表没有主键,我们应该如何手动选取一个合适的拆分字段,以及选择合适的并行数。

再举一个实际的例子来说明:

我们要从Oracle中导入creater_user.popt_cas_redirect_his。

这个表没有主键,所以我们需要手动选取一个合适的拆分字段。

首先看看这个表都有哪些字段:

然后,我假设ds_name字段是一个可以选取的拆分字段,然后执行下面的sql去验证我的想法:

select min(ds_name), max(ds_name) from creater_user.popt_cas_redirect_his where data_desc=’2011-02-26′

发现结果不理想,min和max的值都是相等的。所以这个字段不合适作为拆分字段。

再测试一下另一个字段:CLIENTIP
select min(CLIENTIP), max(CLIENTIP) from creater_user.popt_cas_redirect_his where data_desc=’2011-02-26′

这个结果还是不错的。所以我们使用CLIENTIP字段作为拆分字段。

所以,我们使用如下命令并行导入:

sqoop import –append –connect $CONNECTURL –username $ORACLENAME –password $ORACLEPASSWORD –target-dir $hdfsPath  –m 12 –split-by CLIENTIP –table $oralceTableName –columns $columns –fields-terminated-by ”  –where “data_desc=’2011-02-26′”

这次执行这个命令,可以看到,消耗的时间为:20mins, 35sec,导入了33,222,896条数据。

另外,如果觉得这种拆分不能很好满足我们的需求,可以同时执行多个Sqoop命令,然后在where的参数后面指定拆分的规则。如:

sqoop import –append –connect $CONNECTURL –username $ORACLENAME –password $ORACLEPASSWORD –target-dir $hdfsPath  –m 1 –table $oralceTableName –columns $columns –fields-terminated-by ”  –where “data_desc=’2011-02-26′ logtime

sqoop import –append –connect $CONNECTURL –username $ORACLENAME –password $ORACLEPASSWORD –target-dir $hdfsPath  –m 1 –table $oralceTableName –columns $columns –fields-terminated-by ”  –where “data_desc=’2011-02-26′ logtime>=10:00:00”

从而达到并行导入的目的。

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1933067.html

(0)
上一篇 2025年2月22日 22:05:52
下一篇 2025年2月22日 22:06:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Sqoop配置安装

    Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等) Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个…

    数据库 2025年2月23日
    100
  • CentOS 5.6下利用Sqoop将hive数据导入导出数据到MySQL

    运行环境 CentOS 5.6 hadoop hivesqoop是让hadoop技术支持的clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出 首页 → 数据库技术 背景: 阅读新闻 centos 5.6下利用sqo…

    数据库 2025年2月23日
    100
  • 使用Sqoop在HDFS和RDBMS之间导数据

    SQOOP是一款开源的工具,主要用于在HADOOP与传统的数据库间进行数据的传递,下面从SQOOP用户手册上摘录一段描述 SQOOP是一款开源的工具,主要用于在Hadoop与传统的数据库间进行数据的传递,,下面从SQOOP用户手册上摘录一段…

    数据库 2025年2月23日
    100
  • 用Sqoop导入数据到Hive中

    用Sqoop导入数据到Hive中,从postgresql中导入大表到hive中会出现jvm内存溢出的错误,这是sqoop1.2及以前版本的一个bug,它把整个 1 安装sqoop 下载sqoop-1.2.0.tar.gz(1.20版兼容Ha…

    数据库 2025年2月22日
    200
  • 如何利用Sqoop实现MySQL与云数据库服务器的连接?

    要连接MySQL云数据库服务器,首先需要确保有正确的主机名、端口号、用户名和密码。然后使用MySQL客户端或相应的库进行连接。对于Sqoop,可以通过在命令行中指定连接参数来连接到MySQL数据库,并执行数据导入导出操作。 在连接云数据库服…

    服务器 2025年2月15日
    300
  • 1月28日以后出差算不算返乡

    冬季因为天气的缘故,很多地区都被新冠肺炎杀了个回马枪,而当下正值春运,为了防止疫情扩散很多地区对返乡人员都进行了严控,那么1月28日以后出差算不算返乡?返乡人员如何界定?一起看看吧。 1月28日以后出差算不算返乡 1对于月28日以后出差算不…

    2025年1月31日
    694.7K00

发表回复

登录后才能评论