Mapreduce的理解?Mapreduce 的執行原理?
MapReduce程序運行流程 Mapper 階段 1、先將HDFS中的輸入文件file按照一定的標准進行切片 2、調用自己編寫的map邏輯,將輸入的鍵值對<k1,v1>變成<k2,v2> 3、按照一定的規則對輸出的鍵值對<k2,v2>進行分區 4、對每個分區中的鍵值對進行排序。 Reduce 階段 1、對多個Mapper任務的輸出,按照不同的分區,通過網絡拷貝到不同的Reducer節點上進行處理,將數據按照分區拷貝到不同的Reducer節點之后,
對多個Mapper任務的輸出在進行合並,排序。 2、調用自己的reduce邏輯,將鍵值對<k2,v2s>變為<k3,v3>.在這里注意:每一個鍵值對<k2,v2s>都會調用一次reduce函數。 3、將Reducer任務的輸出保存到指定的文件中。
1 Spark工作流程簡述
1、構建Spark Application的運行環境(啟動SparkContext),SparkContext向 資源管理器(Standalone、Mesos或YARN)注冊並申請Executor運行資源; 2、資源管理器分配Executor資源並啟動StandaloneExecutorBackend,Executor 運行情況將隨着心跳發送到資源管理器上; 3、SparkContext構建成DAG圖並分解成Stage,再把Taskset發送給Task Scheduler; 4、Executor向SparkContext申請Task,Task Scheduler將Task發放給Executor 運行同時SparkContext將應用程序代碼發放給Executor。 5、Task在Executor上運行,運行完畢釋放所有資源。
Hadoop 中 job 和 task 之間的區別是什么
JobTracker 是一個 master 服務,軟件啟動之后 JobTracker 接收 Job,負責調度 Job的每一個子任務, task 運行於 TaskTracker 上,並監控它們,
如果發現有失敗的 task 就重新運行它。一般情況應該把 JobTracker 部署在單獨的機器上。
TaskTracker 是運行在多個節點上的 slaver 服務。TaskTracker 主動與 JobTracker 通信,接收作業,並負責直接執行每一個任務。
hive的使用,內外部表的區別,分區作用,UDF和Hive優化
(1)hive使用:倉庫、工具 (2)hive內外部表:內部表數據永久刪除,外部表數據刪除后、其他人依然可以訪問 (3)分區作用:防止數據傾斜 (4)UDF函數:用戶自定義的函數(主要解決格式,計算問題),需要繼承UDF類 java代碼實現 class TestUDFHive extends UDF { public String evalute(String str){ try{ return "hello"+str }catch(Exception e){ return str+"error" } } }
Hive優化:看做mapreduce處理
排序優化:sort by 效率高於 order by 分區:使用靜態分區 (statu_date="20160516",location="beijin"),每個分區對應hdfs上的一個目錄 減少job和task數量:使用表鏈接操作 解決groupby數據傾斜問題:設置hive.groupby.skewindata=true ,那么hive會自動負載均衡 小文件合並成大文件:表連接操作 使用UDF或UDAF函數:http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888819.html
Hbase的rk設計,Hbase優化
rowkey:hbase三維存儲中的關鍵(rowkey:行鍵 ,columnKey(family+quilaty):列鍵 ,timestamp:時間戳) rowkey字典排序、越短越好 使用id+時間:9527+20160517 \使用hash散列:dsakjkdfuwdsf+9527+20160518 應用中,rowkey 一般10~100bytes,8字節的整數倍,有利於提高操作系統性能 Hbase優化 分區:RegionSplit()方法 \NUMREGIONS=9 column不超過3個 硬盤配置,便於regionServer管理和數據備份及恢復 分配合適的內存給regionserver 其他: hbase查詢 (1)get (2)scan 使用startRow和endRow限制
jvm運行機制及內存原理
運行:
加載.class文件
管理並且分配內存
垃圾回收
內存原理:
JVM裝載環境和配置
裝載JVM.dll 並初始化JVM.dll
處理class類
hdfs、yarn參數調優
mapreduce.job.jvm.num.tasks
默認為1,設置為 -1,重用jvm
Hbase、Hive、impala、zookeeper、Storm、spark原理和使用方法、使用其架構圖講解
1、如何為一個hadoop任務設置mappers的數量
答案: 使用job.setNumMapTask(int n)手動分割,這是不靠譜的 官方文檔:“Note: This is only a hint to the framework”說明這個方法只是提示作用,不起決定性作用 實際上要用公式計算: Max(min.split,min(max.split,block))就設置分片的最大最下值 computeSplitSize()設置 參考:http://blog.csdn.net/strongerbit/article/details/7440111 2、有可能使hadoop任務輸出到多個目錄中么?如果可以,怎么做? 答案:在1.X版本后使用MultipleOutputs.java類實現 源碼: MultipleOutputs.addNamedOutput(conf, "text2", TextOutputFormat.class, Long.class, String.class); MultipleOutputs.addNamedOutput(conf, "text3", TextOutputFormat.class, Long.class, String.class); 參考:http://my.oschina.net/leejun2005/blog/94706 發音:Multiple['m?lt?pl]--》許多的
兩個類TextInputFormat和KeyValueTextInputFormat的區別?
?FileInputFormat的子類: TextInputFormat(默認類型,鍵是LongWritable類型,值為Text類型,key為當前行在文件中的偏移量,value為當前行本身); ?KeyValueTextInputFormat(適合文件自帶key,value的情況,只要指定分隔符即可,比較實用,默認是\t分割); 源碼: String sepStr =job.get("mapreduce.input.keyvaluelinerecordreader.key.value.separator","\t"); 注意:在自定義輸入格式時,繼承FileInputFormat父類 參考:http://www.cnblogs.com/vichao/archive/2013/06/06/3118100.html
在一個運行的hadoop任務中,什么是InputSpilt?
InputSplit是MapReduce對文件進行處理和運算的輸入單位,只是一個邏輯概念,每個InputSplit並沒有對文件實際的切割,只是記錄了要處理的數據的位置
(包括文件的path和hosts)和長度(由start和length決定),默認情況下與block一樣大。
拓展:需要在定義InputSplit后,展開講解mapreduce的原理
Hadoop框架中,文件拆分是怎么被調用的?
JobTracker, 創建一個InputFormat的 實例,調用它的getSplits()方法,把輸入目錄的文件拆分成FileSplist作 為Mapper task 的輸入,生成Mapper task加入Queue。 源碼中體現了拆分的數量 long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits); long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input. FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);//minSplitSize默認是1
分別舉例什么情況下使用combiner,什么情況下不會使用?
Combiner適用於對記錄匯總的場景(如求和),但是,求平均數的場景就不能使用Combiner了
Hadoop中job和Tasks之間的區別是什么?
job是工作的入口,負責控制、追蹤、管理任務,也是一個進程
包含map task和reduce task
Tasks是map和reduce里面的步驟,主要用於完成任務,也是線程
Hadoop中通過拆分任務到多個節點運行來實現並行計算,但是某些節點運行較慢會拖慢整個任務的運行,hadoop采用何種機制應對這種情況?
結果查看監控日志,得知產生這種現象的原因是數據傾斜問題 解決: (1)調整拆分mapper的數量(partition數量) (2)增加jvm (3)適當地將reduce的數量變大
流API中的什么特性帶來可以使map reduce任務可以以不同語言(如perl\ruby\awk等)實現的靈活性?
用可執行文件作為Mapper和Reducer,接受的都是標准輸入,輸出的都是標准輸出 參考:http://www.web520.cn/archives/9220
參考下面的M/R系統的場景:
--HDFS塊大小為64MB
--輸入類型為FileInputFormat
--有3個文件的大小分別是:64k 65MB 127MB
Hadoop框架會把這些文件拆分為多少塊?
答案:
64k------->一個block
65MB---->兩個文件:64MB是一個block,1MB是一個block
127MB--->兩個文件:64MB是一個block,63MB是一個block
Hadoop中的RecordReader的作用是什么?
屬於split和mapper之間的一個過程
將inputsplit輸出的行為一個轉換記錄,成為key-value的記錄形式提供給mapper
Map階段結束后,Hadoop框架會處理:Partitioning ,shuffle 和sort,在這個階段都會發生了什么?
MR一共有四個階段,split map shuff reduce 在執行完map之后,可以對map的輸出結果進行分區,
分區:這塊分片確定到哪個reduce去計算(匯總)
排序:在每個分區中進行排序,默認是按照字典順序。
Group:在排序之后進行分組
如果沒有定義partitioner,那么數據在被送達reducer前是如何被分區的?
Partitioner是在map函數執行context.write()時被調用。 用戶可以通過實現自定義的?Partitioner來控制哪個key被分配給哪個?Reducer。 查看源碼知道: 如果沒有定義partitioner,那么會走默認的分區Hashpartitioner public class HashPartitioner<K, V> extends Partitioner<K, V> { /** Use {@link Object#hashCode()} to partition. */ public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } } 參考:http://blog.csdn.net/gamer_gyt/article/details/47339755
什么是Combiner?
這是一個hadoop優化性能的步驟,它發生在map與reduce之間 目的:解決了數據傾斜的問題,減輕網絡壓力,實際上時減少了maper的輸出 源碼信息如下: public void reduce(Text key, Iterator<LongWritable> values, OutputCollector<Text, LongWritable> output, Reporter reporter) throws IOException { LongWritable maxValue = null; while (values.hasNext()) { LongWritable value = values.next(); if (maxValue == null) { maxValue = value; } else if (value.compareTo(maxValue) > 0) { maxValue = value; } } output.collect(key, maxValue); } 在collect實現類中,有這樣一段方法 public synchronized void collect(K key, V value) throws IOException { outCounter.increment(1); writer.append(key, value); if ((outCounter.getValue() % progressBar) == 0) { progressable.progress(); } } 下面是說明輸出數量達到10000時,開始合並為一個maper public static final long DEFAULT_COMBINE_RECORDS_BEFORE_PROGRESS = 10000; Mapreduce原理詳解:
