从PHP服务器执行hadoop jar失败。拒绝许可

从PHP服务器执行hadoop jar失败。拒绝许可,php,hadoop,jar,hbase,Php,Hadoop,Jar,Hbase,我试图执行一个jar文件,从PHP服务器对我的HBase数据库进行简单查询,以便将结果打印到网页上 中的PHP服务器配置了与hadoop用户相同的用户名,也配置了相同的组 PHP exec命令是: exec("bash /usr/local/hadoop/bin/hadoop jar myjar.jar my.package.MyClass 2> php_error.log", $result); 当我尝试执行命令(在php_error.log中)时,会出现此异常: 我知道它与权限

我试图执行一个jar文件,从PHP服务器对我的HBase数据库进行简单查询,以便将结果打印到网页上

中的PHP服务器配置了与hadoop用户相同的用户名,也配置了相同的组

PHP exec命令是:

exec("bash /usr/local/hadoop/bin/hadoop  jar myjar.jar my.package.MyClass   2> php_error.log", $result);
当我尝试执行命令(在php_error.log中)时,会出现此异常:

我知道它与权限有关,但即使在我的HDFS和hadoop安装文件夹上使用777,它也不起作用

有什么想法吗?多谢各位

另外,要在何处创建此临时文件? Hadoop目录?hdfs?在哪里

编辑: 在本地运行,它工作得非常好!没有权限错误!
hadoop jar myjar.jar my.package.MyClass

您的PHP还可以。问题是,您正在运行的命令试图将文件复制到hadoop.tmp.dir。它的默认位置是
/tmp/hadoop-${user.name}
。您还必须递归地授予文件夹或完整的
/tmp/hadoop
目录的权限

编辑:


发现在这种情况下apache不是有效用户。解决方案是创建一个新用户,将其添加到hadoop组,将权限设置为jar和hadoop.tmp.dir,并将网页所有者更改为已创建的用户

您的PHP正常。问题是,您正在运行的命令试图将文件复制到hadoop.tmp.dir。它的默认位置是
/tmp/hadoop-${user.name}
。您还必须递归地授予文件夹或完整的
/tmp/hadoop
目录的权限

编辑:



发现在这种情况下apache不是有效用户。解决方案是创建一个新用户,将其添加到hadoop组,将权限设置为jar和hadoop.tmp.dir,并将网页所有者更改为已创建的用户

,在我看来,jar正在尝试创建文件的临时副本。可能您对应该保存副本的文件夹没有权限。我在我的服务器上创建了一个文件夹,将jar放入其中,并递归地授予它完全权限。还是收到这个消息!恐怕与hadoop有关。我认为php服务器必须以hadoop用户的身份运行..tmp目录可以在文件系统的任何位置,仅仅创建一个新文件夹并给予recursiveley完全权限是不够的。您必须找出hadoop.tmp.dir的位置,我才知道tmp dir的位置。下一步怎么办?顺便说一句,当在本地运行jar(没有我的php服务器)时,它运行正常!!(参见我的后期编辑的最后一行)我假设您在尝试此操作时没有使用您的www数据用户登录,对吗?在我看来,jar正在尝试制作文件的临时副本。可能您对应该保存副本的文件夹没有权限。我在我的服务器上创建了一个文件夹,将jar放入其中,并递归地授予它完全权限。还是收到这个消息!恐怕与hadoop有关。我认为php服务器必须以hadoop用户的身份运行..tmp目录可以在文件系统的任何位置,仅仅创建一个新文件夹并给予recursiveley完全权限是不够的。您必须找出hadoop.tmp.dir的位置,我才知道tmp dir的位置。下一步怎么办?顺便说一句,当在本地运行jar(没有我的php服务器)时,它运行正常!!(参见我的文章最后一行)我假设您在尝试此操作时没有使用您的www数据用户登录,对吗?我的tmp目录是/app/hadoop/tmp!app/hadoop拥有-R 777权限/应用程序有775个权限。顺便说一句,谢谢你,但它仍然不起作用?您确定没有/tmp目录吗?你是以root用户身份登录的吗?不,我不是以root用户身份登录的。(对于hbase)。并且在终端上运行良好。从php服务器isnt!:(服务器与hmaster在同一台机器上,并以与hadoop用户相同的用户名登录!我确信,问题是,当您从php运行命令时,您是以另一个用户的身份运行该命令,而该用户在hadoop tmp目录上明确没有写+执行权限。这就是为什么java.io.File.createTempFile(File.java:1879)上的Exeption
发生奇怪/有趣的事情。在~dir(hduser的)中复制了jar,在php错误中,我没有找到/root/a.jar文件…我的tmp目录是/app/hadoop/tmp!app/hadoop有-R 777权限。/app有775权限。顺便说一句,谢谢你,它仍然不工作?你确定没有/tmp目录吗?你是以root身份登录的吗?不,我不是以root身份登录的。(对于hbase)。并且正在从终端运行。从php服务器运行的性能不是!:(服务器与hmaster在同一台机器上,并以与hadoop用户相同的用户名登录!我确信,问题是,当您从php运行命令时,您是以另一个用户的身份运行该命令,而该用户在hadoop tmp目录上明确没有写+执行权限。这就是为什么java.io.File.createTempFile(File.java:1879)上的Exeption
occuresMething怪异/有趣。在~dir(hduser的)中复制了jar,在php错误中,我得到了/root/a.jar文件未找到。。。
Exception in thread "main" java.io.IOException: Permission denied
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.createTempFile(File.java:1879)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:115)