HDFS以64MB / 128MB的块存储数据,并以这些块大小跨任务节点复制数据。此块存储在节点的硬盘中。如果我在这个陈述中错了,请纠正我。
此块是否完全加载到RAM中,还是需要逐行流式传输?或两者都可能?
假设我有一个1GB的CSV文件,我想在其上执行一些计算,这些计算对于该CSV文件中的每一行都不是独立的。我的意思是计算需要处理10个连续的行。例如:计算行1:10,然后是2:11,然后是3:12等等。我有什么选择?将这1 GB多行数据转换为单行数据然后将其作为一个单一矩阵加载是个好主意(如果计算在整个64MB / 128MB块上计算复杂,我想这会溢出RAM)?< / p>
答案 0 :(得分:0)
1)数据沿数据节点复制。在大多数配置中,您希望任务节点也是数据节点。是的,它是物理存储的。
2)如果您使用标准阅读器,Hadoop用户会在输入分割上像缓冲读取器一样逐行“流”数据。还有其他读者,你也可以实现自己的读者
3)如果要处理10行文件,有几种方法可以处理。一种方法是将文件设置为不可分割。然后保证整个CSV由一个映射器处理。你可以自己拆分文件让很多映射器工作。我能想到的其他方法要复杂得多,或者在边界处有问题。我认为加载整个文件不是最好的主意,当你的.csv将来变得更大时你的方法必须失败。
如果您的作业是仅限地图的作业,则可以添加缩减阶段并计算这10行的特殊关键字(例如,它们与特殊问题相关等等)并获取缩减器中所有相关的行。不幸的是,我不太了解你的工作是否更具体
如果你是hadoop的新手,link可能会帮助你进入它
答案 1 :(得分:0)
1)你是对的(并且块大小是可配置的,但我将简要介绍一下Hadoop架构.Hadoop有一个带有两个守护进程组的主/从架构:NameNode / DataNode / SecondaryNameNode(SNN)和JobTracker / TaskTracker。 NameNode负责跟踪数据文件如何分解为文件块以及它们驻留在哪些数据节点.NamesNodes通常不会兼作DataNode.DataNodes读取和写入HDFS块到本地文件系统(磁盘)并与之通信其他用于复制的DataNode.SNN是一个助手守护程序,它与NameNode进行通信,用于最大限度地减少单点故障NameNode发生故障时的停机和数据丢失.JobTracker主机确定代码的执行计划和TaskTracker从属执行JobTracker分配的各个任务。
2)NameNode跟踪RAM中的所有datanode命名空间。将数据加载到HDFS后,将从磁盘进行流式处理以进行处理(HDFS针对顺序数据访问进行了优化)流式传输仅受存储数据的驱动器的最大I / O速率限制。请参阅此Cloudera帖子,了解最佳HDFS块大小http://blog.cloudera.com/blog/2009/02/the-small-files-problem/
3)你能描述一下你的用例吗?您可能必须定义自己的InputSplits,它们可以相当复杂(参见:http://developer.yahoo.com/hadoop/tutorial/module4.html)。如果您可以控制数据集,则可以对其进行预处理。或者,如果你可以控制你的文件大小,你可以把你的文件写成大块,比如64MB,大小为64MB。
答案 2 :(得分:0)
回答3):
如果您不介意丢失少数十行集,一个非常简单快速的解决方案是在LineReader周围构建一些代码 - 映射器第一次请求密钥/值对,您的LineReader版本读取10行,对于所有后续调用,您逐行读取。这只需要几行额外的代码。