hadoop 使用分布式计算群集解决“小数据”问题?

u2nhd7ah  于 2022-11-01  发布在  Hadoop
关注(0)|答案(1)|浏览(202)

我正在学习Hadoop + MapReduce and Big Data,从我的理解来看,Hadoop生态系统的主要设计目的是分析分布在许多服务器上的大量数据。
我有一个相对少量的数据(一个由1- 1000万行数字组成的文件),需要用数百万种不同的方法进行分析。例如,考虑以下数据集:

  1. [1, 6, 7, 8, 10, 17, 19, 23, 27, 28, 28, 29, 29, 29, 29, 30, 32, 35, 36, 38]
  2. [1, 3, 3, 4, 4, 5, 5, 10, 11, 12, 14, 16, 17, 18, 18, 20, 27, 28, 39, 40]
  3. [2, 3, 7, 8, 10, 10, 12, 13, 14, 15, 15, 16, 17, 19, 27, 30, 32, 33, 34, 40]
  4. [1, 9, 11, 13, 14, 15, 17, 17, 18, 18, 18, 19, 19, 23, 25, 26, 27, 31, 37, 39]
  5. [5, 8, 8, 10, 14, 16, 16, 17, 20, 21, 22, 22, 23, 28, 29, 30, 32, 32, 33, 38]
  6. [1, 1, 3, 3, 13, 17, 21, 24, 24, 25, 26, 26, 30, 31, 32, 35, 38, 39, 39, 39]
  7. [1, 2, 4, 4, 5, 5, 10, 13, 14, 14, 14, 14, 15, 17, 28, 29, 29, 35, 37, 40]
  8. [1, 2, 6, 8, 12, 13, 14, 15, 15, 15, 16, 22, 23, 24, 26, 30, 31, 36, 36, 40]
  9. [3, 6, 7, 8, 8, 10, 10, 12, 13, 17, 17, 20, 21, 22, 33, 35, 35, 36, 39, 40]
  10. [1, 3, 8, 8, 11, 11, 13, 18, 19, 19, 19, 23, 24, 25, 27, 33, 35, 37, 38, 40]

我需要分析每一列(Column N)在一定数量的行(L rows later)之后重复的频率。例如,如果我们使用1L(1-Row-Later)分析Column A,结果将如下所示:

  1. Note: The position does not need to match - so number can appear anywhere in the next row
  2. Column: A N-Later: 1 Result: YES, NO, NO, NO, NO, YES, YES, NO, YES -> 4/9.

我们将对每一列分别重复上述分析,最多重复N次。在上述仅包含10行的数据集中,这意味着最多重复9 N次。但在包含100万行的数据集中,分析(对每一列)将重复999,999次。
我研究了MapReduce框架,但它似乎并不能解决这个问题;它似乎不是解决这个问题的有效方案,并且需要大量的工作来将核心代码转换为MapReduce友好的结构。
正如您在上面的示例中所看到的,每个分析都是相互独立的。例如,可以分别分析Column BColumn A。也可以分别执行1L2L分析,依此类推。但是,与数据位于不同机器上的Hadoop不同,在我们的场景中,每台服务器都需要访问所有数据以执行其“共享”的分析。
我研究了这个问题的可能解决方案,似乎有非常少的选择:Ray或使用Apache TwillYARN上构建自定义应用程序。Apache Twill在2020年是moved to the Attic,这意味着Ray是唯一可用的选项。
Ray是解决此问题的最佳方法吗?或者还有其他更好的选择?理想情况下,解决方案应自动处理故障转移并智能地分配处理负载。例如,在上面的示例中,如果我们希望将负载分配到20台机器上,则一种方法是将999 999 N之后到20,让机器A分析1 L-49999 L,机器B从50000 L-100000 L等等。但是,当你想一想,负载分布不均匀-因为分析1 L与500000 L所需的时间长得多,因为后者仅包含大约一半的行数(对于500000 L,我们分析的第一行是第500001行,因此我们基本上从分析中忽略了前500 K行)。
它也应该需要对核心代码进行大量修改(像MapReduce那样)。
我正在使用Java
谢谢

vkc1a9a2

vkc1a9a21#

你是对的--你的场景和你的技术堆栈并不是那么合适。这就提出了一个问题--为什么不(添加)一些与你当前的技术堆栈更相关的东西呢?例如-- Redis DB。
看起来你的常用操作主要是计算值,你想防止过度计算,并使它更有性能(例如-正确索引你的数据)。考虑到这是Redis的主要功能之一-听起来把它用作处理器是合乎逻辑的

我的建议:

创建一个hashmap,使用数值作为键,使用计数作为值。这样,你就可以在这些指标上进行不同的计算,并且每次迭代一次数据集。之后,你只需要按照不同的标准(根据计算或指标)从Redis中提取数据。
从这里开始,您可以轻松地将计算数据储存回数据库,并准备直接查询。整个程序可能类似于:

  • 扫描文件中的数据
  • 将其正确索引到redis(使用hashmap
  • 进行所需的计算(在索引计数上)
  • 将其保存在数据库中(作为摘要数据集)
  • 刷新Redis数据库
  • 查询数据库(根据需要进行查询)

遵循populating and retrieving数据的文档

展开查看全部

相关问题