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