java—在map reduce作业hadoop中将文件中的数据用作哈希Map

gk7wooem  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(335)

我有一个有10000行的文件(“小文件”)有键值,不同的键值在小文件中可以有相同的值。
我不得不在另一个文件(大文件)上数词。我需要用mapper中(“小文件”)的值替换(“大文件”)中的键。
只有在它把它数进减速机之后。
我想实现它使用单一Map减少作业,而不使用Pig/Hive。
你能帮我并指导我怎么做吗?
这个小文件将放在hdfs上,我不确定其他节点将如何从中读取数据-甚至不建议这样做-因为带有小文件的节点必须非常努力地向每个map任务发送数据。

mwyxok5s

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

相关问题