• 针对sqoop1.99.6 从jdbc向hdfs中抽取数据的几点感想


    最近在用sqoop1.99.6做数据抽取,期间遇到了很多问题,特此在这里记录一下,方便以后的回顾与整理

    1.首先配置的时候,需要配置hdfs的lib目录到catalina.properties

    common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/../lib/*.jar,/usr/lib/hadoop/*.jar,/usr/lib/hadoop/lib/*.jar,/usr/lib/hadoop-hdfs/*.jar,/usr/lib/hadoop-hdfs/lib/*.jar,/usr/lib/hadoop-mapreduce/*.jar,/usr/lib/hadoop-mapreduce/lib/*.jar,/usr/lib/hadoop-yarn/*.jar,/usr/lib/hadoop-yarn/lib/*.jar,/usr/lib/hive/lib/*.jar

    在sqoop.properties中配置logs目录与db的目录

    2.配置完后即可启动sqoop(应先启动hadoop)

    3.创建一个sqoop任务需要先创建link,在1.99.6中需创建一个

    fromlink,和tolink。

    create link -cid 1
    create link -cid 3
    

     这两行命令是分别创建一个jdbclink 和一个hdfs link

    jdbclink 需要填写一些参数:一定需要填写的参数为connectString,database user database password

    hdfs link需要填写的参数为:hdfs的url :hdfs://namenode:9000/

    在设置好这些参数以后就可以进行连接了。

    本人测试过mysql连接和oracle连接。

    oracle连接的连接参数可以用sid进行连接:jdbc:oracle:thin:@IP:Port:orcl

    在构建了link 后就可以构建job了。

    create job -f 1 -t 2
    

     需填写的参数为

    Name:可不填

    From database configuration

    Schema name:

    Table name:

    Table SQL statement:

    Table Columns name:

    ...

    To HDFS configuration

    ...

    output format:

    compression format:

    ...

    Output directory:

    ...

    在这里要着重写一下几个参数的意义。特别是在数据库一端的设置。

    (Schema name,Table name)和Table SQL statement 不能同时设置,这是为了防止表名不同一造成的问题。

    Table Columns name可以设置要抽取的列名。基本格式为:COL1,COL2,COL3  .因为Table Columns name的长度有一个变态的设置,就是这个字符串长度不能超过50.所以基本上设置不了几列。在这里,我通过查找源码发现了Table SQL statement的用法,其实可以说他的存在就是为了解决上面的问题。首先我们可以看到源码里sql的size为2000.所以有足够的长度。但是之前试了好多种sql的写法,发现总是不成功。于是对sqoop各种吐槽。。。

    后来终于发现它的基本写法是这样子滴:SELECT ID,COL1,COL2,COL3 FROM SCHEMA.TABLE WHERE ${CONDITIONS}

    那个${CONDITIONS}只是个占位符,没有什么用处,它在源码里会被替换成1=1

    这样子就解决了COLUMNS设置的问题。

    再来讲解一下

    Partition column name 一般可设置为ID,它的作用就是为了并行处理做准备的。sqoop通过获取Partition column的最大值和最小值对数据库表进行切割,分块读取数据(这样很有可能导致任务之间的不平衡)。

    为了解决这个问题,可以用Boundary Query来解决分块的问题,这部分我还没有研究。

    最后一个问题,sqoop现在列之间的分隔符用的是“,”而不是“ ”,而且在外部已经不能手动去改了,它在代码里写死了。要改的话可以通过重新编译源代码的方式进行修改。

    那个类是org.apache.sqoop.connector.hdfs.HdfsConstants

    对于sqoop的学习暂且先记到这里。

  • 相关阅读:
    XTU 1250 Super Fast Fourier Transform
    XTU 1249 Rolling Variance
    XTU 1243 2016
    CodeForces 710A King Moves
    CodeForces 710B Optimal Point on a Line
    HDU 4472 Count
    并查集
    高精度四件套
    Kruskal最小生成树
    [蓝桥杯]翻硬币(贪心的详解附带题目测试链接)
  • 原文地址:https://www.cnblogs.com/yulijunzj/p/5341534.html
Copyright © 2020-2023  润新知