用shell编写的Hadoop命令不会从java调用

时间:2015-12-19 08:50:55

标签: java shell hadoop

从shell定义了hadoop命令,只是尝试进行正常处理:

shell文件如下:

#!/bin/bash
success = $?

echo " The hadoop execution started at " $(date) ;

echo " Processing the files ";

echo "Starting the process for mapping file to HDFS and then to mysql"

hadoop fs -rm -r -f /FileMappingData && 
hadoop fs -put /home/nishant/data/mappingfile/ /FileMappingData &&

mysql -u root -padmin -e 'use MiningProcessSchema;drop table if exists MiningMasterData;create table MiningMasterData (PointID VARCHAR(20), PointX int, PointY int, FileName VARCHAR(80));' &&

echo "Table created in mysql" &&


if [ "$?" = "0" ] ; then
    echo "Process success"
else 
    echo "------------!!!!!Something wrong !!Process failed!!!!------------";
fi

从终端执行时这很好。什么时候,现在我试图从java代码调用shell。虽然没有被召唤。

StringBuffer output = new StringBuffer();

Process p,p1;
try {
    String[] envp= {"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/nishant/bin:/usr/local/java/jdk1.8.0_66/bin:/home/nishant/bin:/usr/local/java/jre1.8.0_66/bin:/usr/lib/jvm/java-7-openjdk-amd64/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/hive/bin:/usr/lib/sqoop/bin"};

    p1 = Runtime.getRuntime().exec("bash exec bash");
    p1.waitFor();

    p = Runtime.getRuntime().exec( command, envp );
    // " > " + prop.getProperty("LOGDIR_PROCESS_DATA")+ sdfRec.format(new Date())
    //    +collectNextVal+".log  2>&1 &"

    //Runtime.getRuntime().
    p.waitFor();
    BufferedReader reader = 
        new BufferedReader(new InputStreamReader(p.getInputStream()));

    String line = "";           
    while ((line = reader.readLine())!= null) {
        output.append(line + "\n");
    }

} catch (Exception e) {
    e.printStackTrace();
}

输出:

  

hadoop执行于2015年12月19日星期六14:19:23开始   处理文件启动将文件映射到HDFS的过程   然后到mysql 111   ------------ !!!!!出错了!过程失败!!!! ------------

似乎主要是在java执行中没有访问PATH变量的问题,但不确定我可以添加它的位置。

如果是这种情况或任何其他情况,请提供帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

得到答案并立即成功运行代码。

诀窍是要正确包含Path变量:

  

String [] envp = {“PATH = / usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin:/ usr / games:/ usr /本地/游戏:/首页/ NISHANT /斌:/usr/local/java/jdk1.8.0_66/bin:/家庭/ NISHANT /斌:/usr/local/java/jre1.8.0_66/bin:/ usr / lib目录/ JVM / JAVA -7-的openjdk-AMD64 / bin中:在/ usr /本地/ hadoop的/ bin中:在/ usr /本地/ hadoop的/ sbin目录:在/ usr /本地/蜂巢/ bin中:/ usr / lib中/ sqoop / BIN“} ;

它有效。