2013-06-02 39 views
4

我的工作是为静态图像/视频文件设计分布式系统。数据的大小约为几十太字节。它主要用于HTTP访问(因此不需要对数据进行处理;或者只进行简单的处理,例如调整大小 - 但这并不重要,因为它可以直接在应用程序中完成)。从Hadoop发送静态文件

为了更加清楚一点,那就是一个系统:

  1. 必须分布(水平刻度),因为数据的总规模是非常大的。
  2. 主要通过HTTP提供小静态文件(如图像,缩略图,短视频)。
  3. 通常,不需要处理数据(因此不需要MapReduce)
  4. 设置对数据的HTTP访问可以轻松完成。
  5. (应该有)吞吐量好。

我正在考虑:

  1. 本地网络文件系统:但是因为数据无法放入一台机器似乎并不可行。

  2. Hadoop文件系统。我以前使用过Hadoop mapreduce,但我没有经验将Hadoop用作HTTP请求的静态文件存储库。所以我不知道这是可能的还是推荐的方式。

  3. MogileFS。看起来很有前途,但我觉得使用MySQL来管理本地文件(在一台机器上)将会产生太多的开销。

有什么建议吗?

回答

7

我是Weed-FS的作者。根据您的要求,WeedFS是理想的。 Hadoop无法处理许多小文件,除了原因外,每个文件都需要在主文件中有一个条目。如果文件数量很大,则hdfs主节点无法扩展。

当使用最新的Golang版本进行编译时,Weed-FS正在变得更快。

最近对Weed-FS做了许多新的改进。现在,您可以使用内置的上传工具轻松进行测试和比较。这个在一个目录下递归地上传所有文件。

weed upload -dir=/some/directory 

现在,您可以通过“杜-k /一些/目录”比较,以查看磁盘使用情况,以及“ls -l命令/你/杂草/体积/目录”看到杂草-FS磁盘使用情况。

我想你需要数据中心的复制,机架感知等等。

+0

嗨克里斯,我一直在探索可用于分布式服务器的服务图像的选项和杂草fs outshone所有。我想知道,如果将文件中的文件组织到文件夹中,是否存在任何缺点。我真的很新,没有太多可用的信息,这就是为什么我直接与你联系。急切地等待你的回应。也请我可以得到一个示例配置XML。我正在使用ubuntu,jdk-8,并通过由zhangxu创作的java客户端连接 – qualebs

+0

您需要有一个地方来存储上传文件的生成文件ID。如果您需要遍历文件夹,可能还可以将文件夹与文件ID一起存储。或者你可以使用weed-fs filer。 – chrislusf

2

Hadoop有一个用于访问文件的rest API。请参阅文档中的this条目。我觉得Hadoop并不意味着存储大量的小文件。

  • HDFS不适合有效地访问小文件:它主要是为大文件的流式访问而设计的。通过小文件读取通常会导致大量的搜索和从datanode跳转到datanode以检索每个小文件,所有这些都是低效的数据访问模式。
  • HDFS中的每个文件,目录和块都表示为namenode内存中的一个对象,每个文件占用150个字节。该块的大小是64 MB。所以即使文件大小为10kb,也会分配一个64 MB的完整块。这是一个浪费的磁盘空间。
  • 如果文件很小并且有很多文件,那么每个地图任务只处理很少的输入,而且还有更多的地图任务,每个任务都会增加额外的簿记开销。比较一个1GB的文件分成16个64MB的文件和10,000个100KB的文件。 10,000个文件每个都使用一个映射,并且作业时间可能比具有单个输入文件的等效文件慢几十到几百倍。

在“2011的Hadoop峰会”,有this talk通过KARTHIK阮冈纳赞关于Facebook消息,他一语道破此位:在HDFS Facebook的存储数据(配置文件,邮件等),但他们不使用图像相同的红外和视频。他们有自己的系统名为Haystack的图像。它不是开源的,但他们分享了关于它的抽象设计级别细节。

这将我带到weed-fs:受Haystacks设计启发的开源项目。它的裁缝用于存储文件。直到现在我还没有使用它,但似乎值得一试。

3

Hadoop针对大文件进行了优化,例如它的默认块大小是64M。许多小文件既浪费又难以在Hadoop上管理。

你可以看看其他分布式文件系统,例如GlusterFS

0

如果您可以批处理文件,并且无需在添加到HDFS后更新批处理,那么您可以将多个小文件编译为单个较大的二进制序列文件。这是将小文件存储在HDFS中的一种更有效的方式(正如Arnon指出的那样,HDFS是针对大文件设计的,并且在处理小文件时效率非常低)。

这是我在使用Hadoop处理CT图像时所采取的方法(详细信息在Image Processing in Hadoop)。在这里,225扫描CT扫描(每个单独的图像)被编译成一个单一的,更大的二进制序列文件,用于长时间流读取到Hadoop进行处理。

希望这会有所帮助!

G