我试图弄清楚是否由Hadoop缓存支持目录创建的符号链接。
- 在分布式模式下工作良好
- 本地模式失败
- Javadoc/documentation非常稀疏,什么也没说
我希望DistributedCache.addCacheFile(URI.create("file:/tmp/myfile#foo/bar"), conf)
使/tmp/myfile
在当前工作目录下以foo/bar
的名称可用。
在集群上一切正常,但在本地模式下失败。基本上,LocalDistributedCacheManager.setup
尝试使用ln -s /tmp/myfile $cwd/foo/bar
创建符号链接,但foo
从未被创建。
我想添加一个或几个Avro SortedKeyValueFile到Hadoop分布式缓存。
SortedKeyValueFile
s类似于Hadoop的MapFile
s。它们实际上是由两个文件组成的目录:一个索引文件和一个数据文件。这两个文件必须有一个特定的名称(index
和data
),并且必须在同一个目录下。
如果我希望能够在分布式缓存中放置至少两个这样的"文件",我不能将这些文件平铺到根目录中。我必须保留/定义一个文件层次结构。
安装:Hadoop 2.6.0/CDH 5.4/Crunch。因为我正在使用Crunch,所以我必须使用已弃用的DistributedCache
API,因为Job.addCachefile()
没有暴露。
待回答的问题
- 这是一个bug在本地模式或我滥用分布式缓存?
- 如何将
MapFile
或SortedKeyValueFile
推送到Hadoop缓存中?
是本地模式中的错误还是我滥用分布式缓存?
本地模式下不支持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);