這篇文章主要講解了“Hadoop生態(tài)之分析MapReduce及Hive”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Hadoop生態(tài)之分析MapReduce及Hive”吧!
創(chuàng)新互聯(lián)專(zhuān)注于井陘網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供井陘營(yíng)銷(xiāo)型網(wǎng)站建設(shè),井陘網(wǎng)站制作、井陘網(wǎng)頁(yè)設(shè)計(jì)、井陘網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造井陘網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供井陘網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
1.計(jì)算框架
Hadoop 是一個(gè)計(jì)算框架,目前大型數(shù)據(jù)計(jì)算框架常用的大致有五種:
僅批處理框架:Apache hadoop.
僅流處理框架:Apache Storm、Apache Samza.
混合框架:Apache Spark、Apache Flink.
這其中名氣最大、使用最廣的當(dāng)屬 Hadoop 和 Spark。
雖然兩者都被稱(chēng)為大數(shù)據(jù)框架,但實(shí)際層級(jí)不同。Hadoop 是一個(gè)分布式數(shù)據(jù)基礎(chǔ)設(shè)施,包括計(jì)算框架 MapReduce、分布式文件系統(tǒng) HDFS、YARN 等。而Spark 是專(zhuān)門(mén)用來(lái)對(duì)分布式存儲(chǔ)的大數(shù)據(jù)的處理工具,并不會(huì)進(jìn)行數(shù)據(jù)存儲(chǔ),更像是 MapReduce 的替代。
在使用場(chǎng)景上,Hadoop 主要用于離線(xiàn)數(shù)據(jù)計(jì)算,Spark更適用于需要精準(zhǔn)實(shí)時(shí)的場(chǎng)景。
2. MapReduce
2.1 MapReduce 是什么
一個(gè)基于 Java 的并行分布式計(jì)算框架。
前文有提到 HDFS 提供了基于主從結(jié)構(gòu)的分布式文件系統(tǒng),基于此存儲(chǔ)服務(wù)支持,MapReduce 可以實(shí)現(xiàn)任務(wù)的分發(fā)、跟蹤、執(zhí)行等工作,并收集結(jié)果。
2.2 MapReduce 組成
MapReduce 主要思想講的通俗一點(diǎn)就是將一個(gè)大的計(jì)算拆分成 Map(映射)和 Reduce(化簡(jiǎn))。說(shuō)到這里,其實(shí) JAVA8 在引入 Lambda 后,也有 map 和 reduce 方法。下面是一段 Java 中的用法:
List<Integer> nums = Arrays.asList(1, 2, 3); List<Integer> doubleNums = nums.stream().map(number -> number * 2).collect(Collectors.toList()); 結(jié)果:[2,4,6] Optional<Integer> sum = nums.stream().reduce(Integer::sum); 結(jié)果:[6]
代碼很簡(jiǎn)單,map 負(fù)責(zé)歸類(lèi),reduce 負(fù)責(zé)計(jì)算。而 Hadoop 中的 MapReduce 也有異曲同工之處。
下面結(jié)合官方案例 WordCount 進(jìn)行分析:
public class WordCount { // Mapper泛型類(lèi),4個(gè)參數(shù)分別代表輸入鍵、值,輸出鍵、值類(lèi)型 public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { // 字符解析 StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { // nextToken():返回從當(dāng)前位置到下一個(gè)分隔符的字符串 word.set(itr.nextToken()); context.write(word, one); } } } // Reducer同樣也是四個(gè)參數(shù) public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException,InterruptedException { int sum = 0; // 循環(huán)values,并記錄“單詞”個(gè)數(shù) for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }
在這段代碼中,不難看出程序核心是 map 函數(shù)和 reduce 函數(shù)。是否 MapReduce 就是由這兩者組成的?接著往下看。
2.3 Map 和 Reduce
2.3.1 Map
在 WordCount 案例中,明顯看到 map 函數(shù)的輸入主要是一個(gè)
Context 在這里暫時(shí)性忽略,其是 Mapper 類(lèi)的內(nèi)部抽象類(lèi),一般計(jì)算中不會(huì)用到,可以先當(dāng)做“上下文”理解。
map 函數(shù)計(jì)算過(guò)程是: 將這行文本中的單詞提取出來(lái),針對(duì)每個(gè)單詞輸出一個(gè)
2.3.2 Reduce
接著就來(lái)看看 reduce ,這里輸入?yún)?shù) Values 就是上面提到的由很多個(gè) 1 組成的集合,而 Key 就是具體“單詞” word。
它的計(jì)算過(guò)程是: 將集合里的1求和,再將單詞(word)與這個(gè)和(sum)組成一個(gè)
假設(shè)有兩個(gè)數(shù)據(jù)塊的文本數(shù)據(jù)需要進(jìn)行詞頻統(tǒng)計(jì),MapReduce 計(jì)算過(guò)程如下圖所示:
到這都很容易理解,畢竟只是個(gè) HelloWorld 的例子~,但整個(gè)MapReduce過(guò)程中最關(guān)鍵的部分其實(shí)是在 map 到 reduce 之間。
還拿上面例子來(lái)說(shuō):統(tǒng)計(jì)相同單詞在所有輸入數(shù)據(jù)中出現(xiàn)的次數(shù),一個(gè) Map 只能處理一部分?jǐn)?shù)據(jù),而熱點(diǎn)單詞就很可能會(huì)出現(xiàn)在所有 Map 中了,意味著同一單詞必須要合并到一起統(tǒng)計(jì)才能得到正確結(jié)果。這種數(shù)據(jù)關(guān)聯(lián)幾乎在所有的大數(shù)據(jù)計(jì)算場(chǎng)景都需要處理,如果是例子這種的當(dāng)然只對(duì) Key 合并就OK了,但類(lèi)似數(shù)據(jù)庫(kù) join 操作這種較復(fù)雜的,就需對(duì)兩種類(lèi)型(或更多)的數(shù)據(jù)依據(jù) Key 關(guān)聯(lián)。
這個(gè)數(shù)據(jù)關(guān)聯(lián)操作在 MapReduce中的叫做:shuffle。
2.4 shuffle
shuffle 從字面意思來(lái)看,洗牌。下面是一個(gè)完整的MR過(guò)程,看一看如何洗牌。
先看左半邊
1. 從 HDFS 中讀取數(shù)據(jù),輸入數(shù)據(jù)塊到一個(gè)個(gè)的 map,其中 map 完成計(jì)算時(shí),計(jì)算結(jié)果會(huì)存儲(chǔ)到本地文件系統(tǒng)。而當(dāng) map 快要進(jìn)行完時(shí),就會(huì)啟動(dòng) shuffle 過(guò)程。
2. 如圖,shuffle 也可分為兩種,在Map端的是 Map shuffle。大致過(guò)程為:Map 任務(wù)進(jìn)程會(huì)調(diào)用一個(gè) Partitioner 接口,對(duì) Map 產(chǎn)生的每個(gè)
這里就實(shí)現(xiàn)了對(duì) Map 結(jié)果的分區(qū)、排序、分割,以及將同一分區(qū)的輸出合并寫(xiě)入磁盤(pán),得到一個(gè)分區(qū)有序的文件。這樣不管 Map 在哪個(gè)服務(wù)器節(jié)點(diǎn),相同的 Key 一定會(huì)被發(fā)送給相同 Reduce 進(jìn)程。Reduce 進(jìn)程對(duì)收到的
再看右半邊
1. Reduce shuffle,又可分為復(fù)制 Map 輸出、排序合并兩階段。
Copy:Reduce 任務(wù)從各個(gè) Map 任務(wù)拖取數(shù)據(jù)后,通知父 TaskTracker 狀態(tài)已更新,TaskTracker 通知 JobTracker。Reduce 會(huì)定期向JobTracker 獲取 Map 的輸出位置,一旦拿到位置,Reduce 任務(wù)會(huì)從此輸出對(duì)應(yīng)的 TaskTracker 上復(fù)制輸出到本地,不會(huì)等到所有的Map任務(wù)結(jié)束。
Merge sort:
Copy 的數(shù)據(jù)先放入內(nèi)存緩沖區(qū),若緩沖區(qū)放得下就把數(shù)據(jù)寫(xiě)入內(nèi)存,即內(nèi)存到內(nèi)存 merge。
Reduce 向每個(gè) Map 去拖取數(shù)據(jù),內(nèi)存中每個(gè) Map 對(duì)應(yīng)一塊數(shù)據(jù),當(dāng)內(nèi)存緩存區(qū)中存儲(chǔ)的數(shù)據(jù)達(dá)到一定程度,開(kāi)啟內(nèi)存中 merge,把內(nèi)存中數(shù)據(jù)merge 輸出到磁盤(pán)文件中,即內(nèi)存到磁盤(pán) merge。
當(dāng)屬于該 reduce 的 map 輸出全部拷貝完成,會(huì)在 reduce 上生成多個(gè)文件,執(zhí)行合并操作,即磁盤(pán)到磁盤(pán) merge。此刻 Map 的輸出數(shù)據(jù)已經(jīng)是有序的,Merge 進(jìn)行一次合并排序,所謂 Reduce 端的 sort 過(guò)程就是這個(gè)合并的過(guò)程。
2. 經(jīng)過(guò)上一步Reduce shuffle后,reduce進(jìn)行最后的計(jì)算,將輸出寫(xiě)入HDFS中。
以上便是 shuffle 大致四個(gè)步驟,關(guān)鍵是 map 輸出的 shuffle 到哪個(gè) Reduce 進(jìn)程,它由 Partitioner 來(lái)實(shí)現(xiàn),MapReduce 框架默認(rèn)的 Partitioner 用 Key 哈希值對(duì) Reduce 任務(wù)數(shù)量取模,相同 Key 會(huì)落在相同的 Reduce 任務(wù) ID 上。
public int getPartition(K2 key, V2 value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; }
如果對(duì) Shuffle 總結(jié)一句話(huà): 分布式計(jì)算將不同服務(wù)器中的數(shù)據(jù)合并到一起進(jìn)行后續(xù)計(jì)算的過(guò)程。
shuffle 是大數(shù)據(jù)計(jì)算過(guò)程中神奇的地方,不管是 MapReduce 還是 Spark,只要是大數(shù)據(jù)批處理計(jì)算,一定會(huì)有 shuffle 過(guò)程,只有讓數(shù)據(jù)關(guān)聯(lián)起來(lái),它的內(nèi)在關(guān)系和價(jià)值才會(huì)呈現(xiàn)。
3. Hive
上一部分介紹了 MapReduce,接下來(lái)簡(jiǎn)單談?wù)?Hive .
我覺(jué)得任何一項(xiàng)技術(shù)的出現(xiàn)都是為了解決某類(lèi)問(wèn)題, MapReduce 毫無(wú)疑問(wèn)簡(jiǎn)化了大數(shù)據(jù)開(kāi)發(fā)的編程難度。但實(shí)際上進(jìn)行數(shù)據(jù)計(jì)算更常用的手段可能是 SQL,那么有沒(méi)有辦法直接運(yùn)行 SQL ?
3.1 Hive是什么
基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),定義了一種類(lèi)SQL查詢(xún)語(yǔ)言:Hive SQL。
這里有一個(gè)名詞 數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)倉(cāng)庫(kù)是指:面向主題(Subject Oriented)、集成(Integrated)、相對(duì)穩(wěn)定(Non-Volatile)、反應(yīng)歷史變化(Time Variant)的數(shù)據(jù)集合,用于支持管理決策。
這么說(shuō)可能有點(diǎn)抽象,分解一下:
主題:數(shù)據(jù)倉(cāng)庫(kù)針對(duì)某個(gè)主題來(lái)進(jìn)行組織,指使用數(shù)據(jù)倉(cāng)庫(kù)決策時(shí)所關(guān)心的重點(diǎn)方面。比如訂閱分析就可以當(dāng)做一個(gè)主題。
集成:數(shù)據(jù)倉(cāng)庫(kù)要將多個(gè)數(shù)據(jù)源數(shù)據(jù)存到一起,但數(shù)據(jù)以前的存儲(chǔ)方式不同,要經(jīng)過(guò)抽取、清洗、轉(zhuǎn)換。(也就是 ETL)
穩(wěn)定:保存的數(shù)據(jù)是一系列歷史快照,不允許修改,只能分析。
時(shí)變:會(huì)定期接收到新的數(shù)據(jù),反應(yīng)出新的數(shù)據(jù)變化。
現(xiàn)在再看下定義:數(shù)據(jù)倉(cāng)庫(kù)是將多個(gè)數(shù)據(jù)源的數(shù)據(jù)按照一定的主題集成,進(jìn)行抽取、清洗、轉(zhuǎn)換。且處理整合后的數(shù)據(jù)不允許隨意修改,只能分析,還需定期更新。
3.2 為什么是 Hive
了解了 Hive 的基礎(chǔ)定義,想一下:一個(gè)依賴(lài)于 HDFS 的數(shù)據(jù)倉(cāng)庫(kù)在 Hadoop 環(huán)境中可以扮演什么角色?
前面說(shuō)到,可不可以讓 SQL 直接運(yùn)行在 Hadoop 平臺(tái),這里的答案便是 Hive。它可以將 Hive SQL 轉(zhuǎn)換為 MapReduce 程序運(yùn)行。
Hive 初期版本默認(rèn) Hive on Mapreduce
啟動(dòng) hive 前通常要先啟動(dòng) hdfs 和 yarn, 同時(shí)一般需要配置 MySQL,Hive 依賴(lài)于 HDFS 的數(shù)據(jù)存儲(chǔ),但為了能操作 HDFS 上的數(shù)據(jù)集,要知道數(shù)據(jù)切分格式、存儲(chǔ)類(lèi)型、地址等。這些信息通過(guò)一張表存儲(chǔ),稱(chēng)為元數(shù)據(jù),可以存儲(chǔ)到 MySQL 中。
現(xiàn)在來(lái)看下 Hive 的部分命令
新建數(shù)據(jù)庫(kù):create database xxx;
刪除數(shù)據(jù)庫(kù):drop database xxx;
建表:
create table table_name(col_name data_type);
Hive 的表有兩個(gè)概念:**內(nèi)部表和外部表**。默認(rèn)內(nèi)部表,簡(jiǎn)單來(lái)說(shuō),內(nèi)部表數(shù)據(jù)存儲(chǔ)在每個(gè)表相應(yīng)的HDFS目錄下。外部表的數(shù)據(jù)存在別處,要?jiǎng)h除這個(gè)外部表,該外部表所指向的數(shù)據(jù)是不會(huì)被刪除的,只會(huì)刪除外部表對(duì)應(yīng)的元數(shù)據(jù)。
查詢(xún):
select * from t_table **where** a<100 **and** b>1000;
連接查詢(xún):
select a.*,b.* from t_a a join t_b b on a.name=b.name;
看到這里,可能會(huì)覺(jué)得我在寫(xiě) SQL, 沒(méi)錯(cuò),對(duì)于熟悉 SQL 的人來(lái)說(shuō),Hive 是非常易于上手的。
3.3 HIVE SQL To MapReduce
前面說(shuō)到 HQL 可以‘轉(zhuǎn)換’為 MapReduce, 下面就來(lái)看看:一個(gè) HQL 是如何轉(zhuǎn)化為 MapReduce 的Hive的基礎(chǔ)架構(gòu):
通過(guò) Client 向 Hive 提交 SQL 命令。如果是 DDL,Hive 就會(huì)通過(guò)執(zhí)行引擎 Driver 將數(shù)據(jù)表的信息記錄在 Metastore 元數(shù)據(jù)組件中,這個(gè)組件通常用一個(gè)關(guān)系數(shù)據(jù)庫(kù)實(shí)現(xiàn),記錄表名、字段名、字段類(lèi)型、關(guān)聯(lián) HDFS 文件路徑等 Meta 信息(元信息)。
如果是DQL,Driver 就會(huì)將該語(yǔ)句提交給自己的編譯器 進(jìn)行語(yǔ)法分析、解析、優(yōu)化等一系列操作,最后生成一個(gè) MapReduce 執(zhí)行計(jì)劃。再根據(jù)執(zhí)行計(jì)劃生成一個(gè) MapReduce 的作業(yè),提交給 Hadoop 的 MapReduce 計(jì)算框架處理。
比如輸入一條 select xxx from a ; 其執(zhí)行順序?yàn)椋菏紫仍?metastore 查詢(xún)--> sql 解析--> 查詢(xún)優(yōu)化---> 物理計(jì)劃--> 執(zhí)行 MapReduce。
感謝各位的閱讀,以上就是“Hadoop生態(tài)之分析MapReduce及Hive”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Hadoop生態(tài)之分析MapReduce及Hive這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
網(wǎng)站名稱(chēng):Hadoop生態(tài)之分析MapReduce及Hive
文章URL:http://aaarwkj.com/article42/pdhehc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站排名、建站公司、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)