Python 的 map 和 reduce 和 Hadoop 的 MapReduce 有什麼關係?


hadoop map階段所做的事 類比於 python map

hadoop reduce階段所做的事 類比於 python groupby

但只是類比,hadoop map階段和reduce階段有更具體細節的不同步驟,兩者牛頭無法對上馬嘴。


http://blog.damotou.info/2015/06/29/%E5%9B%BE%E8%A7%A3spark%E7%9A%84RDD%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%9E%8B/

看我這篇博客吧


關係就是都是基於Map-Reduce的處理思想設計出來的。

從用戶角度看功能其實差不多,

Python的Map函數和Hadoop的Map階段對輸入進行逐行處理;

Python的Reduce函數和Hadoop的Reduce階段對輸入進行累積處理。

但是其實完整的Hadoop MapReduce是Map+Shuffle+Sort+Reduce過程。

其中Shuffle過程是為了讓分散式機群之間將同Key數據進行互相交換,Sort過程是根據Key對所有數據進行排序,從而才能完成類WordCount功能,而這兩步在Python裡面當然是需要用戶自己去編寫的。


著作權歸作者所有。

商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

作者:JThink_

鏈接:Python+Hadoop Streaming實現MapReduce(如何給map和reduce的腳本傳遞參數)

來源:CSDN博客

1. 上一篇我們提到用python 和 hadoop streaming的方式寫mapreduce,那麼我們怎麼向map和reduce的腳本傳遞參數呢,本來著重講這個

2. 我們知道用java寫mapreduce的時候可以傳參數給map或者reduce,具體的就是用Configuration去set值,然後在map或者reduce端用get進行獲取,這個就不多說了,不是本文重點

3. 不多說,直接貼出來,

#!/bin/bash

hadoop fs -rmr trans_record/result

hadoop jar ./hadoop-streaming-2.0.0-mr1-cdh4.7.0.jar

-input $1

-output trans_record/result

-file map.py

-file reduce.py

-mapper "python map.py"

-reducer "python reduce.py"

-jobconf mapred.reduce.tasks=1

-jobconf mapred.job.name="qianjc_trans_record"

-cmdenv "card_start=$2"

-cmdenv "card_last=$3"

-cmdenv "trans_at=$4"

我們可以看到比上一篇介紹的多了-cmdenv 其實這個就是傳參數的配置項,那麼我們在map或者reduce中怎麼取呢,如下:

#!/usr/bin/env python

# vim: set fileencoding=utf-8

import sys

import os

def main():

card_start = os.environ.get("card_start")

card_last = os.environ.get("card_last")

trans_at = float(os.environ.get("trans_at"))

for line in sys.stdin:

detail = line.strip().split(",")

card = detail[0]

money = float(detail[17])

if trans_at == money and card_start == card[1 : 7] and card_last == card[-4 : ]:

print "%s %s" % (line.strip(), detail[1])

if __name__ == "__main__":

main()

os模塊可以取,給一個key就相應得能取到key對應的value

4. 這還是很簡單的,但是這個卻應該熟練掌握,畢竟比較重要


您好 我一名學生,現在的研究方向也是關於數據挖掘的,今天有幸看到您的文章里有關於 用python來實現mapreduce 程序,想請教一下您僅用python來寫實現mapreduce程序夠嗎 因為我學得是python ,但是了解到大部分的hadoop程序及框架都是用java來寫的,所以在這裡想問一下您是不是還需要繼續學習java來開發mapreduce 程序?希望得到您的指導


推薦閱讀:

目前工作是單片機開發和C#上位機,未來該朝哪個方向發展,如何轉型嵌入式上層應用開發?
學習程序語言也會像學外語一樣會受到母語(第一語言)的影響嗎?
為什麼代碼注釋中有@符號?
JDK 1.8.0_92 Arrays.sort()方法不可用?
程序編碼都是外文的,什麼時候出中文啊,我有生之年能否看到!!!?

TAG:Python | 編程 | Hadoop | 函數式編程 | MapReduce |