gpt4 book ai didi

configuration - 通过 Hadoop 配置对象从 InputFormat 返回值

转载 作者:可可西里 更新时间:2023-11-01 14:31:57 25 4
gpt4 key购买 nike

考虑一个正在运行的 Hadoop 作业,其中自定义 InputFormat 需要向驱动程序类(即具有启 Action 业),从其覆盖的 getSplits() 方法中,使用新的 mapreduce API(与 mapred 相反)。

理想情况下,这些值应该在内存中返回(而不是将它们保存到 HDFSDistributedCache)。

如果这些值只是数字,人们可能会想使用 Hadoop 计数器。然而,在许多测试中,计数器似乎在 getSplits() 阶段不可用,而且无论如何它们都限于数字。

另一种方法是使用作业的 Configuration 对象,正如源代码所揭示的那样,对于 getSplits() 和驱动类。

在这种情况下,如果 InputFormat 想要“返回”一个(比方说)正长值给驱动程序类,代码将类似于:

// In the custom InputFormat.
public List<InputSplit> getSplits(JobContext job) throws IOException
{
...
long value = ... // A value >= 0
job.getConfiguration().setLong("value", value);
...
}


// In the Hadoop driver class.
Job job = ... // Get the job to be launched
...
job.submit(); // Start running the job
...
while (!job.isComplete())
{
...

if (job.getConfiguration().getLong("value", -1))
{
...
}
else
{
continue; // Wait for the value to be set by getSplits()
}

...
}

以上内容在测试中有效,但它是一种“安全”的值(value)观交流方式吗?

或者对于这种内存中的“回调”是否有更好的方法?

更新

“内存回调”技术可能不适用于所有 Hadoop 发行版,因此,如上所述,更安全的方法是,而不是将要传回的值保存在 >Configuration 对象,创建一个自定义对象,将其序列化(例如,作为 JSON),将其保存(在 HDFS 或分布式缓存中)并在驱动程序类中读取它。我还测试了这种方法,它按预期工作。

最佳答案

使用配置是一个非常合适的解决方案(诚然对于一个我不确定我是否理解的问题),但是一旦作业实际提交到作业跟踪器,您将无法修改此值(客户端或任务端)并期望在通信的另一端看到更改(例如,在映射任务中设置配置值不会持久保存到其他映射器,也不会保存到缩减器,也不会对作业跟踪器可见) .

因此,在您的示例中,将信息从 getSplits 内部传回客户端轮询循环(以查看作业何时实际完成定义输入拆分)就可以了。

您使用它的更大目标或用例是什么?

关于configuration - 通过 Hadoop 配置对象从 InputFormat 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16624688/

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