簡體   English   中英

python map reduce和cloud-computing map / reduce之間的關系?

[英]Relationship between python map reduce and cloud-computing map/reduce?

我是Python新手,

有人知道Python(和函數式語言)函數map() / reduce()和與分布式計算相關的MapReduce概念之間的關系是什么?

map / reduce的雲概念非常相似,但改為並行工作。 首先,每個數據對象被通過一個函數,通過map的IT到一個新的對象(通常,某種字典)。 然后,在map返回的對象上調用reduce函數,直到只剩下一個。 這是map / reduce操作的結果。

一個重要的考慮因素是,由於並行化, reduce函數必須能夠從map函數以及來自先前reduce函數的對象中獲取對象。 當您考慮並行化的方式時,這會更有意義。 許多機器都會將數據減少到單個對象,然后這些對象將減少到最終輸出。 當然,如果有大量數據,這可能發生在多個層中。

這是一個簡單的示例,說明如何使用map / reduce框架計算列表中的單詞:

list = ['a', 'foo', 'bar', 'foobar', 'foo', 'a', 'bar', 'bar', 'bar', 'bar', 'foo']
list2 = ['b', 'foo', 'foo', 'b', 'a', 'bar']

map函數如下所示:

def wordToDict(word):
  return {word: 1}

reduce函數看起來像這樣:

def countReduce(d1, d2):
  out = d1.copy()
  for key in d2: 
    if key in out:
      out[key] += d2[key]
    else:
      out[key] = d2[key]
  return out 

然后你可以像這樣映射/減少:

reduce(countReduce, map(wordToDict, list + list2))

>>> {'a': 3, 'foobar': 1, 'b': 2, 'bar': 6, 'foo': 5}

但你也可以這樣做(這是並行化會做的):

reduce(countReduce, [reduce(countReduce, map(wordToDict, list)), reduce(countReduce, map(wordToDict, list2))])

>>> {'a': 3, 'foobar': 1, 'b': 2, 'foo': 5, 'bar': 6}

實際上這些概念有些不同,而且常見的名稱具有誤導性。

在函數式編程中(Python借用了這些函數):

  • map將一些函數應用於列表的所有元素並返回一個新列表
  • reduce應用某些函數來聚合某些列表中的所有值以獲得單個值。

在分布式計算中MapReduce:

  • 我們總是使用鍵值對(好吧,只是對)
  • mapper獲取對的列表並生成另一個對的列表(輸入的“鍵”在此上下文中丟失其語義)
  • reducer獲取一個鍵和與此鍵對應的值列表(來自mapper輸出)並生成一些鍵和值列表(“key”具有鍵語義的單個位置是reducer輸入/映射器輸出:值在傳遞之前按鍵分組減速機)
  • 你可能還有分區器和組合器:)

請注意,映射器始終不會為每個輸入對生成一個輸出對,也不會將reducer(鍵,值列表)減少到恰好一個輸出對。 Mapper和reducer可以輸出他們想要的任何東西。 例如,映射器可用於過濾對 - 在這種情況下,它為某些輸入對生成輸出對而忽略其他對。 對於每個映射器/減速器輸入對(或其中一些),產生多於一對的情況並不罕見。

但是在大多數情況下,MapReduce可以以與reduce(reduce_function, map(map_function, list))類似或幾乎相似的方式工作 - 映射器通常對每個輸入進行一些計算,而reducer通常以某種方式聚合值列表。 對於任何map_functionreduce_function ,可以在MapReduce中表達,但反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM