1

我看到我们可以在 hadoop 集群中配置不同的参数。如果我们配置 master 有点困惑,这些配置在客户端节点中复制?或者每个节点都应该单独配置?

例如,在主节点中将块大小设置为 128MB,所以所有客户端节点将有 128MB,或者由于这些节点未配置,默认值是 64MB?如果使用主设置,那么对于系统参数被视为没有核心的配置,如何处理这些?

4

1 回答 1

0

Hadoop 中的配置更复杂。实际上,hadoop 让 API 用户决定如何使用配置。

例如,让我们发现文件块大小是如何确定的。文件块大小使用fs.local.block.size配置中的值。

客户端配置中没有设置 fs.local.block.size

这种情况是在客户端conf.get("fs.local.block.size");返回的。null

如果您使用以下代码(代码在您的客户端中)在 HDFS 中创建文件,

FileSystem fs = FileSystem.get(conf);
FSDataOutputStream output = fs.create(new Path("/new/file/in/hdfs"));
// write your data to output...

然后fs.local.block.size使用默认值,即 32MB ( 32 * 1024 * 1024)

但是,如果您编写 MapReduce 作业来输出某些文件(我假设您使用TextOutputFormat,某些自定义输出格式可能会改变以下行为),文件块大小由 TaskTracker 的配置决定。所以在这种情况下,如果你的配置在不同的节点不一致,你可能会发现 MapReduce 输出文件有不同的块大小。

fs.local.block.size 在客户端的配置中设置

这种情况是您可以使用在客户端conf.get("fs.local.block.size");获取的值。fs.local.block.size

如果您使用以下代码(代码在您的客户端中)在 HDFS 中创建文件,

FileSystem fs = FileSystem.get(conf);
FSDataOutputStream output = fs.create(new Path("/new/file/in/hdfs"));
// write your data to output...

fs.local.block.sizeconf.get("fs.local.block.size")。_ 文件系统.create

但是,如果你写一个 MapReduce 作业来输出一些文件,那就有点复杂了。

如果在一个 TaskTracker 中,fs.local.block.sizeis not final,则此 TaskTracker 中输出文件的块大小将fs.local.block.size在客户端。因为作业配置将提交到TaskTracker。

如果在此 TaskTracker 中,fs.local.block.sizefinal,因为fs.local.block.size不能被作业配置覆盖,则此 TaskTracker 中的块大小将fs.local.block.size在 TaskTracker 节点中。所以在这种情况下,如果你的配置在不同的节点不一致,你可能会发现 MapReduce 输出文件有不同的块大小。

以上分析仅适用于fs.local.block.size。对于其他配置,您可能需要阅读相关的源代码。

最后,我建议让你的所有配置保持一致,以避免陷入奇怪的行为。

于 2013-08-16T02:55:00.070 回答