我有一个有10000行的文件(“小文件”)有键值,不同的键值在小文件中可以有相同的值。我不得不在另一个文件(大文件)上数词。我需要用mapper中(“小文件”)的值替换(“大文件”)中的键。只有在它把它数进减速机之后。我想实现它使用单一Map减少作业,而不使用Pig/Hive。你能帮我并指导我怎么做吗?这个小文件将放在hdfs上,我不确定其他节点将如何从中读取数据-甚至不建议这样做-因为带有小文件的节点必须非常努力地向每个map任务发送数据。
mwyxok5s1#
您可以执行mapside连接,然后在reduce side中计算结果。将您的小文件放在分布式缓存中,以便所有节点都可以使用您的数据。在Map程序中,将所有键、值对存储在setup方法中的javahashmap中,并通过流传输大文件,然后在map方法中执行join。所以这会产生这样的结果。
Small file (K,V) Big file (K1,V1) Mapper output (V(key),V1(value))
然后在减速机上做一个基于v(或交换键,值对)的Map输出,以达到您的需要。如何从分布式缓存中读取:
@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);
1条答案
按热度按时间mwyxok5s1#
您可以执行mapside连接,然后在reduce side中计算结果。将您的小文件放在分布式缓存中,以便所有节点都可以使用您的数据。在Map程序中,将所有键、值对存储在setup方法中的javahashmap中,并通过流传输大文件,然后在map方法中执行join。所以这会产生这样的结果。
然后在减速机上做一个基于v(或交换键,值对)的Map输出,以达到您的需要。
如何从分布式缓存中读取:
如何将文件添加到分布式缓存: