Hadoop小文件存取的讨论
现在的系统中,存在大量的小文件,放在Hadoop中,将极大的消耗namenode的资源。放在HBase中,由于Hbase的value最大长度是 64KB,而很多小文件又大过这个级别。HBase当时的设计是为了存储网页元素这样的小数据,顶多几K,如果存储1M左右的小文件,还是不合适的。
直接放在hadoop文件系统中,大多只是做归档分析用,所以,我们就想能不能定期归档。
于是想到用sequenceFile, 文件名为key,整行文件内容为value。这样子解决了存储的问题。
但是查询起来并不方便。如果要查询sequenceFile的某个文件,则需要遍历整个sequenceFile。
如果每次记录下sequenceFile每个entry的position,就可以快速定位到这个entry。具体的方法是在append一行之前,调用
sequenceFile.writer的getlength()方法,记录下entry的位置,下次查询的时候,直接seek()到该位置就可以直接取
得文件的内容。
其实,Hadoop还提供了MapFile,就是SequenceFile的带索引版本。可以支持get by key的查询。
这样,Hadoop小文件存取的问题貌似解决了。但是还是有很多问题。
最大的问题就是需要定期归档,如果能够对Hadoop改造或者封装,直接让他支持小文件该多好。
淘宝的TFS是专门针对小文件进行设计的。

浙公网安备 33010602011771号