执行Sqoop作业创建命令时出现系列警告,寻求解决方案
用户执行的Sqoop作业创建命令:
sqoop job --create parjob -- import --connect jdbc:mysql://ms.itversity.com/nyse_export --username nyse_user --password itversity --table finalj --m 1 --target-dir /user/cloudera/fidir --incremental append --check-column id --last-value 0
针对出现的各类警告,逐个给出解决方案:
1. HCatalog/Accumulo路径不存在警告
警告内容
Warning: /opt/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /opt/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
处理方案
- 若未使用HCatalog/Accumulo:这类警告不影响当前作业执行,可直接忽略。如果想彻底消除警告,在
~/.bashrc或~/.bash_profile中添加环境变量:
执行export HCAT_HOME=/opt/sqoop/hcatalog export ACCUMULO_HOME=/opt/sqoop/accumulosource ~/.bashrc生效后,Sqoop不会再默认查找相对路径,警告消失。 - 若需要使用HCatalog/Accumulo:确认集群内已安装对应组件,找到其安装根目录,替换上述环境变量中的路径即可。比如HCatalog通常属于Hive子组件,路径可能为
/opt/hive/hcatalog。
2. SLF4J多绑定冲突警告
警告内容
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.3.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
处理方案
该警告是Hadoop与Hive依赖包中包含不同版本的SLF4J日志绑定导致的:
- 若无需Hive相关功能:直接删除Hive路径下的冲突jar包,比如删除
/opt/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar。 - 若需要Hive功能:保留一个版本的绑定包即可,推荐保留Hadoop中的
slf4j-log4j12-1.7.25.jar,删除Hive侧的冲突包;也可调整Sqoop的classpath优先级,让Hadoop的包先加载。 - 注:该警告仅影响日志输出逻辑,不会中断作业执行,若对日志无特殊要求可忽略。
3. 命令行密码输入不安全警告
警告内容
2022-11-06 08:26:54,565 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
处理方案
为避免密码泄露在命令历史或进程列表中,有两种优化方式:
- 交互式输入:将命令中的
--password itversity替换为-P,执行时会弹出密码输入提示:sqoop job --create parjob -- import --connect jdbc:mysql://ms.itversity.com/nyse_export --username nyse_user -P --table finalj --m 1 --target-dir /user/cloudera/fidir --incremental append --check-column id --last-value 0 - 非交互式执行(脚本场景):将密码写入权限为
400的文件(仅所有者可读),用--password-file参数引用,比如:sqoop job --create parjob -- import --connect jdbc:mysql://ms.itversity.com/nyse_export --username nyse_user --password-file /home/cloudera/sqoop_pass.txt --table finalj --m 1 --target-dir /user/cloudera/fidir --incremental append --check-column id --last-value 0
内容的提问来源于stack exchange,提问作者Raja

