【问题标题】:Using Data from a file as Hash-Map in Map Reduce job Hadoop在 Map Reduce 作业 Hadoop 中使用文件中的数据作为 Hash-Map
【发布时间】:2015-09-18 20:12:57
【问题描述】:

我有一个包含 10,000(“小文件”)行的文件,其中包含 Key、Value 小文件中不同的key可以有相同的值。

我必须对不同的文件(大文件)进行字数统计。 购买我需要将(“大文件”)中的密钥替换为(“小文件”)中的值 - 在 Mapper 中。

只有在reducer中才算。

我想在不使用 pig/hive 的情况下使用单个 map reduce 作业来实现它。

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

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

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    您可以进行mapside 连接,然后在减少端计算结果。将您的小文件放在分布式缓存中,以便您的数据可供所有节点使用。在您的映射器中,将所有键值对存储在 setup 方法中的 java hashmap 中,并通过流式传输大文件,然后在 map 方法中进行连接。所以这将产生类似的结果。

    Small file (K,V)
    
    Big file (K1,V1) 
    
    Mapper output (V(key),V1(value))
    

    然后根据V在reducer中做一个计数(或者交换map输出中的key,value对来实现你的需要。

    如何从分布式缓存中读取:

    @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);
    

    【讨论】:

    • 是否可以使用 java.io.InputStream 从 Mapper 中的“分布式缓存”中读取?
    • 因为你是从文件中读取,我更喜欢用文件阅读器包装的缓冲阅读器。我已经更新了我的帖子。
    • 添加这样的分布式缓存解释blog.cloudera.com/blog/2008/11/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多