2017-11-21 13 views
0

から実行したときにブロックのみトリガー場合、私はbashスクリプトを実行するためにjava.lang.ProcessBuilderを使用するJavaアプリケーションを持っています。バッシュ-z ProcessBuilderを

LOG.info("PlatformID = " + platformId); 
    LOG.info("oldWorkflow date = " + oldDate.toString() + " workflow = " + oldWorkFlowId); 
    LOG.info("newWorkflow date = " + newDate.toString() + " workflow = " + newWorkFlowId); 
    final ProcessBuilder pb = new ProcessBuilder(exportScriptLoc, platformId, oldWorkFlowId, newWorkFlowId); 
    pb.directory(new File("/opt/nis/ddziak-dev/nis-hadoop")); 
    final Process p = pb.start(); 
    p.waitFor(); 
    final int exitValue = p.exitValue(); 
    p.destroy(); 
    if (exitValue == 0) { 

ログを使用して、ProcessBuilderの入力を確認しました。

15:33:04987 INFO [プール-4-スレッド-1] DapWatcher - PlatformID = 10191

15:33:05013 INFO [プール-4-スレッド-1] DapWatcher - oldWorkflow日付= 2017-11-16T19:13:46.0​​00Zワークフロー= 00047916

15:33:05,013 INFO [pool-4-thread-1] DapWatcher - newWorkflow date = 2017-11-16T21:03:42.000Z workflow = 00050837

このスクリプトは次のとおりです。

このスクリプトからPATITIONSのエコーで
#!/bin/bash 
echo "hive -S -e \"show partitions nis.subscribers partition(destinationPlatformId='$1', build='$2');\"|awk '{if(NR>1)print}'" >> subscribers.out 

PARTITIONS=`hive -S -e "show partitions nis.subscribers  partition(destinationPlatformId='$1', build='$2');"|awk '{if(NR>1)print}'` 
if [ -z "$PARTITIONS" ] 
then 
    exit 2 
fi 


echo "${PARTITIONS}" 

hqlOut=`hive -S -hiveconf destPlatId=$1 -hiveconf newWorkFlowId=$3 -hiveconf oldWorkFlowId=$2 -f /opt/nis/ddziak-dev/nis-hadoop/dapLib/updateSubscriberHiveTable.hql` 

newPARTITIONS=`hive -S -e "show partitions nis.subscribers partition(destinationPlatformId='$1');"|awk '{if(NR>1)print}'` 
if [ -z "$newPARTITIONS"] 
then 
    exit 3 
fi 

私はそれは私がエコーされたコマンドを実行すると、それは

destinationplatformid=10191/build=00047916 

を返し

hive -S -e "show partitions nis.subscribers partition(destinationPlatformId='10191', build='00047916');"|awk '{if(NR>1)print}' 

Javaプログラムから同じ入力に渡して確認されました私は、直接それが正常にcomple

updateSubscriberHiveTable.sh 10191 00047916 00050837 

を使用してスクリプトを呼び出すときテス。しかし、Javaプログラムがp.exitValueから2番出口を取得し続ける()

Javaプログラムが2番出口を取得している理由は、誰もが知っていますか?

答えて

0

私はそれがJavaの問題の中に

final ProcessBuilder pb = new ProcessBuilder("bash", "-x", exportScriptLoc, platformId, oldWorkFlowId, newWorkFlowId).inheritIO(); 

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient 
    at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:347) 
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:681) 
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:625) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212) 
Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient 
    at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1422) 
    at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:62) 
    at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:72) 
    at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:2457) 
    at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:2469) 
    at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:341) 
    ... 7 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1420) 
    ... 12 more 
Caused by: java.lang.NoSuchFieldError: SASL_PROPS 
    at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S.getHadoopSaslProperties(HadoopThriftAuthBridge20S.java:127) 
    at org.apache.hadoop.hive.metastore.MetaStoreUtils.getMetaStoreSaslProperties(MetaStoreUtils.java:1485) 
    at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(HiveMetaStoreClient.java:322) 
    at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:214) 
    ... 17 more 
ハイブだっ発見するために必要な追加の情報を提供してくれまし以下に私のProcessBuilderをインスタンス化を変更