我被问到这样一个问题:假设我有1000万个文件,大小为2kb,那么我可以把它存储在hdfs中吗?请回答这个问题。
inkz8wg91#
hdfs用于处理大文件。如果加载2kb的文件,则会增加开销并在name节点上加载,因为它存储有关文件的元数据。块大小是文件系统可以存储的最小数据单位。如果你存储一个2kb的文件,它会占用一个街区。一旦您越过64mb的边界,您需要第二个块,读取操作的数量将很大,这将增加读取开销。最好的方法是将所有2kb文件合并成一个文件并保存在hadoop上。
iqih9akk2#
如果namenode上有足够的内存来存储所有的文件元数据,当然可以存储在hdfs中。另外,您可以指定每个文件的块大小,以便可以根据需要设置为2kb,而不是使用默认的64mb块大小来浪费hdfs空间。请注意,通过减少每个文件的块大小,使用这样的hdfs来存储大量的小文件是很好的。如果在大量小文件上运行mapreduce计算,您将遇到问题。另外,请注意,64 mb是hdfs上的默认块大小,但您可以自由设置大大小(128 mb或256 mb或更大)甚至更小的块大小。hdfs本身没有blocksize的概念,必须强制使用blocksize参数的是底层本机文件系统(通常是linux),而linux在幕后就是这么做的。
2条答案
按热度按时间inkz8wg91#
hdfs用于处理大文件。如果加载2kb的文件,则会增加开销并在name节点上加载,因为它存储有关文件的元数据。
块大小是文件系统可以存储的最小数据单位。如果你存储一个2kb的文件,它会占用一个街区。一旦您越过64mb的边界,您需要第二个块,读取操作的数量将很大,这将增加读取开销。
最好的方法是将所有2kb文件合并成一个文件并保存在hadoop上。
iqih9akk2#
如果namenode上有足够的内存来存储所有的文件元数据,当然可以存储在hdfs中。另外,您可以指定每个文件的块大小,以便可以根据需要设置为2kb,而不是使用默认的64mb块大小来浪费hdfs空间。请注意,通过减少每个文件的块大小,使用这样的hdfs来存储大量的小文件是很好的。如果在大量小文件上运行mapreduce计算,您将遇到问题。
另外,请注意,64 mb是hdfs上的默认块大小,但您可以自由设置大大小(128 mb或256 mb或更大)甚至更小的块大小。hdfs本身没有blocksize的概念,必须强制使用blocksize参数的是底层本机文件系统(通常是linux),而linux在幕后就是这么做的。