在 sqoop 中指定多个泛型参数的正确方法是啥

Posted

技术标签:

【中文标题】在 sqoop 中指定多个泛型参数的正确方法是啥【英文标题】:What is the correct way to specify multiple generic arguments in sqoop在 sqoop 中指定多个泛型参数的正确方法是什么 【发布时间】:2018-03-07 08:34:09 【问题描述】:

查看文档,我读到可用的通用参数列表是:

Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|jobtracker:port>    specify a job tracker
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.

我想在 sqoop 命令中指定以下两个属性:

mapred.job.queuename=batch 
mapred.child.java.opts="\-Djava.security.egd=file:///dev/urandom" 

所以我这样写了我的导入 sqoop 脚本:

sqoop import -Dmapred.job.queuename=batch \
        mapred.child.java.opts="\-Djava.security.egd=file:///dev/urandom" \
        --connect $connection \
        --username $username\
        --password $password \
        --table $sourceTable \
        --columns "$columns"\
        --hive-import \
        --hive-overwrite \
        --hive-table $targetTable \
        --compression-codec org.apache.hadoop.io.compress.SnappyCodec \
        --hive-delims-replacement "SPECIAL" \
        --null-string '\\N' \
        --null-non-string '\\N' \
        -m 1

但它不起作用......

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hdp/2.6.4.0-91/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/2.6.4.0-91/accumulo/lib/slf4j-log4j12.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
18/03/07 08:00:04 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6.2.6.4.0-91
18/03/07 08:00:04 ERROR tool.BaseSqoopTool: Error parsing arguments for import:
18/03/07 08:00:04 ERROR tool.BaseSqoopTool: Unrecognized argument: mapred.child.java.opts=\-Djava.security.egd=file:///dev/urandom
18/03/07 08:00:04 ERROR tool.BaseSqoopTool: Unrecognized argument: --connect

我也想过做以下事情

sqoop import \
        -D mapred.job.queuename=batch \
        -D mapred.child.java.opts="\-Djava.security.egd=file:///dev/urandom" \
        --connect $connection \
        --username $username \
        --password $password \
        --table $sourceTable \
        --columns "$columns"\
        --hive-import \
        --hive-overwrite \
        --hive-table $targetTable \
        --compression-codec org.apache.hadoop.io.compress.SnappyCodec \
        --hive-delims-replacement "SPECIAL" \
        --null-string '\\N' \
        --null-non-string '\\N' \
        -m 1

但恐怕只有两个 -D 泛型参数中的一个会被解析。

这样做的正确方法是什么?

【问题讨论】:

-D后面不需要空格,两者都要解析 【参考方案1】:

Java D 标志在属性后不需要空格

sqoop import \
    -Dmapred.child.java.opts="-Djava.security.egd=file:///dev/urandom" \
    -Dmapred.job.queue.name=batch \

还修复了您的队列名称属性

【讨论】:

以上是关于在 sqoop 中指定多个泛型参数的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

在清单文件中指定意图操作的正确方法是啥?

如何在Kotlin中指定递归泛型参数?

Java 泛型了解嘛?

在 prometheus 的 alert_rules.yml 文件中指定的正确规则应该是啥

php返回数组中指定的一列方法是啥?

使用 Sqoop 将数据从 RDBMS 导入 Hive 时,如何在命令行中指定 Hive 数据库名称?