2012-02-16 29 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機器上運行。