解决分布式计算集群'Small Data'问题?



我正在了解Hadoop + MapReduce and Big Data,根据我的理解,Hadoop生态系统似乎主要用于分析分布在许多服务器上的大量数据。我的问题有点不同。

我有一个相对少量的数据(一个由1-10百万行数字组成的文件),需要以数百万种不同的方式进行分析。例如,考虑以下数据集:

[1, 6, 7, 8, 10, 17, 19, 23, 27, 28, 28, 29, 29, 29, 29, 30, 32, 35, 36, 38]
[1, 3, 3, 4, 4, 5, 5, 10, 11, 12, 14, 16, 17, 18, 18, 20, 27, 28, 39, 40]
[2, 3, 7, 8, 10, 10, 12, 13, 14, 15, 15, 16, 17, 19, 27, 30, 32, 33, 34, 40]
[1, 9, 11, 13, 14, 15, 17, 17, 18, 18, 18, 19, 19, 23, 25, 26, 27, 31, 37, 39]
[5, 8, 8, 10, 14, 16, 16, 17, 20, 21, 22, 22, 23, 28, 29, 30, 32, 32, 33, 38]
[1, 1, 3, 3, 13, 17, 21, 24, 24, 25, 26, 26, 30, 31, 32, 35, 38, 39, 39, 39]
[1, 2, 4, 4, 5, 5, 10, 13, 14, 14, 14, 14, 15, 17, 28, 29, 29, 35, 37, 40]
[1, 2, 6, 8, 12, 13, 14, 15, 15, 15, 16, 22, 23, 24, 26, 30, 31, 36, 36, 40]
[3, 6, 7, 8, 8, 10, 10, 12, 13, 17, 17, 20, 21, 22, 33, 35, 35, 36, 39, 40]
[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,结果将如下所示:

Note: The position does not need to match - so number can appear anywhere in the next row
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 AColumn B分开分析。也可以与2L等分开执行1L分析。但是,与数据位于不同计算机上的Hadoop不同,在我们的方案中,每个服务器都需要访问所有数据才能执行其"共享"分析。

我研究了这个问题的可能解决方案,似乎很少有选择:Ray或使用Apache Twill在YARN之上构建自定义应用程序。Apache Twill于2020年移至阁楼,这意味着Ray是唯一可用的选择。

Ray是解决这个问题的最佳方法,还是有其他更好的选择?理想情况下,解决方案应自动处理故障转移并智能地分配处理负载。例如,在上面的例子中,如果我们想将负载分配给 20 台机器,一种方法是将 999,999 N 稍后除以 20,让机器 A 分析 1L-49999L,机器 B 分析 50000L - 100000L 等等。但是,当您考虑它时,负载的分布并不均匀 - 因为分析 1L 与 500000L 需要更长的时间,因为后者只包含大约一半的行数(对于 500000L,我们正在分析的第一行是第 500001 行,所以我们基本上从分析中省略了前 500K 行)。

它也不应该像MapReduce那样需要对核心代码进行大量修改。

我正在与Java合作.

谢谢

你是对的 - 你的场景和技术堆栈并不那么合适。这就提出了一个问题- 为什么不(添加)与您当前的技术堆栈更相关的东西?例如 - Redis DB。

似乎您的常见操作主要是计数值,并且您希望防止过度计算并使其性能更高(例如 - 正确索引您的数据)。鉴于这是 Redis 的主要功能之一 - 将其用作处理器听起来合乎逻辑

我的建议:

创建一个使用数值作为键并将其计数用作值的hashmap。这样 - 您将能够对这些指标进行不同的计算,并始终迭代一次数据集。之后 - 您只需按不同的条件(按计算或指标)从 Redis 中提取数据。

从这一点开始,可以轻松地将计算数据保存回数据库,并使其准备好直接查询。整个过程可能类似于以下内容:

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

按照文档填充和检索数据

最新更新