【问题标题】:Access HDFS HADOOP using APACHE Web Server, Linux CentOS使用 APACHE Web Server、Linux CentOS 访问 HDFS HADOOP
【发布时间】:2012-02-18 16:48:42
【问题描述】:

如果我有一个 apache Web 服务器作为目录,我如何访问 HDFS 集群以上传和修改文件,我想要做什么配置?

非常感谢

【问题讨论】:

    标签: apache http hadoop


    【解决方案1】:

    我不明白您在问什么,我假设您正在设计一些 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 机器上运行。

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2019-01-05
      • 2015-05-11
      • 1970-01-01
      • 2014-06-25
      • 2021-04-12
      相关资源
      最近更新 更多