0

我是hadoop的初学者,阅读hadoop中的小文件问题,现在我有一个问题要解决,帮助我开始

问题 :

源结果:大约 100 万+(大约)个文件,每个文件大小接近 1 kb(无法阻止创建或调整大小)

结果分组: 源结果被分组为 1000 个文件 A 组。

所需任务:

组中的文件将以一对一的方式进行比较文件是遵循特定标准结构(标题、内容...等)的二进制细节(生物特征)文件

由于预计源结果会随着时间增加,我想在 hadoop 上实现比较

Hadoop的输入:

< 输入文件 > < HARFile > < 输出 >

< 输入文件示例 >:

请注意,文件名是唯一的 id,单独发出文件名会有很大帮助

            08RTC345744.txt 08RTC345746.txt
            08RTC345744.txt 08RTC3457XX.txt
            08RTXX457XX.txt 08YYC3457YY.txt
            ..................
             XXXXXXN.txt YYYYYYN.txt

过程算法:(它没有实现,只是一个想法)

  1. 逐行读取输入文件
  2. 借助 har:// 读取行中的每个文件(例如:读取 har://xxx/08RTC345744.txt 和 har://xxx/08RTC345746.txt )
  3. 使用相关的生物特征算法比较从 hdfs (HAR) 读取的文件
  4. 如果它们显示相似性 Emit < Filenames > < Count >

< HARFile 示例文件 >

08RTC345744.txt 
08RTC345746.txt
08RTC345745.txt 
08RTC3457XX.txt
08RTXX457XB.txt 
08YYC3457YY.txt

1)在 Hadoop 中实现是一个更好的主意吗?

2)我读到比较小文件是hadoop中的一个问题,为一组组形成一个HAR文件然后比较更好吗?

3)我的 过程算法:工作与否?

4) 有效吗?我想,当然不是,还有其他想法吗?

5)关于生物特征匹配的 MapReduce 有什么想法吗?

6)HBASE 是一个解决方案吗?

4

1 回答 1

0

您拥有的数据量处于可以在 hadoop 集群中处理的边界线。除非您有更多文件进入,否则一个小型集群就足够了。

您在这里遇到的第一个问题是将数据摄取到集群中。如果我没有正确理解,您有很多小文件,每个文件都包含一个数据记录。您最终想要的是更少的大文件。为了解决这个问题,我会在摄取之前或摄取时合并文件。HAR 文件不是一个好的选择。您可以通过多种方式做到这一点,这主要取决于您的数据将如何到达您的集群以及您稍后将如何处理它。你可以去看看。如果您的数据以无限流的形式出现,请查看: - Apache Flume - Apache Kafka - Apache Storm - Apache Spark 如果您的数据已经在某个地方并且您正在做一次性工作: - 实施您自己的合并程序。

这里的共同点是您希望将每个文件表示为一个数据记录。然后,您可以决定要存储许多记录的文件格式。通过正确配置上述工具,您最终会在 HDFS 上获得包含数据记录的大文件。

然后,您需要决定如何处理数据。您想将记录相互比较,为此您还可以使用多种工具:

  • 普通的 MapReduce。使用低级工具实现一切。查看如何有效地进行交叉连接,因为这就是您正在做的事情。
  • 蜂巢。实现一个 UDF,它调用您的比较算法并将整个作业表示为 SQL 查询。
  • 猪。类似于 hive,但有自己的脚本语言。
  • 阿帕奇火花。具有良好 API 的较新工具,能够像 MapReduce 一样实现工作,但以更简单和更清洁的方式。

使用什么最终取决于您的用例和可用环境。

于 2014-12-31T12:28:58.887 回答