`
x10232
  • 浏览: 55545 次
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
基本使用

    如下面这个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将关系型数据库,导入到hadoop集群中,供大家参考,一起学习。

    2、sqoop导入(RMDB-mysql、sybase到HDFS-hive)

    2、sqoop导入(RMDB-mysql、sybase到HDFS-hive) 网址:https://blog.csdn.net/chenwewi520feng/article/details/130572275 介绍sqoop从关系型数据库mysql、sybase同步到hdfs、hive中

    导入到hDFS的工具步骤讲解.png

    [hadoop] 将关系数据库导入到HDFS的工具 Sqoop

    Hadoop-Sqoop-Oracle:使用Sqoop在Oracle数据库和HDFS之间进行导入和导出

    Hadoop-Sqoop-Oracle 使用Sqoop在Oracle数据库和HDFS之间进行导入和导出 ... 可以将来自外部系统的数据导入HDFS并以Hive表和HBase表等各种Hadoop文件格式保存。 Sqoop v2仅支持保存到HDFS 在所有与JDBC

    大数据开发中的Sqoop学习笔记(自己整理版).pdf

    笔记中详解介绍了在大数据开发学习过程中Sqoop相关知识点。 包括Sqoop概述;...从mysql导入hdfs可以指定在hdfs上存储格式等等内容。 希望对有需要的朋友有所帮助,如有疑问,可以私信;整理不易,多多支持!

    sqoop工具_202006041735481.docx

    Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行...Sqoop 还能够将 DB2 数据库的数据导入到 HDFS 上,并保存为 多种文件类型。常见的有定界文本类型,Avro 二进制类型以及 Sequence Files 类型。

    Sqoop同步数据命令

    Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以使用Sqoop将数据从MySQL或Oracle等关系数据库管理系统(RDBMS)导入Hadoop分布式文件系统(HDFS),在Hadoop MapReduce中转换数据,然后将数据...

    大数据-sqoop.pptx

    将数据从 RDBMS 导入 HDFS 在 Hive 中使用相应的工具和命令(例如 LOAD DATA 语句),手动将数据载入 Hive 或 Hbase 大数据-sqoop全文共16页,当前为第4页。 Sqoop版本区别 功能 Sqoop1 Sqoop2 数据从 Hive 或 ...

    Apache Hadoop---Sqoop.docx

    Sqoop可以将一个关系型数据库(例如MySQL、Oracle、PostgreSQL等)中的数据导入Hadoop的HDFS、Hive中,也可以将HDFS、Hive中的数据导入关系型数据库中。Sqoop充分利用了Hadoop的优点,整个数据导入导出过程都是用...

    sqoop安装详解以及sqoop介绍

    sqoop安装详解以及sqoop内容介绍使用介绍 ...2、导入数据:从结构化数据(Mysql,oracle,db2,)导入到半结构化或非结构化hadoop中(HDFS、HIVE、HBASE) 3、导出数据:从haoop中将数据导出到关系数据库中MySql

    大数据运维技术第9章 Sqoop组件安装配置.pptx

    它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。Sqoop由Apache软件基金会提供。;9.2 Sqoop功能应用;9.2.1 Sqoop架构;;;;9.2.2 Sqoop导入原理; JDBC的ResultSet...

    sqoop官方文档学习笔记

    Sqoop是一个用于在Hadoop和关系...您可以使用Sqoop将关系数据库管理系统(RDBMS)(如MySQL或Oracle或大型机)中的数据导入Hadoop分布式文件系统(HDFS),转换Hadoop MapReduce中的数据,然后将数据导出回RDBMS 。

    java连接sqoop源码-certification-exercises:理论侧重于CCASpark和Hadoop开发人员认证所需的技能

    将数据从 MySQL 数据库导入 HDFS 帮助允许您查看所有工具的列表 sqoop help list-tables列出数据库的所有表 sqoop list-tables \ --connect jdbc:mysql://dbhost/database1 \ --username dbuser \ --password pw ...

    sqoop-1.4.6.bin__hadoop-2.0.4-alpha安装包

    Sqoop是一个用于在Hadoop和关系数据库或大型机之间传输数据的...您可以使用Sqoop将关系数据库管理系统(RDBMS)中的数据导入Hadoop分布式文件系统(HDFS),转换Hadoop MapReduce中的数据,然后将数据导出回RDBMS 。

    Hive 0.12.0安装文档.wps

    Hive 0.12.0安装文档.wps HIVE进行数据计算到HDFS,通过sqoop导入到ORACLE数据库!

    sqoop:Apache Sqoop的镜像

    Sqoop允许在数据库和HDFS之间轻松导入和导出数据集。更多文件Sqoop附带其他文档:用户指南和手册页。 两者的asciidoc来源都在src/docs/ 。 运行ant docs以构建文档。 它将在build/docs/创建。 如果您以发布形式获得...

    【63课时完整版】大数据实践HIVE详解及实战

    29.Sqoop将MySQL数据导入到HDFS(一) 30.Sqoop将MySQL数据导入到HDFS(二) 31.Sqoop中的增量导入与Sqoop job 32.Sqoop将MySQL数据导入Hive表中 33.Sqoop的导出及脚本中使用的方式 34.案例分析-动态分区的实现 35....

    在Hadoop集群环境中为MySQL安装配置Sqoop的教程

    Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。 一、安装sqoop 1、下载sqoop压缩包,并解压 压缩包分别是:sqoop-1.2.0-CDH3B4.tar.gz,hadoop-0.20.2-CDH3B4.tar.gz, ...

    bigdatas:这是一个db-hdfs工具,用于将大型数据库数据传输到诸如sqoop之类的hadoop hdfs,但是bboss bigdata工具是非常好的监视器和事件驱动模型,并且性能高,支持分布式执行程序任务

    1.实现db到hadoop hdfs数据导入功能,提供高效的分布式并行处理能力,可以采用数据库分区、按字段分区、数据库分区结合字段分区、分页(不建议)四种方式并行批处理抽取db数据到hdfs文件系统中;2.能有效解决按字段...

    project-rhino:增强了针对Apache Hadoop生态系统的数据保护

    犀牛计划 随着Hadoop扩展到新市场并看到新的用例面临安全性和合规性挑战,必须在所有Hadoop项目和HBase中处理敏感和受法律保护的数据的好处与对私有信息的保护相结合,...Sqoop:从关系数据库导入数据 这些核心组件以及

Global site tag (gtag.js) - Google Analytics