我看到我们可以在 hadoop 集群中配置不同的参数。如果我们配置 master 有点困惑,这些配置在客户端节点中复制?或者每个节点都应该单独配置?
例如,在主节点中将块大小设置为 128MB,所以所有客户端节点将有 128MB,或者由于这些节点未配置,默认值是 64MB?如果使用主设置,那么对于系统参数被视为没有核心的配置,如何处理这些?
Hadoop 中的配置更复杂。实际上,hadoop 让 API 用户决定如何使用配置。
例如,让我们发现文件块大小是如何确定的。文件块大小使用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 输出文件有不同的块大小。
这种情况是您可以使用在客户端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.size
是conf.get("fs.local.block.size")
。_ 文件系统.create
但是,如果你写一个 MapReduce 作业来输出一些文件,那就有点复杂了。
如果在一个 TaskTracker 中,fs.local.block.size
is not final
,则此 TaskTracker 中输出文件的块大小将fs.local.block.size
在客户端。因为作业配置将提交到TaskTracker。
如果在此 TaskTracker 中,fs.local.block.size
是final
,因为fs.local.block.size
不能被作业配置覆盖,则此 TaskTracker 中的块大小将fs.local.block.size
在 TaskTracker 节点中。所以在这种情况下,如果你的配置在不同的节点不一致,你可能会发现 MapReduce 输出文件有不同的块大小。
以上分析仅适用于fs.local.block.size
。对于其他配置,您可能需要阅读相关的源代码。
最后,我建议让你的所有配置保持一致,以避免陷入奇怪的行为。