如果我需要对大小在200到500MB之间变化的(不可分割的)数千个gzip文件进行连续扫描,那么这些文件的适当块大小是多少?
出于本问题的考虑,假设处理速度非常快,因此即使针对大块大小,重新启动映射器也不会很昂贵。
我的理解是:
1. 块大小几乎没有上限,因为对于我的集群大小,有足够数量的映射器适用于“大量文件”。 2. 为确保数据局部性,我希望每个gzip文件都在一个块中。
然而,gzipped文件的大小不同。如果我选择了~500MB(例如所有输入文件的最大文件大小)的块大小,数据将如何存储?选择“非常大”的块大小,例如2GB是否更好?在任一情况下,HDD容量是否被浪费过多?
我想我真正想知道的是文件实际上是如何存储和拆分的,以及如何获得对不可分割文件的最佳实践的理解。
更新:具体示例
假设我正在运行三个200 MB文件的MR作业,存储如下图所示。
如果HDFS像A案例中一样存储文件,则保证有3个映射器能够处理每个“本地”文件。但是,如果文件存储如B案例所示,则一个映射器将需要从另一个数据节点获取部分文件2。
考虑到有大量空闲块,HDFS会将文件存储为A案例或B案例中所示的方式?
出于本问题的考虑,假设处理速度非常快,因此即使针对大块大小,重新启动映射器也不会很昂贵。
我的理解是:
1. 块大小几乎没有上限,因为对于我的集群大小,有足够数量的映射器适用于“大量文件”。 2. 为确保数据局部性,我希望每个gzip文件都在一个块中。
然而,gzipped文件的大小不同。如果我选择了~500MB(例如所有输入文件的最大文件大小)的块大小,数据将如何存储?选择“非常大”的块大小,例如2GB是否更好?在任一情况下,HDD容量是否被浪费过多?
我想我真正想知道的是文件实际上是如何存储和拆分的,以及如何获得对不可分割文件的最佳实践的理解。
更新:具体示例
假设我正在运行三个200 MB文件的MR作业,存储如下图所示。
如果HDFS像A案例中一样存储文件,则保证有3个映射器能够处理每个“本地”文件。但是,如果文件存储如B案例所示,则一个映射器将需要从另一个数据节点获取部分文件2。
考虑到有大量空闲块,HDFS会将文件存储为A案例或B案例中所示的方式?
max(filesize)
或max(filesize)*20
可能会对性能(当文件不可分割时)或存储“浪费”(取决于文件实际如何分布在块中)产生巨大影响。 - jkgeyti