我正在尝试在本地计算机上运行以下MapReduce代码: https://github.com/Jeffyrao/warcbase/blob/extract-links/src/main/java/org/warcbase/data/ExtractLinks.java
但是,我遇到了这个例外:
[main] ERROR UserGroupInformation - PriviledgedActionException as:jeffy (auth:SIMPLE) cause:java.io.IOException: java.util.concurrent.ExecutionException: java.io.IOException: Resource file:/Users/jeffy/Documents/Eclipse/warcbase/map_backup.txt is not publicly accessable and as such cannot be part of the public cache.
Exception in thread "main" java.io.IOException: java.util.concurrent.ExecutionException: java.io.IOException: Resource file:/Users/jeffy/Documents/Eclipse/warcbase/map_backup.txt is not publicly accessable and as such cannot be part of the public cache.
at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:144)
at org.apache.hadoop.mapred.LocalJobRunner$Job.<init>(LocalJobRunner.java:155)
at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:625)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:391)
at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1269)
at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1266)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:394)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1266)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1287)
at org.warcbase.data.ExtractLinks.run(ExtractLinks.java:254)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
at org.warcbase.data.ExtractLinks.main(ExtractLinks.java:270)
Caused by: java.util.concurrent.ExecutionException: java.io.IOException: Resource file:/Users/jeffy/Documents/Eclipse/warcbase/map_backup.txt is not publicly accessable and as such cannot be part of the public cache.
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:140)
... 14 more
我认为这个问题是因为我正在尝试将文件添加到DistributedCache(在第81-86行和第235行查看我的代码)。任何建议都是受欢迎的。谢谢!
答案 0 :(得分:2)
我在本地环境中添加了添加了DistributedCache的Hadoop 2作业时遇到了类似的问题。最后我的问题的原因是Hadoop 2不仅验证了路径本身是否具有公共执行权。读访问权限,但它还验证其所有祖先目录应具有执行权限。在这种情况下,如果"/"
或"/Users"
没有755权限,则该文件仍然无法添加到公共缓存中。
请参阅Hadoop类FSDownload.java
中的方法static boolean ancestorsHaveExecutePermissions(FileSystem fs,
Path path, LoadingCache<Path,Future<FileStatus>> statCache)
一种解决方案可能是授予所有目录的权限(听起来不安全)。
更好的解决方案是确保要缓存的所有资源文件都在/tmp
文件夹或默认具有&gt; 755权限的任何其他文件夹中。
答案 1 :(得分:0)
我遇到过类似的问题。 我在本地模式下使用tfidf运行mahout seq2sparse。并提出错误:
线程中的异常&#34; main&#34; java.io.IOException:java.util.concurrent.ExecutionException:java.io.IOException:资源文件:/root/title.tfidf/dictionary.file-0不可公开访问,因此不能成为公共缓存的一部分。
我发现/ root的权限默认为750
drwxr-X ---。 12 root root 4096 16:04 root
所以我改变了/ root
的许可chmod 755 / root
然后它的工作原理。谢谢伊通。
答案 2 :(得分:0)
我必须更改我的主目录的权限,如下所示
chmod go + rx / home / hadoop
解决问题,因为/和/ home已经为我的系统上的组和其他用户提供了rx permisions。在这里&#39; hadoop&#39;是我的linux登录/用户名。