基本使用
如下面这个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 '\001'
执行这个脚本之后,导入程序就完成了。
接下来,用户可以自己创建外部表,将外部表的路径和HDFS中存放Oracle数据的路径对应上即可。
注意:这个程序导入到HDFS中的数据是文本格式,所以在创建Hive外部表的时候,不需要指定文件的格式为RCFile,而使用默认的TextFile 即可。数据间的分隔符为'\001'.如果多次导入同一个表中的数据,数据以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 '\001' --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 '\001' --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 <= id < 250;
select * from table where 250 <= id < 500;
select * from table where 500 <= id < 750;
select * from table where 750 <= id < 1000;
注意,这个拆分的字段需要是整数。
从上面的例子可以看出,如果需要导入的表没有主键,我们应该如何手动选取一个合适的拆分字段,以及选择合适的并行数。
再举一个实际的例子来说明:
我们要从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 '\001' --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 '\001' --where "data_desc='2011-02-26' logtime<10:00:00"
sqoop import --append --connect $CONNECTURL --username $ORACLENAME --password $ORACLEPASSWORD --target-dir $hdfsPath --m 1 --table $oralceTableName --columns $columns --fields-terminated-by '\001' --where "data_desc='2011-02-26' logtime>=10:00:00"
从而达到并行导入的目的。
分享到:
相关推荐
### Sqoop将SQLServer数据表导入HDFS #### 一、引言 随着大数据技术的发展,数据集成成为了处理异构数据源的关键环节之一。Sqoop作为一款开源工具,旨在简化传统的关系型数据库(如SQL Server)与Hadoop生态系统...
### Sqoop导入数据到HDFS路径详解 #### 一、Sqoop简介 ...通过以上详细解析和说明,我们不仅了解了如何使用Sqoop将数据从MySQL导入到HDFS中,还学习了一些高级用法和注意事项,这对于实际操作中解决问题非常有帮助。
在本主题中,我们将深入探讨 Sqoop 的导入功能,特别是如何将数据从 MySQL 和 Sybase 数据库导入到 HDFS,并进一步加载到 Hive 表中。 ### 一、Sqoop 导入介绍 1. **语法结构**: Sqoop 导入数据的基本语法如下:...
本文档将详细介绍如何使用Apache Sqoop工具将数据从本地数据库导入到HDFS,并提供具体的命令示例及操作步骤。 #### 一、Apache Sqoop简介 Apache Sqoop是一款开源工具,用于高效地在Hadoop和关系型数据库之间传输...
当使用Sqoop将数据导入Hive时,有时可能会遇到数据不一致的问题,这可能是由于多种原因引起的。本文将深入探讨这个问题,并提供可能的解决方案。 Sqoop是一个用于在关系数据库和Hadoop之间传输数据的工具,它可以...
Hadoop-Sqoop-Oracle 使用Sqoop在Oracle数据库和HDFS之间进行导入和导出 ... 可以将来自外部系统的数据导入HDFS并以Hive表和HBase表等各种Hadoop文件格式保存。 Sqoop v2仅支持保存到HDFS 在所有与JDBC
Sqoop使用JDBC(Java数据库连接)连接到RDBMS,并自动生成一个Java类将数据导入HDFS。Sqoop功能包括导入单个表或数据库中的所有表、指定导入哪些行、列、提供任意的SELECT语句等。 Hadoop提供的REST接口 Hadoop...
若不进行上述配置,在尝试将数据导入HDFS时可能会遇到类似`Caused by: org.apache.sqoop.common.SqoopException: GENERIC_HDFS_CONNECTOR_0007: Invalid input/output directory - Unexpected exception`的异常。...
它的主要功能是将结构化数据从传统数据库导入到 Hadoop 的 HDFS(Hadoop Distributed File System),或者从 HDFS 导出回数据库。在大数据处理场景中,Sqoop 起到了连接传统数据存储和分布式计算框架的桥梁作用。 ...
3. 数据分析:Sqoop 工具可以将数据导入到 HDFS 中,进行数据分析。 Sqoop 工具的发展至今主要演化了二大版本,Sqoop1 和 Sqoop2,我们以 Sqoop1 为案例进行讲解,Sqoop2 商用不太稳定。 Sqoop 工具是一个非常...
[hadoop] 将关系数据库导入到HDFS的工具 Sqoop
总结来说,Sqoop在星环大数据平台中扮演着数据导入导出的关键角色,能够高效地将数据从关系数据库迁移到Hadoop环境,或者反向操作,是构建大数据平台不可或缺的分布式ETL工具之一。通过本次培训,学员们将能够学会...
把关系型数据库的数据导入到Hadoop系统(如HDFS,Hbase和Hive中) 把数据从Hadoop系统里面抽取并导出到关系型数据库中 利用MapReduce加快数据处理速度 ·批处理方式进行数据传输 Sqoop 优势 ·¬高效、可控地利用资源 ...
在Sqoop中,这个驱动用于建立从Java环境到SQL Server的数据连接,从而读取数据库中的数据并准备导入到HDFS。 其次,`sqoop-sqlserver-1.0.tar.gz`是Sqoop针对SQL Server的特定适配器包。 Sqoop本身支持多种RDBMS,...
本实验的主要目的就是熟悉Sqoop数据集成,通过安装和配置Sqoop、MySQL数据库,并使用Sqoop工具将数据从MySQL数据库中导入到HDFS中。 一、实验准备 在进行实验之前,需要准备好实验用的硬件和软件环境。硬件环境...
首先,Sqoop不仅支持将数据从关系型数据库如MySQL导入到HDFS或Hive,还能直接导入到HBase。关键在于正确使用参数: 1. `--hbase-table`:此参数用于指定导入的数据应存储在哪个HBase表中。不指定的话,数据将被导入...
3. **MapReduce作业**: Sqoop启动MapReduce作业,使用DataDrivenDBInputFormat将数据划分给多个Map任务,通常选择主键作为划分列以提高性能。 4. **数据处理**: Map任务执行SQL查询,将ResultSet中的数据反序列...
3. Sqoop会生成MapReduce作业,执行数据导入过程,将数据从MySQL导入到HDFS。 ### 三、数据导出:HDFS->MySQL 1. 数据导出是逆向操作,使用`sqoop export`命令,指定HDFS中数据的路径,数据库连接参数,以及要写入...
Sqoop 是一个用于在 Hadoop 和关系型数据库之间进行数据导入导出的工具,它使得在大数据处理场景下,能够方便地将结构化的数据从 MySQL 这样的 RDBMS(关系型数据库管理系统)转移到 Hadoop 的 HDFS(Hadoop 分布式...
本文档旨在帮助读者理解如何使用Sqoop2的Java API将数据从Oracle数据库迁移至Hadoop分布式文件系统(HDFS)。为了顺利完成这一过程,本文档提供了一套详细的操作指南,包括环境搭建、命令熟悉以及API开发等环节。...