Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hadoop Map Reduce中,是否有任何类在排序之后和分区之前看到整个键列表?_Java_Hadoop_Mapreduce_Partitioning_Partitioner - Fatal编程技术网

Java 在Hadoop Map Reduce中,是否有任何类在排序之后和分区之前看到整个键列表?

Java 在Hadoop Map Reduce中,是否有任何类在排序之后和分区之前看到整个键列表?,java,hadoop,mapreduce,partitioning,partitioner,Java,Hadoop,Mapreduce,Partitioning,Partitioner,我正在使用Hadoop分析数据分布非常不均匀的情况。有些键有数千个值,但大多数键只有一个值。例如,与IP地址相关联的网络流量将有许多数据包与少数有话IP相关,而只有少数与大多数IP相关。另一种说法是温度非常高 为了有效地处理这一点,每个减速器应该要么获得几个高音量键,要么获得许多低音量键,以获得大致均匀的负载。我知道如果我正在编写分区过程,我将如何做到这一点:我将获取映射程序生成的键的排序列表(包括所有重复键)以及还原器的数量N,并将拆分放在 split[i] = keys[floor(i*le

我正在使用Hadoop分析数据分布非常不均匀的情况。有些键有数千个值,但大多数键只有一个值。例如,与IP地址相关联的网络流量将有许多数据包与少数有话IP相关,而只有少数与大多数IP相关。另一种说法是温度非常高

为了有效地处理这一点,每个减速器应该要么获得几个高音量键,要么获得许多低音量键,以获得大致均匀的负载。我知道如果我正在编写分区过程,我将如何做到这一点:我将获取映射程序生成的
键的排序列表(包括所有重复键)以及还原器的数量
N
,并将拆分放在

split[i] = keys[floor(i*len(keys)/N)]

Reducer
i
将获得钥匙
k
,这样就我所知,
split[i]在MR处理中没有一个地方所有钥匙都存在。更重要的是,不能保证单台机器可以存储这些数据。
我认为在目前的MR框架下,这个问题并没有理想的解决方案。我这样认为是因为要得到理想的解决方案,我们必须等待最后一个映射器的结束,然后才分析密钥分布,并用这些知识对分区器进行参数化
这种方法将显著地使系统复杂化并提高延迟
我认为好的近似方法可能是对数据进行随机抽样,以获得密钥分布的概念,然后让partiotinoner根据它工作

据我所知,Terasort实现正在做一些非常类似的事情:

我也一直在考虑这个问题。如果有人强迫我,这是我会采取的高级方法

  • 除了用来解决业务问题的映射器逻辑之外,还可以编写一些逻辑代码来收集分区器中需要的任何统计信息,以便以平衡的方式分发键值对。当然,每个映射器只能看到部分数据
  • 每个映射程序都可以找到其任务ID,并使用该ID在指定的hdfs文件夹中构建唯一的文件名,以保存收集的统计信息。在任务结束时运行的cleanup()方法中写出此文件
  • 在分区程序中使用惰性初始化来读取指定hdfs目录中的所有文件。这将获得在映射程序阶段收集的所有统计信息。从这里开始,您就可以实现正确分区数据所需的任何分区逻辑
这一切都假设在所有映射程序完成之前不会调用分区器,但这是迄今为止我所能做的最好的事情