在处理大数据时,Hadoop和MapReduce框架提供了强大的数据处理能力。尽管MapReduce编程模型相对严格,仅通过Mapper和Reducer来组织和汇总数据,但通过一些技巧,可以使其处理各种数据操作任务。本文将探讨如何“欺骗”Hadoop,使其能够以MapReduce函数的形式处理不同类型的数据操作功能。需要注意的是,本文只讨论与HDFS一起使用的MapReduce,不涉及PIG、HIVE等包。虽然这些包可以简化SQL查询的构建,但目前它们并未广泛使用,大多数行业仍在使用基本的Hadoop工具(MapReduce与HDFS)。
为了更好地理解MapReduce的功能,通过一个类比来分析这种情况。想象一个魔术师准备了一个新魔术,并向观众展示。观众只看到魔术师想让他们看到的东西。将这个情景与MapReduce联系起来,可以这样角色扮演:
现在,将上述句子中的词汇替换为Hadoop的术语。“用户准备新的数据操作功能。现在,他(用户)在Hadoop上执行数据操作功能。Hadoop只看用户想向Hadoop(MapReduce类型函数)展示的东西。”
让通过几个例子来演示这个概念。
Map: 对于每个不同的词,生成一个键值对(词,1)
Shuffle: 对于Mapper任务产生的任何键(词)w,将有一个或多个键值对(w,1)。然后,对于键w,Shuffle将产生(w,[1, 1,…, 1])并将其作为输入呈现给Reducer。
Reduce: 与键(词)w关联的Reducer将(w,[1, 1, …, 1])转换为(w,n),其中n是值的总和。注意,Reduce阶段为每个键w产生确切的一个输出对。
基本上想实现distinct操作符:期望的输出应包含所有输入值,但在输入中多次出现的值,在输出中应该只出现一次。解决方案比词频统计问题更简单:使用值本身作为Map输出的键;与特定键关联的Reducer随后可以返回单个输出。
Map: 对于每个输入值id和marks,输出键值对(键=id,值=(id,marks))
Shuffle: 对于Mapper任务产生的任何键id,将有一个或多个键值对。然后,对于键id,Shuffle将产生(id,[(id,marks) , (id,marks)…])并将其作为输入呈现给Reducer。
Reduce: 与键id关联的Reducer将(id,[(id,marks) , (id,marks)…])转换为单个(id,(id,marks)),因此它为这个键id产生确切的一个输出(id,marks)。
这里只想转置一个矩阵。矩阵转置简单地意味着每个元素(行,列)来到(列,行)的位置。让用行、列索引来表示这些值。例如1将是(1,1),2将是(1,2)等。
Map: 对于每个输入(x,y),生成键作为(y,x)和值为矩阵中的实际值。例如4将被视为(键=(1,2),值=4)
Shuffle: 由于每个键只有一个值,Shuffle阶段没有显著作用。然而,它将根据键对所有值进行排序。
Reduce: Reducer将直接返回值,接受所有键作为(行,列)的矩阵。
合并表格是分析行业中最常用的数据操作之一。有两个表格:表1和表2。它们都有一个共同的变量(id变量)称为Name。需要合并这两个表格,并为每个名称找到相应的分数。
Map: 对于表1的每个输入,生成键为‘id’和值为(“tab1”,id,marks)&对于表2的每个输入,生成键为‘id’和值为(“tab2”,id,marks)。例如(2,34)将被视为(键=2,值=(“tab1”,2,34))
Shuffle: Shuffle阶段将所有相同的id聚集在一起。可以通过值的第一个参数识别每行的所有权。
Reduce: Reducer必须设计成这样,对于每个id,如果第一个参数为“tab1”,则找到所有第一个参数为“tab2”的匹配项,并将它们合并为单行。
本文列出的例子并不全面。需要改变在Hadoop上看待数据操作任务的方式。需要开始以(键,值)对的方式思考。在本文中看到,Hadoop确实限制了用户的编码方式,但即使是这种受限的编码风格也可以被利用来执行多种数据操作过程。