1. 程式人生 > >用Hadoop Streaming來寫wordcount

用Hadoop Streaming來寫wordcount

Hadoop streaming裡的key和value格式不一樣,實際上雖然也是以K1,V1輸入輸出的,但是是以line的格式輸出的。因此中間經過partition過後的K2,V2S的那個iterable的函式格式貌似是沒有的!

比如,我想寫一個wordcount

在Python中,標準輸入輸出格式是:

import  sys
for line in sys.stdin:

每一行是一個輸入,然後進入之後的K1,V1你自己切分,自己搞成想要的K2,V2之後,print出來!!
print的格式是print K2+”\t”+V2
這樣print出來的格式實際上是print了一行【一個line】,系統會自動預設識別第一個\t 把前面作為key自動給partition了
然後reducer的時候,你同樣要
for line in sys.stdin:
然後把partition過後的每一個line收進來。自己處理。

附上一段轉自別人部落格的話:
Hadoop Streaming程式設計
一、概述
Hadoop Streaming是Hadoop提供的一個程式設計工具,它允許使用者使用任何可執行檔案或者指令碼作為Mapper和Reducer,例如:
採用shell指令碼語言中的一些命令作為mapper和reducer(cat作為mapper,wc作為reduce)

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar\
-input myInputDir\
-output myOutputDir\
-mapper cat\
-reducer wc

本文安排如下,第二節介紹Hadoop Streaming的原理,第三節介紹Hadoop Streaming的使用方法,第四節介紹Hadoop Streaming的程式編寫方法,在這一節中,使用C++、C、Shell指令碼和python實現了WordCount作業,第五節總結了常見的問題。

二、Hadoop Streaming原理
mapper和reducer會從標準輸入中讀取使用者資料,一行一行處理後傳送給標準輸出。Streaming工具會建立MapReduce作業,傳送給各個tasktracker,同時監控整個作業的執行過程。
如果一個檔案(可執行或者指令碼)作為mapper,mapper初始化時,每一個mapper任務會把該檔案作為一個單獨程序啟動,mapper任務執行時,它把輸入切分成行,並把每一行提供給可執行檔案程序的標準輸入。同時,mapper收集可執行檔案程序標準輸出的內容,並把收到的每一行內容轉化為key/value對,作為mapper的輸出。預設情況下,一行中第一個tab之前的部分作為key,之後的(不包括tab)作為value。如果沒有tab,整行作為key值,value值為null。
對於reducer,類似。
以上是Map/Reduce框架和Streaming Mapper/Reduce之間的基本通訊協議。

三、Hadoop Streaming用法

四、Mapper和Reducer實現
本節試圖用盡可能多的語言編寫Mapper和Reducer,包括java、C、C++、shell指令碼、python等。
由於hadoop會自動解析資料檔案到Mapper或者Reducer的標準輸入中,以供它們讀取使用,所以應先了解各個語言獲取標準輸入的方法。

現在寫一個wordcount:目的是要統計adult=1的檔案裡,各自文字出現的頻率。
輸入line格式如下所示:
u’20111725 13,模特表演,專業課 獨家,青春,模特,時尚,舞臺 1’
最前面是ID,後面接一個tab鍵,然後是標籤,然後再接一個tab鍵;然後是標題名稱的切分,最後是輸出判定:為1。

因為要做文字分類詞向量模型,所以掐頭去尾,只留中間標籤。

mapper:

#!/usr/bin/python
#-*-coding:utf-8-*-
#!Author:[email protected]
# Modified: 20160615
import sys
# a=[u'20111725        13,模特表演,專業課      獨家,青春,模特,時尚,舞臺        1']
for line in sys.stdin:
    line=line.strip().split()
    # for w in sp:
    #     print w
    # key=sp[0]
    value=line[1:-1]
    value_str=",".join(value)
    value_list=value_str.split(",")
    for key1 in value_list:
        print key1+"\t"+str(1)

打印出的類似於
這裡寫圖片描述

接下來用 key + \t + 1的每一個line當做輸出,print之後,經過partition之後,把key相同的自動被放到同一個reducer上

reducer程式碼:

test_list=[u'男人 1',u'男人 1',u'潑水節    1',u'潑水節    1',u'潑水節    1',u'潑水節    1',u'潑水節    1',u'猥褻 1']
# import os
# import sys
# sys.path.append("./")
# sys.path.append("/data/programs/common/python/")
# reload(sys)
word2count_dict={}
for line in test_list:
    line=line.strip()
    word,count=line.split()
    try:
        count=int(count)
        word2count_dict[word]=word2count_dict.get(word,0)+count
    except ValueError:
        pass
sorted_word2count_list=sorted(word2count_dict.iteritems(),key=lambda d:d[1],reverse=True)
for word_count_tuple in sorted_word2count_list:
    print word_count_tuple[0]+"\t"+str(word_count_tuple[1])

這裡有兩個注意點:1.關於字典word2count_dict的值提取過程。經常情況下,當沒有該key的時候,用這種方式總會報錯。現在,用.get函式,並設定一個default值,問題得到了解決
get函式的定義如下:
這裡寫圖片描述
第二,得到之後要對dict里根據值來進行排序。

字典排序

方式有兩種,第一種是用operation類,第二種是不用import,直接做,但是這種方式是根據tuple來進行排序的
sorted(word2count_dict.iteritems(),key=lambda d:d[1],reverse=True)
.iteritems()得到一個(key,value)的tuple,key=d[0]說明是key,d[1]說明是value。預設從小到大,因此用reverse

寫完了mapper和reducer,接下來開始寫主要的那個.sh檔案。

.sh 顧名思義是shell檔案。
最後reducer裡得到的是這樣的檔案值:
這裡寫圖片描述

之後,寫完mapper和reducer,需要寫sh檔案。

在sh檔案中,需要設定basedir,input_dir, output_dir

相關推薦

Hadoop Streamingwordcount

Hadoop streaming裡的key和value格式不一樣,實際上雖然也是以K1,V1輸入輸出的,但是是以line的格式輸出的。因此中間經過partition過後的K2,V2S的那個iterable的函式格式貌似是沒有的! 比如,我想寫一個wordc

hadoop streaming 執行mapreduce的指令碼

2013-02-01 周海漢/文 2013.2.1 http://abloz.com tom white的《hadoop the_definitive_guide 3nd edition》附錄C裡面講到用streaming

hadoop自帶的wordcount測試

1、建立檔案example.txt,並將其拷貝到hdfs的/user/root中 ./hadoop fs -put /root/example.txt /user/root 2、執行hadoop-mapreduce-examples-2.8.0.jar

[Android Groovy]第一講.開始Groovy語言安卓程式吧!!!

首先,groovy語言已經可以用來寫android程式了. 接下來(你只需要看30秒,然後再決定是否看下去),讓我們先看看groovy語言可以寫得多簡單: 以下java程式碼: JavaTest.java package com.fanhl.test.t2015.t0

物件展開物件操作的純函式

純函式的一個原則是“不會產生副作用”。 一、陣列操作  定義 1 const state = { 2 cart: [ 3 { 4 product: 'bread 700g', 5 quantity: 2, 6

Android平板程式碼

之前入了一個洋垃圾 華碩P00I,我對這款平板的第一印象是:螢幕好,電池耐用。如果忽略後壓屏的缺點,還是很有價效比的。 除了平時看

自己的一部分鬥地主的程序,沒有去界面,臨時是黑框顯示的

cas getc vector dea 發牌 常見 dma red5 向量 這幾天比較空,所以想寫一點東西。 鬥地主的程序一直以來都想寫,但感覺規則推斷比較復雜,一直沒有較多的時間來寫。 這次主要是把跟牌和牌型的推斷寫出來了。寫了一個比較弱智的AI,屬於有牌就出

樹鏈剖分LCA

ostream 第一次 pri def -- != dfs roo truct 當兩個點在一條鏈上,它們的LCA就是深度較小的那個點。 於是這種樹鏈剖分寫LCA的思想就是把要求的兩個點想辦法靠到一條鏈上。 而且要靠到盡量更優的一條鏈上(重鏈)。 做法: 預處理出每

javawordcount

同時 fileread iteye ron 詳細設計 sch porting 功能 如何 碼雲地址:https://gitee.com/Huan62201/events; 個人PSP表格: PSP2.1 PSP階段 預估耗時 (分鐘) 實際耗時

position導航的下拉選單

今天來用position來寫下拉選單,話不多說,直接上程式碼, <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewpo

抱歉!不要Java的語法思維Kotlin

本文為轉載文章,有問題可檢視轉載說明 出處: www.woquanke.com 原文:http://www.woquanke.com/posts/39073/ 寫了多年的Java,直到看到Kotlin,原來程式碼可以如此優雅! 如果你是像我一樣是一名優秀的Java開發者^_^,而且已經想用k

es6方式的的訂閱釋出的模式--聽說越努力,煩心事越少,賺錢越多,越開心,你變強大了,很多人會愛你。

//釋出訂閱模式 class EventEmiter { constructor() { //維護一個物件 this. _events = { } } on( eventName,

hive:hqlwordcount

用hql來做wordcount 有以下文字檔案: hello tom hello jim hello rose hello tom tom love rose rose

Python一個男女相親小程式|碼農的情人節

碼農這個群體,高學歷,高工資,高智商,但是不善於交流,圈子也很小,相信很多小夥伴或者周圍的小夥伴,都有相親的經歷,或者被父母逼去相親的經歷,一般都是問年齡,你要找什麼樣的,有的還特講究生肖匹配,記得網上有一個段子,說男的20-60歲都只喜歡一種型別的女孩,而20歲到60歲的女孩相親需求卻不斷

ubuntu 下anaconda 安裝tensorflow,並配置vscode程式碼

安裝anaconda (1)bantu下連上網,我們在Anaconda的官網(https://repo.continuum.io/archive/)上下載Anaconda3 4.2.0版本,請讀者根據自己的作業系統下載對應的版本(如是64位還是32位)。 (

HTML常用的特殊符號總結 2014年9月12日 22704次瀏覽 html中經常會到一些特殊符號,例如箭頭,雪花,心形等等,這些符號就不用css樣式或者圖片了,直接用html特殊符號可以實現。

html中經常會用到一些特殊符號,例如箭頭,雪花,心形等等,這些符號就不用css樣式或者圖片來寫了,直接用html特殊符號可以實現。 例如,如下html程式碼: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://w

對象展開對象操作的純函數

undefine efi rem state define rdquo json ret string 純函數的一個原則是“不會產生副作用”。 一、數組操作 定義 1 const state = { 2 cart: [

開啟腦洞, 中文程式會怎樣, 中文程式設計初體驗

程式猿們都知道目前的各種程式語言指令都是英文單詞,有一天我突然想到一個問題:中文能用來編寫程式麼,這將會是一種怎樣的體驗呢?在這裡相信有許多想要學習前端的同學,關注小編文章最後面文字,可免費領取一整套系統的web前端學習教程!看了一下還真有,以下內容來自百度百科上世紀七十年代

繼承一個小故事

package com.zr.java.textam; public class TextAm {public static void main(String[] args) {// TODO Auto-generated method stubxigua axigua = new xigua();axigu

震驚!!!python可以中文程式碼

python可以用中文來寫程式碼 說明: 偶爾間試了一下,python可以用中文來寫程式碼,除了一些python內建函式,和運算子不能用中文外,其它的比如新定義的類名、函式名、變數名,甚至是函式間傳的引數都可以用中文來代替。這是國人全民程式設計要來臨了嗎。下面是我用全中文編寫了的一個小程式