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 20mapreduce集群上執行
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.py2 執行mapreduce任務
bash run.sh3 查看結果
如果執行成功,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.output | map的輸出是否壓縮 |
| mapred.map.output.compression.codec | map的輸出壓縮格式 |
| mapred.output.compress | reduce的輸出是否壓縮 |
| mapred.output.compression.codec | reduce的輸出壓縮方式 |
| stream.map.output.field.separator | map輸出分隔符 |
| stream.num.map.output.key.fields | map輸出中指定用于key的字段數 |
| num.key.fields.for.partition | map輸出中指定用于分區的字段數 |
| 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学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Felx布局基础教程
- 下一篇: 设计模式之:适配器模式