Avro技术应用_2. 使用 Avro 来存储大量小的二进制文件

本文探讨了在处理HDFS中的大量小文件时遇到的问题,提出使用Avro将小文件打包到一个大的文件容器中以减少NameNode内存消耗。Avro是一种数据序列化系统,提供高效的文件存储和数据交换,适用于Hadoop环境。文章通过示例代码展示了如何创建和读取Avro文件,以及如何利用MapReduce处理Avro文件。最后,比较了Avro与其他处理小文件的方法,如SequenceFile、Protocol Buffers、Thrift、zip文件、tarball、HAR文件和HDFS联合机制。
摘要由CSDN通过智能技术生成

大数据这个概念似乎意味着处理GB级乃至更大的文件。实际上大数据可以是大量的小文件。比如说,日志文件通常增长到MB级时就会存档。这一节中将介绍在HDFS中有效地处理小文件的技术。

假定有一个项目akin在google上搜索图片,并将数以百万计的图片分别存储在HDFS中。很不幸的是,这样做恰好碰上了HDFS和MapReduce的瓶颈,如下:

  1. Hadoop的NameNode将所有的HDFS元数据保存在内存中以加快速度。Yahoo估计平均每个文件需要600字节内存。那么10亿个文件就需要60GB内存。对于当下的中端服务器来说,60GB内存就显得太多了。
  2. 如果MapReduce的数据源是大量的文本文件或可分割文件,那么map任务个数就是这些文件占据的 Block 的数量。如果MapReduce的数据源是成千上百万的文件,那么作业将会消耗大量的时间在内核中创建和销毁map任务进程上。这些时间将会比实际处理数据的时间还要长。
  3. 如果在一个有调度器的受控环境中运行MapReduce作业,那么map任务的个数可能是受到限制的。由于默认每个文件都需要至少一个map任务,这样就有可能因为任务过多而被调度器拒绝运行。

思考如下问题:文件的大小和HDFS块大小相比,大概是什么比例?50%,70%,还是90%。如果大数据项目启动后,又突然需要成倍地扩展需要处理的文件。如果扩展仅仅需要增加节点,而不需要重新设计Hadoop过程,迁移文件等,是不是很美妙的事情。思考这些问题并在设计阶段及早准备是很有必要的。


Problem
需要处理HDFS中的大量文件,同时又不能超出NameNode的内存限制。
Solution
最简单的方案就是将HDFS中的小文件打包到一个大的文件容器中。这个技术中将本地磁盘中所有的目标文件存储到HDFS中的一个单独的Avro文件。然后在MapReduce中处理Avro文件和其中的小文件。

Discussion
图1中介绍了这个技术的第一部分,如何在HDFS中创建Avro文件。这样做可以减少HDFS中需要创建的文件数量,随之减少了NameNode的内存消耗


图1 . 使用 Avro来存储小文件可以更好的利用内存并提高效率

Avro是由Hadoop之父Doug Cutting发明的数据序列化和PRC库。主要用于提高Hadoop数据交换通用性版本控制的能力。Avro有着很强的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值