Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在单个Hadoop节点上写入多条记录_Hadoop_Hdfs_Distributed Computing_Apache Pig_Hdfstore - Fatal编程技术网

如何在单个Hadoop节点上写入多条记录

如何在单个Hadoop节点上写入多条记录,hadoop,hdfs,distributed-computing,apache-pig,hdfstore,Hadoop,Hdfs,Distributed Computing,Apache Pig,Hdfstore,我需要Hadoop问题的帮助。 在我的Java系统中,我有一个创建n条记录的函数。显然,每条记录都是一行,要在Hadoop中写入文本文件 问题是: 如何在同一个Hadoop节点中保存所有n条记录?换句话说,我希望n条记录被视为一条唯一的记录,以确保如果这些记录中的一条或其副本位于一个节点上,那么其他n-1条记录当然也位于同一个节点上 例如,假设我的函数创建: record1: 5 los angeles rainy record2: 8 new york sun

我需要Hadoop问题的帮助。 在我的Java系统中,我有一个创建n条记录的函数。显然,每条记录都是一行,要在Hadoop中写入文本文件

问题是: 如何在同一个Hadoop节点中保存所有n条记录?换句话说,我希望n条记录被视为一条唯一的记录,以确保如果这些记录中的一条或其副本位于一个节点上,那么其他n-1条记录当然也位于同一个节点上

例如,假设我的函数创建:

record1: 5     los angeles    rainy
record2: 8     new york       sunny
record3: 2     boston         rainy
当我将这三条记录附加到Hadoop的文本文件中的三行时,可能会出现这样的情况:record1转到node1,record2转到node2,record3转到node3。我想知道是否有办法确保所有三条记录都存储在同一个节点上,例如node2,而不是存储在不同的节点上


感谢您的关注。

Hadoop将基于默认的HashPartitioner对元组进行分区,并将具有相同密钥的元组发送给单个还原器进行聚合。如果默认HashPartitioner不符合要求,那么可以编写一个。是主干中HashPartitioner的代码

另一种方法是根据分区策略从映射器发出键,HashPartitioner将使用同一键的所有元组发送到其中一个reducer


另外,从映射的角度考虑,减少抽象级别,而不是节点级别。Hadoop试图隐藏集群的网络拓扑。

通过将并行度设置为1。这意味着通过将减速器的数量指定为1。然后,所有记录都会写入一个零件文件。但缺点是您的工作需要更长的时间才能完成。

听起来您可能需要一个自定义分区器来确保给定的键模式最终出现在特定的减速器上。不过,我认为增加问题的清晰度将有助于人们更好地理解您的问题。我已对其进行了编辑,抱歉,如果我没有解释,我可能仍然对您的问题感到困惑,因此,如果这没有帮助,我深表歉意。如果将还原数设置为1,则可以保证所有记录都写入同一个文件,而代价是完成作业所需的时间更长。否则,您可以编写一个自定义分区程序,该程序将指定满足某些条件的键最终位于特定的缩减器,即一个文件中的5和8,而另一个文件中的2。但是,文件将在HDFS中,因此无论您选择哪个选项,都会跨多个节点进行复制。