Hadoop HDFS中的存储格式
HDFS如何存储数据 我想以压缩的方式存储巨大的文件 例如:我有一个1.5 GB的文件,默认复制系数为3 它需要(1.5)*3=4.5 GB的空间 我认为目前没有对数据进行隐式压缩Hadoop HDFS中的存储格式,hadoop,hdfs,storage,Hadoop,Hdfs,Storage,HDFS如何存储数据 我想以压缩的方式存储巨大的文件 例如:我有一个1.5 GB的文件,默认复制系数为3 它需要(1.5)*3=4.5 GB的空间 我认为目前没有对数据进行隐式压缩 是否有一种技术可以压缩文件并将其存储在HDFS中以节省磁盘空间 HDFS将任何文件存储在多个“块”中。块大小可根据每个文件进行配置,但有一个默认值(如64/128/256 MB) 因此,给定一个1.5GB的文件和128MB的块大小,hadoop会将该文件分成12个块(12x128MB~=1.5GB)。每个块的复制次数
是否有一种技术可以压缩文件并将其存储在HDFS中以节省磁盘空间 HDFS将任何文件存储在多个“块”中。块大小可根据每个文件进行配置,但有一个默认值(如64/128/256 MB) 因此,给定一个1.5GB的文件和128MB的块大小,hadoop会将该文件分成12个块(12x128MB~=1.5GB)。每个块的复制次数也是可配置的 如果数据压缩良好(如文本文件),则可以压缩文件并将压缩文件存储在HDFS中-如上所述,同样适用,因此如果1.5GB文件压缩到500MB,则将存储为4个块
但是,在使用压缩时要考虑的一个问题是压缩方法是否支持拆分文件——也就是说,您是否可以随机地查找文件中的一个位置并恢复压缩流(GZIP例如不支持拆分,BZIP2确实如此)。p> 即使该方法不支持拆分,hadoop仍会将文件存储在多个块中,但您将失去一些“数据局部性”的好处,因为这些块很可能分布在集群中
在map reduce代码中,Hadoop默认安装了许多压缩编解码器,并将自动识别某些文件扩展名(例如,GZip文件的扩展名为(.gz)),从而使您不再担心是否需要压缩输入/输出 希望这有意义 编辑一些附加信息以回应评论: 当作为Map Reduce作业的输出写入HDFS时,请参阅FileOutputFormat的API,特别是以下方法:- setCompressOutput(作业,布尔值)
- setOutputCompressorClass(作业、类)
当将文件上传到HDFS时,是的,它们应该被预压缩,并且具有该压缩类型的相关文件扩展名(开箱即用,hadoop支持带有.gz扩展名的gzip,因此file.txt.gz将表示一个gzip文件)不久前,我在一篇博客文章中尝试对此进行总结。 从本质上讲,这是一个数据可拆分性问题,因为文件被划分为块,这些块是用于复制的基本块。名称节点负责跟踪属于一个文件的所有这些块。在选择压缩时,块必须是自主的——并非所有编解码器都是可拆分的。如果format+编解码器不可拆分,这意味着为了解压缩它,它需要位于一个对mapreduce中的并行性有很大影响的位置。基本上在单个插槽中运行。
希望能有所帮助。请看一下演示文稿,尤其是幻灯片6和幻灯片7
这个问题的答案是首先了解Hadoop中现在可用的文件格式。现在在HDFS中可以选择管理文件格式和压缩技术。使用LZO或BZIP进行显式编码和拆分的替代方法。现在有许多格式支持块压缩和具有特性的列行压缩 存储格式是定义信息存储方式的一种方式。这通常由文件的扩展名表示。例如,我们知道图像可以是多种存储格式,PNG、JPG和GIF等。所有这些格式都可以存储相同的图像,但每种格式都有特定的存储特性 在Hadoop文件系统中,您可以使用所有传统的存储格式(如您愿意,可以在HDFS上存储PNG和JPG图像),但也可以使用一些Hadoop文件格式来处理结构化和非结构化数据 为什么了解这些格式很重要 在任何性能权衡中,支持HDFS的应用程序(如MapReduce、Hive、HBase和Spark)的一个巨大瓶颈是在特定位置查找相关数据所需的时间以及将数据写回另一个位置所需的时间。在管理大型数据集时,这些问题会更加突出。Hadoop文件格式已经发展到可以在许多用例中缓解这些问题 选择适当的文件格式可以带来一些显著的好处: