我正在了解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 A
与Column 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 数据库
- 查询您的数据库(随心所欲)
按照文档填充和检索数据