【问题标题】:Using Runtime.getRuntime().exec() in jsp. All commands except copy (copyFromLocal) not working在 jsp 中使用 Runtime.getRuntime().exec()。除复制(copyFromLocal)外的所有命令都不起作用
【发布时间】:2014-07-23 08:39:22
【问题描述】:

我正在尝试使用以下代码将文件从本地存储复制到 hdfs。如果我使用命令列出文件,即 hadoop fs -ls Alert,它可以工作,但在复制文件时它不起作用。

这是我的代码。

<html><%@ page import="java.util.*,java.io.*"%>
<%@ page import="java.lang.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.nio.file.Files"%>
<%@ page import="java.nio.file.Paths"%>
<%@ page import="java.nio.file.attribute.PosixFilePermission"%>
<body>
<font color=black>
<%
   String jobId=request.getParameter("jobId");
   String jobStatus=request.getParameter("jobStatus");
   String displayName=request.getParameter("displayName");
   String name=request.getParameter("name");
   String description=request.getParameter("description");
   String frequency=request.getParameter("frequestuency");
   String lastModifiedAt=request.getParameter("lastModifiedAt");
   String createdAt=request.getParameter("createdAt");  
   String createdBy=request.getParameter("createdBy");      
   String opPath=request.getParameter("opPath");        
   String env=request.getParameter("env");  
   PrintWriter writer = new PrintWriter("/var/lib/tomcat7/webapps/ROOT/log.txt", "UTF-8");
   writer.println("Job ID : "+jobId);
   writer.println("Job Status : "+jobStatus);
   writer.println("Rule Name : "+name);
   writer.println("Rule Display Name : "+displayName);
   writer.println("Rule Description : "+description);
   writer.println("Rule env : "+env);
   writer.println("Rule frequency : "+frequency);
   writer.println("Rule last modified at : "+lastModifiedAt);
   writer.println("Rule created at : "+createdAt);
   writer.println("Rule created by : "+createdBy);
   writer.println("Notification Path : "+opPath);
   writer.close();

   Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();
   perms.add(PosixFilePermission.OWNER_READ);
   perms.add(PosixFilePermission.OWNER_WRITE);
   perms.add(PosixFilePermission.OWNER_EXECUTE);
   perms.add(PosixFilePermission.GROUP_READ);
   perms.add(PosixFilePermission.GROUP_WRITE);
   perms.add(PosixFilePermission.GROUP_EXECUTE);
   perms.add(PosixFilePermission.OTHERS_READ);
   perms.add(PosixFilePermission.OTHERS_WRITE);
   perms.add(PosixFilePermission.OTHERS_EXECUTE);         
   Files.setPosixFilePermissions(Paths.get("/var/lib/tomcat7/webapps/ROOT/log.txt"), perms);
   Process p = Runtime.getRuntime().exec("/usr/local/hadoop/bin/hadoop fs -copyFromLocal /var/lib/tomcat7/webapps/ROOT/log.txt Alert/Notify");

   OutputStream os = p.getOutputStream();
   InputStream in = p.getInputStream();
   DataInputStream dis = new DataInputStream(in);
   String disr = dis.readLine();
   while ( disr != null ) 
   {
   out.println(disr);
   disr = dis.readLine();
   }
%>
</body>
</font>
</html>

甚至 -mkdir、-rmr 等都可以完美运行。我认为从 ROOT 文件夹复制文件存在一些问题。

我是否需要做更多的事情,特别是复制文件。

感谢任何帮助。

【问题讨论】:

    标签: jsp hadoop runtime.exec


    【解决方案1】:

    抱歉,之前无意误导。问题实际上出在hadoop的存储系统(hdfs)上,我认为这肯定是tomcat或jsp的问题。我一发现这个问题就想删除这个问题,但后来我认为这会让其他人受益,因为我在 2 天内找不到任何东西。

    我终于发现这对我有帮助 Permission denied at hdfs

    -copyFromLocal 或 -put 我想需要有一些权限,只需在 hdfs-site.xml 中添加以下内容,然后运行它就可以了。

     <property>
        <name>dfs.permissions</name>
        <value>false</value>
      </property>
    

    我也在php中尝试过,它比jsp或servlet要麻烦得多。

    这就是我最终在php中所做的

    <?php
      if( $_GET["jobId"] || $_GET["jobStatus"] )
      {
         echo "Job Id ". $_GET['jobId']. "<br />";
         echo "Job Status ". $_GET['jobStatus']. "";
      }
      $jobId=$_GET["jobId"];
      $jobStatus=$_GET["jobStatus"];
      $displayName=$_GET["displayName"];
      $name=$_GET["name"];
      $description=$_GET["description"];
      $frequency=$_GET["frequestuency"];
      $lastModifiedAt=$_GET["lastModifiedAt"];
      $createdAt=$_GET["createdAt"];    
      $createdBy=$_GET["createdBy"];        
      $opPath=$_GET["opPath"];      
      $env=$_GET["env"];
      $file = fopen("log.txt","w");
      echo fwrite($file,"Job ID : ".$jobId."\n"."Job Status : ".$jobStatus."\n"."Display Name : ".$displayName."\n"."Name : "."\n"."Description : ".$description."\n"."Frequency : ".$frequency."\n"."Last Modified At".$lastModifiedAt."\n"."Created At".$createdAt."\n"."Created By : ".$createdBy);
      fclose($file);
      chmod("log.txt", 0777);
      $last_line = system('/usr/local/hadoop/bin/hadoop fs -put /var/www/html/log.txt /user/hduser/Alert/', $retval);
      $last_line = system('/usr/local/hadoop/bin/hadoop fs -ls /user/hduser/Alert/', $retval);
      echo '<pre>';
      $output2 = exec('hadoop fs -copyFromLocal /var/www/html/log.txt /user/hduser/Alert/Notify');
      echo '
        </pre>
        <hr />' . $last_line . '
        <hr />' . $retval;
            '<hr />' . $output1;
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多