在Map Reduce作业Hadoop中使用文件中的数据作为Hash-Map

时间:2015-09-18 08:12:52

标签: java hadoop mapreduce

我有一个包含Key,Value的10,000("小文件")行的文件 小文件中的不同键可以具有相同的值。

我必须在不同的文件(大文件)上统计。 买我需要用("大文件")中的值替换("小文件")-in Mapper中的值。

仅在减速机中计算后。

我想使用单一地图减少工作而不使用pig / hive来实现它。

你可以帮助我并指导我怎么做吗?

小文件将在hdfs上,我不知道其他节点将如何从中读取 - 不要认为它甚至推荐 - 因为具有小文件的节点必须非常努力地发送数据到每个地图任务。

1 个答案:

答案 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);