我需要Hadoop问题的帮助。
在我的 Java 系统中,我有一个创建 n 条记录的函数。显然,每条记录都是在Hadoop中写入文本文件中的一行。
问题是:
如何将所有 n 条记录保存在同一个 Hadoop 节点中?换句话说,我希望将 n 条记录视为唯一记录,以确保如果这些记录之一(或其副本之一)位于节点上,那么其他 n-1 条记录当然也在同一节点上。
例如,假设我的函数创建:
record1: 5 los angeles rainy
record2: 8 new york sunny
record3: 2 boston rainy
当我在Hadoop的文本文件中附加这三条记录(三行)时,可能会发生记录1转到节点1,记录2转到节点2,记录3转到节点3的情况。我想知道是否有办法确保所有三个记录都存储在同一个节点上,例如node2,并且它们不存储在不同的节点上。
感谢您的关注。
Hadoop将根据默认的HashPartitioner对元组进行分区,并将具有相同键的元组发送到单个化简器进行聚合。如果默认的哈希分区程序不符合要求,则可以编写自定义分区程序。这是主干中 HashPartitioner 的代码。
另一种方法是根据分区策略从映射器发出键,HashPartitioner 会将具有相同键的所有元组发送到其中一个化简器。
此外,在 Map 和 Reduce 级别进行抽象思考,而不是在节点级别考虑。Hadoop试图隐藏集群的网络拓扑。
通过将并行度设置为 1。这意味着将您的减速器数量指定为一个。然后,您的所有记录都将写入一个部分文件。但缺点是你的工作需要更长的时间才能完成。