我试图弄清楚Hadoop缓存创建的符号链接是否支持目录。
我希望DistributedCache.addCacheFile(URI.create("file:/tmp/myfile#foo/bar"), conf)
在名为/tmp/myfile
的当前工作目录中提供foo/bar
。
群集上一切正常,但在本地模式下失败。基本上,LocalDistributedCacheManager.setup
尝试使用ln -s /tmp/myfile $cwd/foo/bar
创建符号链接但从未创建foo
。
我想在Hadoop分布式缓存中添加一个或多个Avro SortedKeyValueFile。
SortedKeyValueFile
与Hadoop MapFile
类似。它们实际上是由两个文件组成的目录:索引文件和数据文件。这两个文件必须具有特定名称(index
和data
),并且必须位于同一目录中。
如果我希望能够将至少两个“文件”放在分布式缓存中,我无法将文件压缩到根目录中。我必须保留/定义文件层次结构。
设置:Hadoop 2.6.0 / CDH 5.4 / Crunch。因为我正在使用Crunch,所以我必须使用已弃用的DistributedCache
API,因为Job.addCachefile()
未公开。
MapFile
或SortedKeyValueFile
等内容推送到Hadoop缓存中?答案 0 :(得分:0)
这是本地模式中的错误还是我滥用分布式缓存?
本地模式不支持Distributedcache。它只能在伪分布式模式或集群模式下运行。
人们如何将MapFile或SortedKeyValueFile等内容推送到Hadoop缓存中?
您必须将所有内容放入文件并将其放入HDFS中 mapside从文件中读取它并将其放在hashmap中。
如何从分布式缓存中读取:
@Override
protected void setup(Context context) throws IOException,InterruptedException
{
Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration());
for(Path findlist:filelist)
{
if(findlist.getName().toString().trim().equals("mapmainfile.dat"))
{
fetchvalue(findlist,context);
}
}
}
public void fetchvalue(Path realfile,Context context) throws NumberFormatException, IOException
{
BufferedReader buff=new BufferedReader(new FileReader(realfile.toString()));
//read the file and put it in hashMap
}
将文件添加到分布式缓存中:
DistributedCache.addCacheFile(new URI("/user/hduser/test/mapmainfile.dat"),conf);