Java 如何在输入拆分上计算位置

Java 如何在输入拆分上计算位置,java,hadoop,input-split,Java,Hadoop,Input Split,在“Hadoop-权威指南”中,它说--> 运行作业的客户端通过调用getSplits()计算作业的拆分,然后将其发送到jobtracker,jobtracker使用其存储位置来安排映射任务,以便在TaskTracker上处理这些任务 public abstract class InputSplit { public abstract long getLength() throws IOException, InterruptedException; public abstract Stri

在“Hadoop-权威指南”中,它说-->

运行作业的客户端通过调用getSplits()计算作业的拆分,然后将其发送到jobtracker,jobtracker使用其存储位置来安排映射任务,以便在TaskTracker上处理这些任务

public abstract class InputSplit { 
public abstract long getLength() throws IOException, InterruptedException; 
public abstract String[] getLocations() throws IOException,
}
我们知道getLocations()返回一个主机名数组

问题1:客户端如何知道要返回哪些主机名。这不是工作追踪者的工作吗

问题2:两个不同的InputSplit对象能否返回相同的主机名?如何确定主机名。是谁干的


我觉得客户机与namenode联系以获取文件(包括副本)的所有主机名,并进行一些数学运算以获得为每个inputsplit设置的位置。这是真的吗?

Q客户端如何知道要返回哪些主机名。这不是工作追踪者的工作吗

A.输入拆分由作业配置中使用的输入格式创建。在创建逻辑拆分集的过程中,它会向Name节点发出请求,询问构成拆分的块的位置。作业跟踪器的职责是确保它根据InputSplit中的信息,在考虑数据位置的情况下尝试运行映射任务

问题2:两个不同的InputSplit对象能否返回相同的主机名?如何确定主机名。是谁干的

当然可以。每个输入拆分都有自己的公式来计算拆分。请记住,输入拆分不需要与块大小相同

希望这能有所帮助。

您说:“它向名称节点伸出手来,询问构成拆分的块的位置。”。我的理解是:客户机首先联系namenode,然后联系jobtracker。对的但是,我不同意namenode返回拆分集。我认为它只是返回块的位置,客户端使用这些块形成分割。你怎么说?