hadooppythonsql_python - hadoop,mapreduce demo

Hadoop,mapreduce?介紹

59888745@qq.com

大數據工程師是在Linux系統下搭建Hadoop生態系統(cloudera是最大的輸出者類似于Linux的紅帽),

把用戶的交易或行為信息通過HDFS(分布式文件系統)等存儲用戶數據文件,然后通過Hbase(類似于NoSQL)等存儲數據,再通過Mapreduce(并行計算框架)等計算數據,然后通過hiv或pig(數據分析平臺)等分析數據,最后按照用戶需要重現出數據.

Hadoop是一個由Apache基金會所開發的開源分布式系統基礎架構

Hadoop,最基礎的也就是HDFS和Mapreduce了,

HDFS是一個分布式存儲文件系統

Mapreduce是一個分布式計算的框架,兩者結合起來,就可以很容易做一些分布式處理任務了

大綱:

一、MapReduce 基本原理

二、MapReduce 入門示例 - WordCount 單詞統計

三、MapReduce 執行過程分析

實例1 - 自定義對象序列化

實例2 - 自定義分區

實例3 - 計算出每組訂單中金額最大的記錄

實例4 - 合并多個小文件

實例5 - 分組輸出到多個文件

四、MapReduce 核心流程梳理

實例6 - join 操作

實例7 - 計算出用戶間的共同好友

五、下載方式

一、MapReduce基本原理

MapReduce是一種編程模型,用于大規模數據集的分布式運算。

1、MapReduce通俗解釋

圖書館要清點圖書數量,有10個書架,管理員為了加快統計速度,找來了10個同學,每個同學負責統計一個書架的圖書數量。

張同學統計 書架1

王同學統計 書架2

劉同學統計 書架3

……

過了一會兒,10個同學陸續到管理員這匯報自己的統計數字,管理員把各個數字加起來,就得到了圖書總數。

這個過程就可以理解為MapReduce的工作過程。

2、MapReduce中有兩個核心操作

(1)map

管理員分配哪個同學統計哪個書架,每個同學都進行相同的“統計”操作,這個過程就是map。

(2)reduce

每個同學的結果進行匯總,這個過程是reduce。

3、MapReduce工作過程拆解

下面通過一個景點案例(單詞統計)看MapReduce是如何工作的。

有一個文本文件,被分成了4份,分別放到了4臺服務器中存儲

Text1:the weather is good

Text2:today is good

Text3:good weather is good

Text4:today has good weather

現在要統計出每個單詞的出現次數。

處理過程

(1)拆分單詞

map節點1

輸入:“the weather is good”

輸出:(the,1),(weather,1),(is,1),(good,1)

map節點2

輸入:“today is good”

輸出:(today,1),(is,1),(good,1)

map節點3

輸入:“good weather is good”

輸出:(good,1),(weather,1),(is,1),(good,1)

map節點4

輸入:“today has good weather”

輸出:(today,1),(has,1),(good,1),(weather,1)

(2)排序

map節點1

map節點2

map節點3

map節點4

(3)合并

map節點1

map節點2

map節點3

map節點4

(4)匯總統計

每個map節點都完成以后,就要進入reduce階段了。

例如使用了3個reduce節點,需要對上面4個map節點的結果進行重新組合,比如按照26個字母分成3段,分配給3個reduce節點。

Reduce節點進行統計,計算出最終結果。

這就是最基本的MapReduce處理流程。

4、MapReduce編程思路

了解了MapReduce的工作過程,我們思考一下用代碼實現時需要做哪些工作?

在4個服務器中啟動4個map任務

每個map任務讀取目標文件,每讀一行就拆分一下單詞,并記下來次單詞出現了一次

目標文件的每一行都處理完成后,需要把單詞進行排序

在3個服務器上啟動reduce任務

每個reduce獲取一部分map的處理結果

reduce任務進行匯總統計,輸出最終的結果數據

但不用擔心,MapReduce是一個非常優秀的編程模型,已經把絕大多數的工作做完了,我們只需要關心2個部分:

map處理邏輯——對傳進來的一行數據如何處理?輸出什么信息?

reduce處理邏輯——對傳進來的map處理結果如何處理?輸出什么信息?

編寫好這兩個核心業務邏輯之后,只需要幾行簡單的代碼把map和reduce裝配成一個job,然后提交給Hadoop集群就可以了。

至于其它的復雜細節,例如如何啟動map任務和reduce任務、如何讀取文件、如對map結果排序、如何把map結果數據分配給reduce、reduce如何把最終結果保存到文件等等,MapReduce框架都幫我們做好了,而且還支持很多自定義擴展配置,例如如何讀文件、如何組織map或者reduce的輸出結果等等,后面的示例中會有介紹。

二、MapReduce入門示例:WordCount單詞統計

WordCount是非常好的入門示例,相當于helloword,下面就開發一個WordCount的MapReduce程序,體驗實際開發方式。

example:

#刪除已有文件夾

hadoop fs -rmr /chenshaojun/input/example_1

hadoop fs -rmr /chenshaojun/output/example_1

#創建輸入文件夾

hadoop fs -mkdir /chenshaojun/input/example_1

#放入輸入文件

hadoop fs -put text* /chenshaojun/input/example_1

#查看文件是否放好

hadoop fs -ls /chenshaojun/input/example_1

#本地測試一下map和reduce

head -20 text1.txt | python count_mapper.py | sort | python count_reducer.py

#集群上跑任務

hadoop jar /usr/lib/hadoop-current/share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar \

-file count_mapper.py \ ? #提交文件到集群

-mapper count_mapper.py \

-file count_reducer.py \

-reducer count_reducer.py \

-input /chenshaojun/input/example_1 \

-output /chenshaojun/output/example_1 ? # 必須不存在,若存在output會抱錯,不會覆蓋

count_mapper.py

import sys

# input comes from STDIN (standard input)

for line in sys.stdin:

# remove leading and trailing whitespace

line = line.strip()

# split the line into words

words = line.split()

# increase counters

for word in words:

# write the results to STDOUT (standard output);

# what we output here will be the input for the

# Reduce step, i.e. the input for reducer.py

#

# tab-delimited; the trivial word count is 1

print '%s\t%s' % (word.lower(), 1)

count_reducer.py

from operator import itemgetter

import sys

current_word = None

current_count = 0

word = None

# input comes from STDIN

for line in sys.stdin:

# remove leading and trailing whitespace

line = line.strip()

# parse the input we got from mapper.py

word, count = line.split('\t', 1)

# convert count (currently a string) to int

try:

count = int(count)

except ValueError:

# count was not a number, so silently

# ignore/discard this line

continue

# this IF-switch only works because Hadoop sorts map output

# by key (here: word) before it is passed to the reducer

if current_word == word:

current_count += count

else:

if current_word:

# write result to STDOUT

print '%s\t%s' % (current_word, current_count)

current_count = count

current_word = word

# do not forget to output the last word if needed!

if current_word == word:

print '%s\t%s' % (current_word, current_count)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531969.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hdu 2896 病毒侵襲 ac自動機

1 /*2 hdu 2896 病毒侵襲 ac自動機 3 從題意得知,模式串中沒有重復的串出現,所以結構體中可以將last[](后綴鏈接)數組去掉 4 last[]數組主要是記錄具有相同后綴模式串的末尾節點編號 。本題中主要是計算每一個模式串5 在主串中有沒…

axure原件 總是丟失_Axure實現提示文本單擊顯示后自動消失的效果

FORM一 .新增的input輸入屬性 1.email類型 在表單提交E-mail地址時,無效的輸入會生成很多無效數據,對后期的數據檢索造成一定的影響.所以在表單提交之前,需要對輸入的E-mail地址進行有效 ...Google的Protobuf協議分析protobuf和thrift類似,也是一個序列化的協議實現,簡稱PB(下文…

linux php不能寫文件內容,php 在linux系統下寫出文件問題

最近寫了一個簡單的生成文件,服務器用的linux 但是在將文件寫出到路徑的時候就會寫出一個其他的文件夾其中一些代碼如下define("paddy",dirname(__FILE__));$gkrequest_uri();$filepathpaddy.$gk;createfile($filefath,$file);//$f…

python mysql刪除數據_python-mysql刪除和更新數據

刪除數據import codecsimport MySQLdbdef connect_mysql():db_config {host: 192.168.48.128,port: 3306,user: xiang,passwd: 123456,db: python,charset: utf8}cnx MySQLdb.connect(**db_config)return cnxif __name__ __main__:cnx connect_mysql()sql select * from S…

xlat指令...

1 ;就是一個串str1, lea ebx, str1 然后我們ebx1總是加上的是一個字節, 無論(串是word, byte, dword)2 .3863 .model flat4 .stack 40965 include io.h6 ExitProcess proto near32 stdcall, deExitCode:dwo…

php 串口通信例程,HAL庫串口通信例程

請問下 為什么要 用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)這個函數呢?不用不行嗎?static void MX_USART1_UART_Init(void){huart1.Instance USART1;huart1.Init.BaudRate 9600;huart1.Init.WordLength UART_WORDLENGTH_8B;huart1.Init.Stop…

char 類型與lpcwstr_「lpctstr」char* 與 LPCTSTR 類型的互相轉換 - seo實驗室

lpctstr1.char* 轉換成 LPCTSTRchar ch[1024] "wo shi ni baba";int num MultiByteToWideChar(0,0,ch,-1,NULL,0);wchar_t *wide new wchar_t[num];MultiByteToWideChar(0,0,ch,-1,wide,num);解析:num 獲得長字節所需的空間MultiByteToWideChar()表示將…

poj 2195 Going Home

1 /*2 做網絡流的題建圖真的是太重要了!3 本題是將人所在的位置和房子所在的位置建立邊的聯系,其中man到house這一條邊的流量為 1, 費用為兩者的距離4 而方向邊的流量為 0, 費用為正向邊的相反數(也就是沿著反…

CardLayout布局練習(小的圖片瀏覽器)

1 /*2 涉及Panel中的圖片的加載,還有Frame的關閉的方法, CardLayout(int hgap, int vgap)就會決定卡片面板的大小3 匿名類的使用。。。4 */5 import java.awt.*;6 import java.awt.event.*;7 import javax.swing.*;8 public class…

python求逆矩陣的方法,Python 如何求矩陣的逆

我就廢話不多說了,大家還是直接看代碼吧~import numpy as npkernel np.array([1, 1, 1, 2]).reshape((2, 2))print(kernel)print(np.linalg.inv(kernel))注意,Singular matrix奇異矩陣不可求逆補充:pythonnumpy中矩陣的逆和偽逆的區別定義&a…

plsql存過聲明游標_plsql編程學習之游標一

oralce plsql編程的游標游標分類1顯示游標2隱式游標隱式游標,oracle自動管理,不用聲明,打開和關閉,ORACLE自動處理,使用隱式游標%FOUND時,需要加上 SQL%FOUND顯示游標,需要自己聲明,…

用命令行編譯java并生成可執行的jar包

用命令行編譯java并生成可執行的jar包 1.編寫源代碼。 編寫源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java。程序結構如下:package test;import java.awt.*; import javax.swing.*; //更多包的導入...clas…

python計時器單位,python(計時器)

計時器要求:定制一個計時器的類start 和 stop方法代表啟動計時和停止計時假設計時器對象 t1,print(t1)和直接調用t1 均顯示結果當計時器未啟動或已停止計時,調用stop方法能給予溫馨提示兩個計時器對象可以相加: t1 t2只能使用提供…

查詢分析300萬筆記錄_給你100萬條數據的一張表,你將如何查詢優化?

1.兩種查詢引擎查詢速度(myIsam 引擎)InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行。MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含 whe…

poj 3321 Apple Trie

/*poj 3321 Apple Trie 這道題的關鍵是如何將一個樹建成一個一維數組利用樹狀數組來解題!可以利用dfs()來搞定,我們在對一個節點深搜后,所經過的節點的數目就是該節點的子樹的數目所以我們利用start[i]數組來記錄 i 節…

php美團項目分享,美團項目(純代碼)(示例代碼)

一.框架搭建1.icon規格要求可從文檔中查找,搜索app icon.2.因為很多界面重復利用,所以不用storyboarda.刪除stroyboard,在設置中Info -> Main storyboard file base name 項直接去除b.創建ZXHomeViewController(UICollectionViewController)和ZXNavigationController(UINavi…

ioc spring 上機案例_Spring的IoC入門案例

1、創建工程,導入坐標1.1 創建工程1.2 導入坐標xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0org.examplespring_01_io…

java中父類與子類, 不同的兩個類中的因為構造函數由于遞歸調用導致棧溢出問題...

1 /*2 對于類中對成員變量的初始化和代碼塊中的代碼全部都挪到了構造函數中,3 并且是按照java源文件的初始化順序依次對成員變量進行初始化的,而原構造函數中的代碼則移到了構造函數的最后執行4 */5 import static java.lang.System.out;6 7 public clas…

liunx php的項目地址,在 Linux 配置 PHP 項目

在 Linux 配置 PHP 項目一, 搭建測試環境軟件環境:(PHP 項目)PHP5.4Apache(httpd2.4)mysql5.7二, 安裝1掛載:1. 把 iso 的鏡像文件放到虛擬機 Linux 的 CD/ROM(在右下角 (網絡適配器 / 橋接模式) 旁有個光盤, 點擊連接, 之后頁面出現一個光盤)2. 使用掛載命令, 把 CD/ROM 設備里…

springwebflux 頁面_【SpringBoot WEB系列】WebFlux靜態資源配置與訪問

上一篇博文介紹SpringMVC的靜態資源訪問,那么在WebFlux中,靜態資源的訪問姿勢是否一致呢I. 默認配置與SpringBoot的默認配置一樣,WebFlux同樣是classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/…