我没有hadoop的实际经验——我只学到了一些理论。我面临的任务是使用集群处理一个巨大的csv文件(比内存大得多),我提出了以下步骤。
假设csv文件包含3亿行,我将其称为1-1亿行part1、1.01-2亿行part2和2.01-3亿行part3(这只是一个例子,因为在实践中,数据必须被分割成更多的部分,以便在内存中进行处理)
我想按以下方式将数据分发到节点上。
采集的节点号数据
仅节点1第1部分
仅节点2第2部分
仅节点3第3部分
节点4第1部分和第2部分
节点5第2部分和第3部分
节点6第1部分和第3部分
您可以看到,有些节点只获取数据的一部分,有些节点获取数据的两部分。根据这一点,两个函数中的一个将应用于每个节点。我知道这可以通过一个if-else语句来实现。i、 我的减速机应该是这样的
if(节点1,2,3)运行函数 f1(data_block)
if(节点4、5、6)运行函数 f2(data_blockA,data_blockB)
问题是,我学到的大多数hadoop示例都不允许每个节点选择要读取的数据部分。数据以黑匣子的方式分发到节点。有什么办法可以解决这个问题吗?p、 我想依赖hadoop流,因为我的主要语言是python,而不是java,所以这可能是另一个限制。
1条答案
按热度按时间gblwokeq1#
在hdfs体系结构中,有块的概念。hdfs使用的典型块大小是64 mb。当我们把一个大文件放入hdfs时,它会被切碎成64mb的块(基于默认的块配置),假设你有一个1gb的文件,你想把这个文件放入hdfs,那么会有1gb/64mb=16个split/块,这些块会分布在数据节点上。
数据拆分是基于文件偏移量进行的。文件拆分的目标是数据的并行处理和故障转移。
根据您的群集配置,这些块/区块将驻留在不同的数据节点上。为每个块分配一个块id,namenode保留每个文件的块信息。
假设你有一个128mb的文件,你想把这个文件写在hdfs上。
客户机首先将文件分为块,如块a、块b,然后客户机与name node交互,并请求写入块的位置(块a、块b)。
然后客户机从这些列表中选择第一个数据节点,并将第一个块写入数据节点,一旦写入过程和复制完成,数据节点就会将该块复制到另一个数据节点。第一个数据节点给出了它接收到的块的确认。然后客户机将另一个块写入数据节点。namenode保存有关文件及其关联块的信息。
当客户端请求读取数据时,它首先向namenode发出请求以获取特定文件的数据位置,然后namenode将有关数据的块信息提供给客户端。
所以您不必担心hdfs上的数据替换。
回答您的问题:
在hadoop上没有其他方法可以控制数据替换策略,但是如果您根据hdfs块大小(比如块大小为64mb,数据大小为63mb)划分文件,那么一个文件将占用一个块,它将在特定的datanode上运行,但datanode将再次由namenode选择。稍后,您可以检查文件所在的datanode。
但是将小文件放在hadoop上并不是处理hadoop的有效方法,因为hadoop是为处理非常大的数据集而设计的,而小文件可能是namenode的开销。有关hadoop上的小文件问题,请参见此链接
下面的链接可以帮助您了解更多关于hadoop的信息。
http://docs.spring.io/spring-hadoop/docs/2.0.4.release/reference/html/store.html
http://www.aosabook.org/en/hdfs.html