• 自定义扩展Sqoop的使用教程


    开发API参考
    外部API
    Sqoop通过配置自动生成把关系型数据库导入Hadoop系统的类。该类包含导入Hadoop的每个字段。该类的实例保存表的一行数据。生成的类实现Hadoop中使用的序列化Api,即 Writable 和 DBWritable 接口。以及其他方法:

    一个解释分隔文本字段的parse()方法
    一个toString()方法,用于保留用户选择的分隔符
    保证在生成的类中完整的方法在抽象类中指定:org.apache.sqoop.lib.SqoopRecord

    SqoopRecord的实例可能依赖于Sqoop的公共API即:org.apache.sqoop.lib.*
    Sqoop的客户端不需要直接与这些类中的任何一个进行交互,尽管Sqoop生成的类将依赖于它们。
    RecordParser类将使用可控的分隔符和引号字符将一行文本解析为字段列表。
    静态FieldFormatter类提供了一种方法,用于处理将在SqoopRecord.toString()实现中使用的字段中的字符的引用和转义
    ResultSet和PreparedStatement对象以及SqoopRecords之间的数据编组是通过JdbcWritableBridge完成的。
    BigDecimalSerializer包含一对方法,这些方法有助于在Writable接口上序列化BigDecimal对象

    开发环境的准备
    官方的源码可以进行阅读查看在对其编译比较麻烦,采用的是把集群上的sqoop-1.4.6.2.6.5.0-292.jar来作为依赖开发。

    先把jar文件添加的本地的maven库中。

    在本机的命令行环境运行

    mvn install:install-file -DgroupId=com.ambari.sqoop -DartifactId=sqoop -Dversion=1.4.6 -Dpackaging=jar -Dfile=D:Develop epositorysqoopsqoop-1.4.6.2.6.5.0-292.jar
    1
    [外链图片转存失败(img-WnOA45HC-1564577503258)(https://www.github.com/Tu-maimes/document/raw/master/小书匠/1544078894416.png)]

    相关参数简介:

    属性 描述
    -DgroupId 项目包名
    -DartifactId 工程名
    -Dversion 版本号
    -Dpackaging 表示文件的类型
    -Dfile 表示所有添加文件的绝对路径
    依赖的pom文件

    <dependency>
    <groupId>com.ambari.sqoop</groupId>
    <artifactId>sqoop</artifactId>
    <version>1.4.6</version>
    </dependency>
     
    开发Sqoop插件
    Sqoop允许用户开发自己的插件。用户可以将他们的插件开发为单独的jar在$SQOOP_LIB中部署它们并使用Sqoop注册。Sqoop架构也是一个基于插件的架构,并且所有的内部工具(导入,导出,合并等)都是作为插件得到支持。用户可以开发自定义工具插件。一旦部署并注册到Sqoop,这些插件就可以像任何其他内部工具一样工作。运行sqoop help命令时,它们也会在工具中列出。

    BaseSqoopTool - 用户定义工具的基类
    继承与重写
    BaseSqoopTool是所有Sqoop工具的基类。如果要开发自定义工具,则需要从BaseSqoopTool继承工具并重写以下方法:

    public int run(SqoopOptions options) :这是该工具的主要方法,并充当自定义工具的执行入口点。
    public void configureOptions(ToolOptions toolOptions):配置我们希望接收的命令行参数。您还可以指定所有命令行参数的描述。当用户执行时 sqoop help ,将以该方法提供的信息输出给用户。
    public void applyOptions(CommandLine in, SqoopOptions out) :解析所有选项并填充SqoopOptions,它在完成执行期间充当数据传输对象。
    public void validateOptions(SqoopOptions options) :提供您的选项所需的任何验证。
    支持用户定义自定义选项
    Sqoop解析用户传递的参数并存储在SqoopOptions对象中。然后,此对象充当数据传输对象。在运行实际的MapReduce,MapReduce阶段甚至后处理阶段之前,此对象被传递到处理的各个阶段。用户自定义了新的工具就会产生一些新的选项,这些选项不会映射到SqoopOptions类的任何现有成员。用户可以向SqoopOption类添加新成员,这意味着用户必须在sqoop中进行更改并对其进行编译,这对所有用户来说都是不可能的。其他选择是使用extraArgs会员。这是一个字符串数组,其中包含可以直接传递给第三方工具(如mysqldump等)的第三方工具选项。此数组字符串每次都需要解析才能理解参数。支持用户定义工具的自定义选项的最优雅方式是 customToolOptionsmap。这是SqoopOption类的映射成员。开发人员可以解析用户定义的参数,并使用适当的键/值对填充此映射。当SqoopOption对象被传递到处理的各个阶段时,这些值将随时可用,并且每次访问都不需要解析。
    示例如下:

    --hbase-col
    --hdfs-line-separator
    --hbase-rowkey-separator
    SqoopOption对象中没有这些选项可用。Tool Developer可以覆盖该applyOptions方法,在此方法中,可以在customToolOptions映射中解析和填充用户选项。完成后,SqoopOption对象可以在整个程序中传递,这些值将可供用户使用。
    public static final String HBASE_COL = "hbase-col";
    public static final String HDFS_LINE_SEPARATOR = "hdfs-line-separator";
    public static final String HBASE_ROWKEY_SEPARATOR = "hbase-rowkey-separator";
     
    下面是解析上述选项并填充customToolOptions映射的示例applyOptions示例:

    @Override
    public void applyOptions(CommandLine in, SqoopOptions out) throws SqoopOptions.InvalidOptionsException {
    try {
    Map<String, String> optionsMap = new HashMap<String, String>();
    super.applyOptions(in, out);
    applyHBaseOptions(in, out);
    if (in.hasOption(EXPORT_PATH_ARG)) {
    out.setExportDir(in.getOptionValue(EXPORT_PATH_ARG));
    }
    if (in.hasOption(HDFS_LINE_SEPARATOR)) {
    optionsMap.put(HDFS_LINE_SEPARATOR, in.getOptionValue(HDFS_LINE_SEPARATOR));
    }
    if (in.hasOption(HBASE_COL)) {
    optionsMap.put(HBASE_COL, in.getOptionValue(HBASE_COL));
    }
    if (in.hasOption(HBASE_ROWKEY_SEPARATOR)) {
    optionsMap.put(HBASE_ROWKEY_SEPARATOR, in.getOptionValue(HBASE_ROWKEY_SEPARATOR));
    }
    if (out.getCustomToolOptions() == null) {
    out.setCustomToolOptions(optionsMap);
    }
    } catch (NumberFormatException nfe) {
    throw new SqoopOptions.InvalidOptionsException("Error: expected numeric argument. Try --help for usage.");
    }
    }
     
    配置我们希望接收的命令行参数。您还可以指定所有命令行参数的描述。

    @Override
    public void configureOptions(ToolOptions toolOptions) {
    super.configureOptions(toolOptions);
    toolOptions.addUniqueOptions(getHBaseOptions());
    RelatedOptions formatOpts = new RelatedOptions(
    "设置相关mapreduce的参数");
    formatOpts.addOption(OptionBuilder.withArgName("dir")
    .hasArg()
    .withDescription("要导出数据的hdfs地址")
    .withLongOpt(EXPORT_PATH_ARG)
    .create());
    formatOpts.addOption(OptionBuilder.withArgName("char")
    .hasArg()
    .withDescription("hdfs数据的行分隔符")
    .withLongOpt(HDFS_LINE_SEPARATOR)
    .create());
    formatOpts.addOption(OptionBuilder.withArgName("char")
    .hasArg()
    .withDescription("hbase的列簇")
    .withLongOpt(HBASE_COL)
    .create());
    formatOpts.addOption(OptionBuilder.withArgName("char")
    .hasArg()
    .withDescription("hbase的复合rowkey的字段分隔符")
    .withLongOpt(HBASE_ROWKEY_SEPARATOR)
    .create());
    toolOptions.addUniqueOptions(formatOpts);
    }
     
    ToolPlugin插件的基类
    开发了Sqoop的扩展工具,你需要使用插件类包装并使用Sqoop注册该插件类。您的插件类应该从org.apache.sqoop.tool.ToolPlugin 和重写getTools()方法扩展 。
    示例如下:

    import org.apache.sqoop.tool.ToolDesc;
    import org.apache.sqoop.tool.ToolPlugin;
    import java.util.Collections;
    import java.util.List;
    public class ExtendHBasePlugin extends ToolPlugin {
    @Override
    public List<ToolDesc> getTools() {
    return Collections
    .singletonList(new ToolDesc("extendHbase", ExtendHBase.class, "HDFS上的数据导入到HBase"));
    }
    }
     
    注册用户的自定义插件
    把自定义的jar文件拷贝到相关集群的./Sqoop/lib目录,并在sqoop-site.xml进行注册。
    <property>
    <name>sqoop.tool.plugins</name>
    <value>org.apache.sqoop.extend.ExtendHBasePlugin</value>
    <description>A comma-delimited list of ToolPlugin implementations
    which are consulted, in order, to register SqoopTool instances which
    allow third-party tools to be used.
    </description>
    </property>
     
    注册结束后再命令行输入:sqoop help 显示自定义的命令即注册成功。

    [外链图片转存失败(img-N13FOIKI-1564577503259)(https://www.github.com/Tu-maimes/document/raw/master/小书匠/1543979172525.png)]

    Sqoop脚本示例
    sqoop extendHbase
    --hbase-table mytable
    --column-family i
    --hbase-row-key GDDM,GDXM
    --export-dir /yss/guzhi/interface/gh.tsv
    --hbase-rowkey-separator _
    --hdfs-line-separator \t
    --hbase-col GDDM,GDXM,BCRQ,CJBH,GSDM,CJSL,BCYE,ZQDM,SBSJ,CJSJ,CJJG,CJJE,SQBH,BS,MJBH
     
    相关配置的简介
    属性 描述
    extendHbase 导出HDFS上的数据到HBase的指令
    hbase-table 要导入的HBase表名称,需要提前建表不支持自动建表
    column-family HBase表的列簇名称
    hbase-row-key HBase表Rowkey的设置,如果是指定多个列作为RowKey,彼此间的分隔符采用逗号间隔
    export-dir 要导出的HDFS上的文件
    hbase-rowkey-separator 如果RowKey采用的是复合列组合的方式的默认采用的分隔符是下划线,可以传递参数替换
    hdfs-line-separator HDFS上的文件数据行的分隔符
    hbase-col HBase的列名称与HDFS上的数据列一一对应,彼此之间采用逗号分隔
    注意:在设置RowKey时多个字段必须在hbase-col设置中必须包含。


    ————————————————
    版权声明:本文为CSDN博主「聆听金生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_41609807/article/details/97960912

  • 相关阅读:
    线程私有关键字配合static使用
    对定义局部变量位置的思考
    获取文件的md5值
    JNI接口的整理
    数兔子问题
    使用XML布局文件和java代码混合控制UI界面
    应用程序类型
    android组成
    封装
    接口
  • 原文地址:https://www.cnblogs.com/javalinux/p/14960514.html
Copyright © 2020-2023  润新知