gpt4 book ai didi

hadoop - MapReduce-使用hadoop配置对象读取文本文件

转载 作者:行者123 更新时间:2023-12-02 21:05:42 24 4
gpt4 key购买 nike

我是一项家庭作业,需要我用hadoop / mapreduce / java运行k-means算法。 k均值算法的每个迭代都是一个MapReduce作业,这个问题涉及链接n个作业,其中n是我们选择运行的k均值算法的迭代数。

我们得到了一个初始的质心文件,称为centroids.txt,如下所示:

1. 0 0.64 0.64 0 0.32
2. 0.21 0.28 0.5 0 0.14
3. 0.06 0 0.71 0 1.23
4. 1.03 1.36 0.32 0.51 0
5. 0 0 0 0 0.63

...行号不在文件中。每行是一个5维 vector ,代表k均值算法的初始聚类质心。在这里,我们有5个初始簇。

接下来,我们有一个必须分配给集群的数据点文件,称为data.txt,如下所示:
1. 0 0.64 0.64 0 0.32
2. 0.21 0.28 0.5 0 0.14
3. 0.06 0 0.71 0 1.23
4. 0 0 0 0 0.63
5. 0 0 0 0 0.63
6. ...
...

...这里表示我们有许多行的数据点(此问题为〜10000)。同样,每一行都是5维 vector 。

好吧,现在我要问的是与构造MapReduce作业有关的问题,这是我目前不太熟悉的东西(即mapreduce)。对于每个映射函数,输入文件都是data.txt文件。这是我们需要读取的文件,检查每一行,检查该行所属的质心,并创建适当的键值对。但是,如何将centroids.txt文件读入映射器?我的教授给出了以下提示:

“您还需要与映射器共享质心文件的位置。执行此操作的方法有很多,可以使用任何合适的方法。一种方法是使用Hadoop Configuration对象。您可以将其设置为配置对象中的“属性”属性,并在“映射器”设置函数中检索属性值。”

为此,我感到困惑。我的程序有一个主要功能,一个运行功能,一个映射器和一个reducer。还建议我使用Configuration set()和get()方法-然后可以为配置中的每个迭代设置文件名,然后将其传递给作业。然后,您可以在映射器中读取该文件名。

这有点令人困惑。是否在main()或run()函数中创建hadoop配置对象?我在主函数中设置了set(),然后在map函数中调用了get(),还是在run函数中设置了set()?每次使用新的/更新的centroids.txt文件时,它都会使for map中运行n幅图并减少n次函数的事情变得更加复杂。

任何想法表示赞赏!

最佳答案

实际上非常简单。 Hadoop映射器具有#setup方法,该方法在开始时会被调用以配置映射器。您要做的是通过以下方法读取centroids.txt文件:

class MyMapper extends Mapper {

double[][] centroids = new double[5][];

public void setup(Configuration conf) {
InputStream is = FileSystem.get(conf).open(new Path("centroids.txt"));
// read centroid values
}
}

如果您不想在映射器代码中对文件路径进行硬编码,则可以在提交作业之前将其传递给配置对象:
conf.set("centroids.path", "centroids.txt");

然后在mapper中阅读
InputStream is = FileSystem.get(conf).open(new Path(conf.get("centroids.path")));

关于hadoop - MapReduce-使用hadoop配置对象读取文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com