2017-03-21 66 views
0

我试图在应用程序级别可见性下将*.tar.gz文件分发到纱线节点。如何将非jar文件分发到纱线节点?

在以下目录中的hadoop我的节点由节点管理器生成

/tmp/hadoop-vikram/nm-local-dir/usercache/vikram/appcache/application_1490062699498_0005/container_1490062699498_0005_01_000003/ 

我看到下

/tmp/hadoop-vikram/nm-local-dir/usercache/vikram/appcache/application_1490062699498_0005/filecache/10/test.tar.gz 

预期的文件,但我想检索路径test.tar.gz在应用程序代码。

我可以找到以下

URL input = getClass().getClassLoader().getResource("jar-file-name"); 
+0

¿为什么不把这个tar保存在nfs中? – jedijs

+0

@jedijs我想利用纱线执行的文件分发 – user3401493

回答

0

我不认为你正在做依托容器的位置是正确的路径罐子使用的文件。对于次要集合,我建议您使用distributed cache使资源在所有任务节点上可用。它会自动将文件上传到所有容器节点,并使其适用于所有映射器 - 缩减器。

但是,如果您的文件足够大,这应该是一个伟大的空间命中,因为数据将被复制到实际任务将执行的每个节点。为了改善这一点,您可以将文件直接放入文件系统,并使用更大的复制因子(例如10(取决于群集中节点的数量)),以提高其可用性。然后在您的任务中,您将能够直接下载它,与分布式缓存方法相比,这将显着节省您的空间,但成本将是非本地读取的带宽。你可以玩这个来找到最佳的复制次数。

+0

感谢Alex的回复。我的文件大小不大,但只有几百克。我们已经使用LocalResource实现将文件分发到容器节点。但不知何故在一些容器上这个文件丢失了。 – user3401493

+0

@ user3401493可能你错过了那里的东西。这是正确的方法,我建议您尝试使用LocalResource找出问题的原因,而不是直接访问容器 – Alex

相关问题