2012-02-16 52 views

回答

2

我不明白你acyually问,我假设你正在设计一些Web应用程序,并希望从中获得HDFS,对不对? 要操纵HDFS,我们使用Hadoop API。因此,您可以使用Hadoop API轻松访问HDFS。使用java Apache wickets来开发你的web应用程序,因为它可以让你使用java和HTML来设计网站。您可以轻松导入Hadoop API类以访问HDFS。

另一种方式是, 如果你不想使用Hadoop API来访问HDFS,我们通常使用终端操纵HDFS。例如:

​​

要在HDFS中上传数据。使用java的'ProcessBuilder'类,通过它可以从java程序内部调用任何shell命令。我给YPU代码从Java程序中调用shell命令:

protected final String executeCommand2(String [] parts) 
{ 
int len = parts.length; 
ProcessBuilder builder; 
if(len==0) return null; 
else if(len==1) builder = new ProcessBuilder(parts[0]); 
else if(len==2) builder = new ProcessBuilder(parts[0],parts[1]); 
else if(len==3) builder = new ProcessBuilder(parts[0],parts[1],parts[2]); 
else if(len==4) builder = new ProcessBuilder(parts[0],parts[1],parts[2],parts[3]); 
else if(len==5) builder = new ProcessBuilder(parts[0],parts[1],parts[2],parts[3],parts[4]); 
else if(len==6) builder = new ProcessBuilder(parts[0],parts[1],parts[2],parts[3],parts[4],parts[5]); 
else if(len==7) builder = new ProcessBuilder(parts[0],parts[1],parts[2],parts[3],parts[4],parts[5],parts[6]); 
else if(len==8) builder = new ProcessBuilder(parts[0],parts[1],parts[2],parts[3],parts[4],parts[5],parts[6],parts[7]); 
else return null; 
     builder.redirectErrorStream(true); 
     Process process = null; 
     String newstr="" , oldstr = ""; 
     try{ 
      process = builder.start(); 
      InputStream is = process.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      while ((newstr = br.readLine()) != null) 
      { 
       oldstr = oldstr+"\n"+newstr; 

      } 
       process.waitFor(); 
      }catch(Exception e) 
      { 
       newstr = "Exception = " + e; 
       oldstr = oldstr+"\n"+newstr; 

      } 
     int exitCode = process.exitValue(); 
     if(exitCode == 0) 
      { 
       newstr="Successfull termination "+exitCode ; 
       oldstr = oldstr+"\n"+newstr; 
      } 
     else 
      { 
       newstr="abrupt termination "+ exitCode; 
       oldstr = oldstr+"\n"+newstr; 
      } 
     newstr="##################################"; 
     oldstr = oldstr+"\n"+newstr; 
     if(oldstr.length() > 2000) 
      oldstr = ""; 
     return oldstr; 
    } // function ends here 

调用上面的函数如下:

String resultLines = executeCommand2(new String[]{ 
        "sh", 
     "<absolute path to hadoop script present in $HADOOP_HOME/conf", 
        "fs", 
        "-put", 
        "absolute path to your yourfile.txt", 
        "input HDFS dir" 
        }); 

resultLines将包含相同的文本将不得不出现在外壳的在那里调用命令的结果。你可以调用任何具有多达7个参数的shell命令。当然你可以修改函数来接受shell命令而不用更多的参数。希望它能帮助你。

请注意,如果您使用的是tomcat apache web服务器,请使用与您的linux帐户的用户名相同的用户名登录服务器,以便您有权访问本地驱动器上的脚本。为此,请编辑/ var/lib/tomcat6/conf firectory中的tomcat-users.xml文件。添加以下行:

<role rolename="manager"/> 
<role rolename="admin"/> 
<user username="your linux user name" password="your passwd" roles="admin,manager"/> 

这就是它。

另请注意,如果您使用processbuilder类机制来构建您的应用程序,那么您的应用程序将成为linux特有的,并且不会在Windows机器上运行。