【发布时间】:2012-02-18 16:48:42
【问题描述】:
如果我有一个 apache Web 服务器作为目录,我如何访问 HDFS 集群以上传和修改文件,我想要做什么配置?
非常感谢
【问题讨论】:
如果我有一个 apache Web 服务器作为目录,我如何访问 HDFS 集群以上传和修改文件,我想要做什么配置?
非常感谢
【问题讨论】:
我不明白您在问什么,我假设您正在设计一些 Web 应用程序,并且您希望从中访问 HDFS,对吗? 为了操作 HDFS,我们使用 Hadoop API。因此,您可以使用 Hadoop API 轻松访问 HDFS。使用 java Apache wickets 来开发你的 web 应用程序,因为它可以让你使用 java 和 HTML 来设计一个网站。然后,您可以轻松导入 Hadoop API 类以访问 HDFS。
另一种方法是, 如果不想使用 Hadoop API 访问 HDFS,我们一般使用终端来操作 HDFS。例如:
hadoop fs -put <file name> <dir name>
在 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 将包含与在 shell 中调用命令时出现的相同文本。您可以调用任何具有多达 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 机器上运行。
【讨论】: