如何从 Java 应用程序远程执行 Hadoop 命令

Posted

技术标签:

【中文标题】如何从 Java 应用程序远程执行 Hadoop 命令【英文标题】:how To Execute Hadoop Command from Java app remotely 【发布时间】:2015-11-23 07:47:00 【问题描述】:

您好,我正在尝试通过 Java 应用程序远程执行任何 hadoop 命令,例如“hadoop fs -ls”。我在本地机器上有我的 Java 应用程序,在 VM 中有 Hadoop。

首先我建立一个 ssh 连接并开始工作。我也可以通过它正在工作的java代码执行一个linux命令,但是hadoop命令不起作用,它会抛出以下错误。执行hadoop命令有什么想法吗?

这是我的 jsch 程序

package com.jsch.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class Jschtest 

public static void main(String[] args)

String command="hadoop fs -ls /";
try         
     String host = "192.168.3.197"; //IP address of the remote server
     String user = "user";        // Username of the remote server
     String password = "HDP123!";  // Password of the remote server

     JSch jsch = new JSch();
     Session session = jsch.getSession(user, host, 22);
     Properties config = new Properties();
     config.put("StrictHostKeyChecking", "no");
     session.setConfig(config);;
     session.setPassword(password);
     session.connect();

     Channel channel = session.openChannel("exec");
     ((ChannelExec)channel).setCommand(command);
     channel.setInputStream(null);
     ((ChannelExec)channel).setErrStream(System.err);

     InputStream input = channel.getInputStream();
     channel.connect();

     System.out.println("Channel Connected to machine " + host + " server    
with command: " + command ); 

     try
         InputStreamReader inputReader = new InputStreamReader(input);
         BufferedReader bufferedReader = new BufferedReader(inputReader);
         String line = null;

         while((line = bufferedReader.readLine()) != null)
             System.out.println(line);
         
         bufferedReader.close();
         inputReader.close();
     catch(IOException ex)
         ex.printStackTrace();
     

     channel.disconnect();
     session.disconnect();
 catch(Exception ex)
     ex.printStackTrace();
 






这是我的错误信息

Channel 连接到机器 192.168.3.197 服务器,命令:hadoop fs -ls /

bash: hadoop: 找不到命令

【问题讨论】:

【参考方案1】:

打开您的 bashsrc 并将 Hadoop BIN 文件夹路径添加到文件中的 PATH 变量中。 运行source ~/.bashrc 命令。

或者,您可以对命令变量进行以下更改:

command = usr/local/hadoop/bin/hadoop fs -ls

【讨论】:

【参考方案2】:

如果您收到此错误“bash: hadoop: command not found”的意思。 Hadoop 不被操作系统识别

您需要使用 hadoop 主目录更新“.bashrc”文件

【讨论】:

以上是关于如何从 Java 应用程序远程执行 Hadoop 命令的主要内容,如果未能解决你的问题,请参考以下文章

远程执行 Hadoop 作业时,reduce 阶段出现异常

如何在 Amazon EMR 集群上远程提交 hadoop MR 作业

本地idea开发mapreduce程序提交到远程hadoop集群执行

如何从远程执行的 Fargate 任务访问 S3 对象?

本地idea开发mapreduce程序提交到远程hadoop集群执行

远程ssh执行命令时提示找不到命令