分享

oozie 如何在shell中调用sqoop

tsubasawzj 发表于 2017-7-11 17:14:01 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 10 17775
在oozie中,sqoop action
import --connect jdbc:mysql://xx.xx.xx.xx:3306/test?tinyInt1isBit=false\&useSSL=false --username test --password test --table table_1 --hive-overwrite --hive-import --hive-table test.table_1 -m 1 --warehouse-dir /user/hadoop/sqoop能成功

但是因为要同步所有 table_ 开头的表,表的数目多而且不定时增加
如果用 import-all-tables 同步整个库,速度太慢
所以想在shell中启动多进程执行sqoop import

在linux服务器中执行下列shell能成功
sqoop import --connect jdbc:mysql://xx.xx.xx.xx:3306/test?tinyInt1isBit=false\&useSSL=false --username test --password test --table table_1 --hive-overwrite --hive-import --hive-table test.table_1 -m 1 --warehouse-dir /user/hadoop/sqoop

但是在oozie的shell中,执行sqoop就报错
java.lang.NullPointerException
        at org.json.JSONObject.<init>(JSONObject.java:144)
        at org.apache.sqoop.util.SqoopJsonUtil.getJsonStringforMap(SqoopJsonUtil.java:43)
        at org.apache.sqoop.SqoopOptions.writeProperties(SqoopOptions.java:776)
        at org.apache.sqoop.mapreduce.JobBase.putSqoopOptionsToConfiguration(JobBase.java:388)
        at org.apache.sqoop.mapreduce.JobBase.createJob(JobBase.java:374)
        at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:256)
        at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:692)
        at org.apache.sqoop.manager.MySQLManager.importTable(MySQLManager.java:127)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:513)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]

请问 如何成功地在oozie的shell中调用sqoop

已有(10)人评论

跳转到指定楼层
sstutu 发表于 2017-7-11 19:00:08
import --connect jdbc:mysql://xx.xx.xx.xx:3306/test?tinyInt1isBit=false\&useSSL=false --username test --password test --table table_1 --hive-overwrite --hive-import --hive-table test.table_1 -m 1 --warehouse-dir /user/hadoop/sqoop
对于斜杠\,使用单引号‘\’或则双引号“\”
回复

使用道具 举报

tsubasawzj 发表于 2017-7-12 10:42:33
sstutu 发表于 2017-7-11 19:00
import --connect jdbc:mysql://xx.xx.xx.xx:3306/test?tinyInt1isBit=false\&useSSL=false --username tes ...

import --connect jdbc:mysql://xx.xx.xx.xx:3306/test?tinyInt1isBit=false --username test --password test --table table_1 --hive-overwrite --hive-import --hive-table test.table_1 -m 1 --warehouse-dir /user/hadoop/sqoop

不是\的问题,我去除了这个按上面的方式跑也是报这个错误的
回复

使用道具 举报

langke93 发表于 2017-7-12 15:40:23
tsubasawzj 发表于 2017-7-12 10:42
import --connect jdbc:mysql://xx.xx.xx.xx:3306/test?tinyInt1isBit=false --username test --password ...

这个问题有点复杂了。而且很多人遇到。在shell中没有问题,oozie中却遇到问题。
排查思路
1 oozie中的lib是否与sqoop相同。对比sqoop/lib以及oozie/lib/xxx/sqoop就可以了
2 oozie中如果是以arg这种方式启动。那么问题很有可能出在query的别名以及split-by参数上.... 因为在sqoop中可以自动推断,但是在oozie中就无法知道字段所属的表了。

回复

使用道具 举报

tsubasawzj 发表于 2017-7-12 17:50:41
langke93 发表于 2017-7-12 15:40
这个问题有点复杂了。而且很多人遇到。在shell中没有问题,oozie中却遇到问题。
排查思路
1 oozie中的l ...

刚确认在shell中也是有问题的
我用cm装的集群
分别在 主从namenode执行 sqoop list-tables和sqoop import 都是成功的

在任意一台datanode上执行 sqoop list-tables 能成功,
但是 执行sqoop import就报错
17/07/12 16:58:40 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `res_cnt_topic` AS t LIMIT 1
17/07/12 16:58:40 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `res_cnt_topic` AS t LIMIT 1
17/07/12 16:58:40 INFO orm.CompilationManager: HADOOP_MAPRED_HOME is /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce
注: /tmp/sqoop-root/compile/a25a344e4f7b1b245fccebaea8034504/res_cnt_topic.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
17/07/12 16:58:42 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-root/compile/a25a344e4f7b1b245fccebaea8034504/res_cnt_topic.jar
17/07/12 16:58:42 WARN manager.MySQLManager: It looks like you are importing from mysql.
17/07/12 16:58:42 WARN manager.MySQLManager: This transfer can be faster! Use the --direct
17/07/12 16:58:42 WARN manager.MySQLManager: option to exercise a MySQL-specific fast path.
17/07/12 16:58:42 INFO manager.MySQLManager: Setting zero DATETIME behavior to convertToNull (mysql)
17/07/12 16:58:42 INFO mapreduce.ImportJobBase: Beginning import of res_cnt_topic
17/07/12 16:58:42 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerExceptionjava.lang.NullPointerException
        at org.json.JSONObject.<init>(JSONObject.java:144)
        at org.apache.sqoop.util.SqoopJsonUtil.getJsonStringforMap(SqoopJsonUtil.java:43)


在oozie中shell action调用sqoop list-tables 也能成功 调用sqoop import就失败,错误同上

我查看了datanode上sqoop中的config,lib 都是和namenode上完全一致的

看错误是 java.lang.NullPointerException,应该是select * from table 后取出数据为空?导致json解析失败
但是为何会取不出数据呢?

回复

使用道具 举报

nextuser 发表于 2017-7-13 11:49:33
tsubasawzj 发表于 2017-7-12 17:50
刚确认在shell中也是有问题的
我用cm装的集群
分别在 主从namenode执行 sqoop list-tables和sqoop impo ...

如果有数据,肯定能取出来,否则就是安装配置有问题了。
回复

使用道具 举报

tsubasawzj 发表于 2017-7-13 17:08:04
本帖最后由 tsubasawzj 于 2017-7-13 17:10 编辑
nextuser 发表于 2017-7-13 11:49
如果有数据,肯定能取出来,否则就是安装配置有问题了。

数据肯定是有的,我这边对比了datanode和namenode的执行日志
并比对了sqoop打印出来的DEBUG orm.CompilationManager: Current sqoop classpath = 的值
是完全一致的

/etc/hive/conf.cloudera.hive
__cloudera_generation__  core-site.xml  hdfs-site.xml  hive-site.xml     mapred-site.xml       ssl-client.xml  topology.py
__cloudera_metadata__    hadoop-env.sh  hive-env.sh    log4j.properties  redaction-rules.json  topology.map    yarn-site.xml

每一个conf的内容也全部一一比对了,也完全一致

我还尝试了在datanode上重装sqoop,并且配置好了环境变量,但还是一样的结果

请问还有哪种可能性会导致上面的错误啊?


回复

使用道具 举报

yuwenge 发表于 2017-7-13 17:44:40
tsubasawzj 发表于 2017-7-13 17:08
数据肯定是有的,我这边对比了datanode和namenode的执行日志
并比对了sqoop打印出来的DEBUG orm.Compila ...

可能jdbc的错,比如jdbc是否可以调用到, /sqoop/lib是否有jdbc. 20160204114011992.jpg

第二:如果有的话,看看版本是否兼容
回复

使用道具 举报

tsubasawzj 发表于 2017-7-13 17:46:11
yuwenge 发表于 2017-7-13 17:44
可能jdbc的错,比如jdbc是否可以调用到, /sqoop/lib是否有jdbc.

第二:如果有的话,看看版本是否兼容 ...

这个有,且兼容
而且 sqoop list-tables 是正常的,所以不是jdbc的问题
回复

使用道具 举报

yuwenge 发表于 2017-7-13 17:59:13
tsubasawzj 发表于 2017-7-13 17:46
这个有,且兼容
而且 sqoop list-tables 是正常的,所以不是jdbc的问题

看看是对特定的表查询不了,还是就一个表。如果所有表的都不能查询,那除了jdbc,应该没有其他原因了。另外可以尝试到mysql中查询下。而且sqoop与mysql交互,是通过jdbc。
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条