大数据:MapReduce

可用

3.1 大数据一词的出现历史

大数据这个词出现的时间相对较晚。谷歌趋势显示自 2011 年以来该短语的使用开始积极增长:

同时,现在只有懒人不使用这个词了。尤其是,营销人员经常不恰当地使用该术语。那么大数据究竟是什么?由于我决定系统地陈述和突出这个问题,因此有必要定义这个概念。

在我的实践中,我遇到了不同的定义:

  • 大数据是指超过 100GB 的数据(500GB、1TB,任何你喜欢的)。
  • 大数据是无法在 Excel 中处理的数据。
  • 大数据是无法在单台计算机上处​​理的数据。

甚至这些:

  • 大数据通常是任何数据。
  • 大数据并不存在,它是营销人员发明的。

我会坚持维基百科的定义:

大数据是一系列处理海量和显着多样性的结构化和非结构化数据的途径、工具和方法,以便在持续增长、分布在计算机网络的众多节点、形成的条件下获得人类可感知的有效结果。在 2000 年代后期,替代传统数据库管理系统和商业智能类的解决方案。

因此,通过大数据,我将理解的不是一些特定数量的数据,甚至不是数据本身,而是处理它们的方法,这些方法允许对信息进行分布式处理。这些方法既可以应用于大数据集(比如互联网上所有页面的内容),也可以应用于小数据集(比如本讲的内容)。

以下是可能需要大数据技术的数据源的一些示例:

  • 上网用户行为日志
  • 运输公司汽车的 GPS 信号
  • 从大型强子对撞机中的传感器获取的数据
  • 俄罗斯国家图书馆的数字化图书
  • 所有银行客户的交易信息
  • 有关大型零售连锁店中所有采购的信息等。

数据源的数量正在快速增长,这意味着对数据处理技术的需求越来越大。

3.2 大数据原理

根据大数据的定义,我们可以制定处理此类数据的基本原则:

1.横向可扩展性。由于可以有任意大的数据量,任何涉及处理大数据的系统都必须是可扩展的。数据量增加了 2 倍——集群中的 iron 数量增加了 2 倍,一切都在继续工作。

2. 容错。水平可扩展性原则意味着集群中可以有很多机器。例如,Yahoo 的 Hadoop 集群拥有超过 42,000 台机器(您可以在此链接中查看跨组织的集群规模)。这意味着其中一些机器肯定会发生故障。大数据实践需要意识到这些中断并在没有任何重大后果的情况下幸免于难。

3. 数据局部性。在大型分布式系统中,数据分布在大量机器上。如果数据物理上位于一台服务器上并在另一台服务器上进行处理,则数据传输的成本可能会超过处理本身的成本。因此,设计大数据解决方案的最重要原则之一就是数据局部性原则——如果可能,我们在存储数据的同一台机器上处理数据。

所有现代大数据工具都以某种方式遵循这三个原则。为了遵循它们,有必要提出一些开发数据开发工具的方法、方法和范例。我将在今天的讲座中分析最经典的方法之一。

3.3 MapReduce

MapReduce是Google提出的一种分布式数据处理模型,用于在计算机集群上处理大量数据。下图很好地说明了 MapReduce:

MapReduce 假设数据被组织成一些记录。数据处理分 3 个阶段进行:

1.地图阶段。在此阶段,使用用户定义的 map() 函数对数据进行预处理。该阶段的工作是对数据进行预处理和过滤。该操作与函数式编程语言中的映射操作非常相似——自定义函数应用于每个输入记录。

应用于单个输入记录的 map() 函数会生成许多键值对。Set——即它可以只返回一条记录,也可以什么都不返回,也可以返回几个键值对。key 和 value 是什么由用户决定,但是 key 是很重要的东西,因为以后只有一个 key 的数据会落到 reduce 函数的一个实例中。

2.舞台洗牌。它不会被用户注意到。在这个阶段,map 函数的输出是“binned”——每个 bin 对应于 map 阶段的一个输出键。将来,这些篮子将作为 reduce 的输入。

3.阶段减少。在洗牌阶段生成的每个具有值的“篮子”都会进入 reduce() 函数的输入。

reduce 函数由用户给出并计算单个“篮子”的最终结果。reduce()函数返回的所有值的集合就是MapReduce任务的最终结果。

关于 MapReduce 的一些额外事实:

  1. map函数的所有运行都独立工作并且可以并行运行,包括在不同的集群机器上运行。
  2. reduce函数的所有运行都独立工作并且可以并行运行,包括在不同的集群机器上。
  3. Shuffle在内部代表了一种并行排序,所以它也可以工作在不同的集群机器上。第 1-3 点允许您实施水平可扩展性原则
  4. map函数通常用在存储数据的同一台机器上——这减少了数据在网络上的传输(数据局部性原理)。
  5. MapReduce 始终是全数据扫描,没有索引。这意味着当需要非常快的响应时,MapReduce 的适用性很差。

3.4 使用 MapReduce 有效解决的任务示例

字数

让我们从经典任务开始——字数统计。任务制定如下:有大量文档。任务是计算每个在语料库中至少出现一次的单词在语料库中出现的总次数。

解决方案:

由于我们有大量文档,因此让一个文档成为 MapRreduce 任务的一个输入记录。在 MapReduce 中,我们只能定义用户定义的函数,我们将这样做(我们将使用类似 python 的伪代码):

def map(doc): 
for word in doc: 
yield word, 1 
def reduce(word, values): 
yield word, sum(values) 

map函数将输入文档转换为一组对 (word, 1),对我们透明地混洗将其转换为对 (word, [1,1,1,1,1,1]), reduce对这些对求和,返回这个词的最终答案。

处理广告系统日志

第二个例子取自Data-Centric Alliance的真实实践。

任务:广告系统的 csv 日志格式如下:

<user_id>,<country>,<city>,<campaign_id>,<creative_id>,<payment></p> 
 
11111,RU,Moscow,2,4,0.3 
22222,RU,Voronezh,2,3,0.2 
13413,UA,Kyiv,4,11,0.7 
… 

有必要计算在俄罗斯城市展示广告的平均成本。

解决方案:

def map(record): 
user_id, country, city, campaign_id, creative_id, payment = record.split(",") 
payment=float(payment) 
if country == "RU": 
yield city, payment 
def reduce(city, payments): 
yield city, sum(payments)/len(payments) 

map函数检查我们是否需要这个条目——如果需要,它只留下必要的信息(城市和支付金额)。reduce函数计算一个城市的最终答案,给出该城市所有付款的列表。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论