日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mapreduce v1.0学习笔记

發布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mapreduce v1.0学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

它是什么?

一個用于處理大數據開源的分布式計算框架,它由java實現,原生提供java編程交互接口,其它語言通過hadoop streaming方式和mapreduce框架交互。

可以做什么?

利用框架提供的簡單編程接口,對海量數據進行離線統計分析編程。程序員只需要實現map接口(數據分解),reduce接口(數據匯總)即可,實現簡單。

適用場景

離線情況下對海量數據進行分析

怎么使用?

示例 - 對文章單詞進行計數(使用Python實現)

準備

1 搭建好hadoop 1.0集群
2 網上找一篇英語文章,上傳到hdfs集群中,假如上傳后文件路徑為: /data/the_english_article.txt

說明

1 單詞之間使用空格分隔

實現map接口(map.py)

import sysfor line in sys.stdin:ss = line.strip().split(" ")for s in ss:s = s.strip()if s != "":print "\t".join([s, 1])

實現reduce接口(reduce.py)

import syscur_word = None sum = 0for line in sys.stdin:word, cnt = line.strip().split("\t")if cur_word == None:cur_word = wordif cur_word != word:print "\t".join([cur_word, sum])cur_word = wordsum = 0sum += int(cnt)print "\t".join([cur_word, sum])

本地模擬mapreduce執行

集群上調試效率很低,正常情況下,先在本地調試,確定代碼無問題后,再在集群上跑測試

cat ./the_english_article.txt | python map.py | sort -k1 | python reduce.py | head -n 20

mapreduce集群上執行

1 創建一個shell腳本(run.sh)

HADOOP_CMD=hadoop命令完整路徑 HADOOP_STREAMING_JAR=streaming jar包完整路徑INPUT_FILE=/data/the_english_article OUTPUT_DIR=/output/wc$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_DIR$HADOOP_CMD jar $HADOOP_STREAMING_JAR \-input $INPUT_FILE \-output $OUTPUT_DIR \-mapper "python map.py" \-reducer "python reduce.py" \-file ./map.py-file ./reduce.py

2 執行mapreduce任務

bash run.sh

3 查看結果

如果執行成功,hdfs上/output/wc會有part-00000這個文件,結果就保存在這個文件中(一個reduce對應一個輸出文件,如果沒有指定reduce任務數量,默認是1個reduce匯總)

4 殺死job

hadoop job -kill job_id

如何實現?

思想

分而治之 - mapreduce框架精髓所在

數據處理:分解 -> 求解 -> 合并

數據不移動,計算移動

代碼數據量小,移動代碼比移動數據性能要高,只針對map階段

技術架構

角色描述
Job Tracker集群計算資源管理和任務調度以及任務監控,客戶端提交任務給Job Tracker,計算框架的大腦
Task Tracker執行計算任務,任務狀態上報以及資源使用情況上報,通過心跳方式,默認每隔3秒,資源slot管理

提交任務流程

mapreduce執行流程(偏宏觀角度)

1 紅色部分是需要編程的部分,其它是mapreduce框架自帶的功能
2 一個分片對應一個map
3 如果一行分片時中間被截斷了,整行屬于前一部分的分片
4 一個reduce會輸出一個結果文件
5 map/reduce默認緩存區是100M,閥值是80%,達到這個閥值開始往硬盤溢寫
6 reduce數據從map所在節點拷貝過來,會產生網絡io,map不是
7 map/reduce是進程模型,有自己獨立的空間,可以更好的控制資源
8 所有map任務執行完畢,才會開始執行reduce任務
9 同一分區下所有小文件歸并為一個文件完成后,才開始執行reduce程序
10 數據分片規則:max(min.split,min(max.split,block))

操作含義
partition對key進行分組,有幾個reduce就會通過哈希取模的方式分成幾個組,這個操作可以確保相同的key一定會分配到同一個reduce
sort同一個組下對key進行排序,按字符串排序,確保數據有序
combine對相同key進行數據合并,實際上是提前對部分數據執行reduce操作,可以減少reduce階段數據傳輸量,但是有些場景不適合,比如求中位數,會得到錯誤的結果
spill對緩沖區數據進行溢寫,map會不斷的產生數據,而內存緩沖區大小是有限的,當內存超過或者等于閥值的80%時,會鎖住這部分內存,把這部分數據寫入硬盤,生成一個spill.n的小文件,寫入之前會分好組排好序
merge對溢寫生成的小文件進行合并,生成一個更大的文件,合并的文件也是分好組排好序的數據,合并文件采用歸并排序

mapreduce執行流程(偏微觀角度)

實踐總結

1 TaskTracker節點map,reduce slot數量確定
機器CPU核數 - 1

2 單個map/reduce任務占用內存最好不要超過500M

3 單個map/reduce任務執行時間最好控制在1~3分鐘,最好不要超過20分鐘

4 壓縮文件不能分片,目前為止只有text file, sequence file可以分片

5 ulimit查看open max files,這個值不能太小

6 reduce個數不能設置太少(執行慢,出錯再試成本高),也不能設置太多(shuffle開銷大,輸出大量小文件)

hadoop streaming

技術架構

streaing在JVM和map/reduce進程之間,通過系統標準輸入和系統標準輸出交換數據

優點

1 支持任意語言編程
2 開發效率高

缺點

1 會造成數據的二次拷貝
2 默認只能處理文本數據

常用命令行選項

選項含義必填/可選備注
-input指定作業的輸入文件的hdfs路徑必填支持使用*通配符,支持指定多個文件或目錄(多個使用,分隔),可以多次使用
-output指定作業輸出的hdfs目錄必填目錄必須不存在,并且執行作業任務的用戶擁有創建該目錄的權限,只能使用一次
-mapper用戶自己寫的map程序必填指示怎么執行map程序
-reducer用戶自己寫的reduce程序可選指示怎么執行reduce程序
-file提交單個文件到hdfs中可選程序代碼文件,配置文件等,用于計算節點下載到本地,然后運行
-jobconf提交作業時的一些配置屬性可選配置作業相關的參數,示例:mapred.job.name="xxxx"
-cacheFile任務相關文件已上傳至hdfs,希望從hdfs拉取文件到本地可選hdfs://host:port/path/to/file#linkname選項在計算節點緩存文件,Streaming程序通過./linkname訪問文件
-cacheArchive同-cacheFile類似,只不過由文件變成了壓縮后的目錄可選同上
-partitioner指定用于分區的類可選示例:org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

常用提交作業時配置屬性

選項含義
mapred.reduce.tasks指定作業reduce任務數量,默認是1個
mapred.job.name作業名
mapred.job.priority作業優先級
mapred.job.map.capacity最多同時運行map任務數
mapred.job.reduce.capacity最多同時運行reduce任務數
mapred.task.timeout任務沒有響應(輸入輸出)的最大時間
mapred.compress.map.outputmap的輸出是否壓縮
mapred.map.output.compression.codecmap的輸出壓縮格式
mapred.output.compressreduce的輸出是否壓縮
mapred.output.compression.codecreduce的輸出壓縮方式
stream.map.output.field.separatormap輸出分隔符
stream.num.map.output.key.fieldsmap輸出中指定用于key的字段數
num.key.fields.for.partitionmap輸出中指定用于分區的字段數
mapred.text.key.partitioner.options指定用于分區的字段,示例:指定第2個,第3個字段用于分區,xx=-k2,3

參考資料

【0】八斗學院mapreduce內部學習資料
【1】MapReduce Tutorial
https://hadoop.apache.org/docs/current1/mapred_tutorial.html
【2】Hadoop Streaming
http://hadoop.apache.org/docs/current/hadoop-streaming/HadoopStreaming.html

轉載于:https://www.cnblogs.com/wadeyu/p/9624454.html

總結

以上是生活随笔為你收集整理的mapreduce v1.0学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。