oozie 如何在shell中调用sqoop
在oozie中,sqoop actionimport --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 , exit code
请问 如何成功地在oozie的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
对于斜杠\,使用单引号‘\’或则双引号“\”
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
不是\的问题,我去除了这个按上面的方式跑也是报这个错误的
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中就无法知道字段所属的表了。
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解析失败
但是为何会取不出数据呢?
tsubasawzj 发表于 2017-7-12 17:50
刚确认在shell中也是有问题的
我用cm装的集群
分别在 主从namenode执行 sqoop list-tables和sqoop impo ...
如果有数据,肯定能取出来,否则就是安装配置有问题了。
本帖最后由 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.xmlhdfs-site.xmlhive-site.xml mapred-site.xml ssl-client.xmltopology.py
__cloudera_metadata__ hadoop-env.shhive-env.sh log4j.propertiesredaction-rules.jsontopology.map yarn-site.xml
每一个conf的内容也全部一一比对了,也完全一致
我还尝试了在datanode上重装sqoop,并且配置好了环境变量,但还是一样的结果
请问还有哪种可能性会导致上面的错误啊?
tsubasawzj 发表于 2017-7-13 17:08
数据肯定是有的,我这边对比了datanode和namenode的执行日志
并比对了sqoop打印出来的DEBUG orm.Compila ...
可能jdbc的错,比如jdbc是否可以调用到, /sqoop/lib是否有jdbc.
第二:如果有的话,看看版本是否兼容
yuwenge 发表于 2017-7-13 17:44
可能jdbc的错,比如jdbc是否可以调用到, /sqoop/lib是否有jdbc.
第二:如果有的话,看看版本是否兼容 ...
这个有,且兼容
而且 sqoop list-tables 是正常的,所以不是jdbc的问题
tsubasawzj 发表于 2017-7-13 17:46
这个有,且兼容
而且 sqoop list-tables 是正常的,所以不是jdbc的问题
看看是对特定的表查询不了,还是就一个表。如果所有表的都不能查询,那除了jdbc,应该没有其他原因了。另外可以尝试到mysql中查询下。而且sqoop与mysql交互,是通过jdbc。
页:
[1]
2