我正在学习Hadoop + MapReduce and Big Data
,从我的理解来看,Hadoop
生态系统的主要设计目的是分析分布在许多服务器上的大量数据。
我有一个相对少量的数据(一个由1- 1000万行数字组成的文件),需要用数百万种不同的方法进行分析。例如,考虑以下数据集:
[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 B
和Column A
。也可以分别执行1L
和2L
分析,依此类推。但是,与数据位于不同机器上的Hadoop
不同,在我们的场景中,每台服务器都需要访问所有数据以执行其“共享”的分析。
我研究了这个问题的可能解决方案,似乎有非常少的选择:Ray或使用Apache Twill在YARN
上构建自定义应用程序。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
。
谢谢
1条答案
按热度按时间vkc1a9a21#
你是对的--你的场景和你的技术堆栈并不是那么合适。这就提出了一个问题--为什么不(添加)一些与你当前的技术堆栈更相关的东西呢?例如-- Redis DB。
看起来你的常用操作主要是计算值,你想防止过度计算,并使它更有性能(例如-正确索引你的数据)。考虑到这是Redis的主要功能之一-听起来把它用作处理器是合乎逻辑的
我的建议:
创建一个
hashmap
,使用数值作为键,使用计数作为值。这样,你就可以在这些指标上进行不同的计算,并且每次迭代一次数据集。之后,你只需要按照不同的标准(根据计算或指标)从Redis中提取数据。从这里开始,您可以轻松地将计算数据储存回数据库,并准备直接查询。整个程序可能类似于:
hashmap
)遵循populating and retrieving数据的文档