我有一个包含Key,Value的10,000("小文件")行的文件 小文件中的不同键可以具有相同的值。
我必须在不同的文件(大文件)上统计。 买我需要用("大文件")中的值替换("小文件")-in Mapper中的值。
仅在减速机中计算后。
我想使用单一地图减少工作而不使用pig / hive来实现它。
你可以帮助我并指导我怎么做吗?小文件将在hdfs上,我不知道其他节点将如何从中读取 - 不要认为它甚至推荐 - 因为具有小文件的节点必须非常努力地发送数据到每个地图任务。
答案 0 :(得分:4)
您可以进行mapside联接,然后在减少方面计算结果。将小文件放在分布式缓存中,以便所有节点都可以使用您的数据。在映射器中,在setup方法中存储java hashmap中的所有键值对,并将大文件流式传输,然后在map方法中进行连接。所以这会产生这样的结果。
Small file (K,V)
Big file (K1,V1)
Mapper output (V(key),V1(value))
然后根据V在减速器中进行计数(或者在地图输出中交换键,值对以满足您的需要。
如何从分布式缓存中读取:
@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()));
//some operations with the file
}
如何将文件添加到分布式缓存中:
DistributedCache.addCacheFile(new URI("/user/hduser/test/mapmainfile.dat"),conf);