大数据入门(Hadoop生态系统)
Hadoop生態系統為大數據領域提供了開源的分布式存儲和分布式計算的平臺,這一章我們進行Hadoop生態系統的入門學習,介紹其中分布式文件系統HDFS、分布式資源調度YARN、分布式計算框架MapReduce(包含Spark的入門以及和MapReduce的比較),最后通過Spring Boot集成Hadoop來訪問文件系統。
大數據的應用
本人喜歡體育運動,以體育中來舉列子。
足球點球大戰
2006年世界杯中德國隊和阿根廷隊的點球大戰中,德國隊守門員教練科普克,給了門將萊曼一張紙條,萊曼看過紙條將計就計。阿根廷隊的每個點球,幾乎都被萊曼判斷對了方向,并成功撲出坎比亞索和阿亞拉的點球,幫助德國隊打進四強。而這張紙條就是根據數據分析記錄了阿根廷隊員點球的習慣方向。
對大數據以及人工智能概念都是模糊不清的,該按照什么線路去學習,學完往哪方面發展,想深入了解,想學習的同學歡迎加入大數據學習qq群:458345782,有大量干貨(零基礎以及進階的經典實戰)分享給大家,并且有清華大學畢業的資深大數據講師給大家免費授課,給大家分享目前國內最完整的大數據高端實戰實用學習流程體系 。從java和linux入手,其后逐步的深入到HADOOP-hive-oozie-web-flume-python-hbase-kafka-scala-SPARK等相關知識一一分享!
金州勇士的崛起
如今越來越多的籃球隊開始重視和應用籃球大數據,比如NBA中的金州勇士隊。勇士隊曾長期以來一直是NBA里最爛的球隊之一,2009年它的成績排名倒數第二。沒有任何執教NBA經驗的史蒂夫·科爾,因突出的投籃優勢被委任為教練。科爾在執掌勇士隊之后,堅持用數據說話而不是憑經驗。他根據數據工程師對歷年來NBA比賽的統計,發現最有效的進攻是眼花繚亂的傳球和準確的投籃,而不是彰顯個人能力的突破和扣籃。在這個思想的指導下,勇士隊隊員苦練神投技。這其中最亮眼的新打法是盡可能地從24英尺(大約7.3米)外的三分線投籃,這樣可以得3分。于是開發了小球時代,在2015-2018摘下三枚總冠軍,成功成為NBA的霸主。
大數據的基本概率
有人說大數據的特點就是數據量大,這個不是非常的正確,數據量大不是關鍵,通過數據分析在數據中提取出價值,最終帶來商業上的利益,這才是大數據分析的最終目標。大數據有4個特點,一般我們稱之為4V,分別為:
- Volume(大量):隨著信息技術的高速發展,數據開始爆發性增長。社交網絡(微博、推特、臉書)、移動網絡、各種智能工具,服務工具等,都成為數據的來源。數據的存儲也從過去的GB到TB,乃至現在的PB、EB級別。
- Variety(多樣):廣泛的數據來源,決定了大數據形式的多樣性。任何形式的數據都可以產生作用。
- Velocity(高速):大數據的產生非常迅速,主要通過互聯網傳輸。大數據對處理速度有非常嚴格的要求,服務器中大量的資源都用于處理和計算數據,很多平臺都需要做到實時分析。數據無時無刻不在產生,誰的速度更快,誰就有優勢。
- Value(價值):這也是大數據的核心特征。通過從大量不相關的各種類型的數據中,挖掘出對未來趨勢與模式預測分析有價值的數據,并通過機器學習方法、人工智能方法或數據挖掘方法深度分析,發現新規律和新知識,并運用于農業、金融、醫療等各個領域,從而最終達到改善社會治理、提高生產效率、推進科學研究的效果。
大數據涉及到的技術
- 數據采集:把海量數據收集到數據平臺上來,才能做后續的數據分析。
- 數據存儲:數據的存儲位置。由于數據量巨大,一般為分布式存儲系統,較通用用的為。
- 數據分析:對數據進行有效性分析(數據分析框架MapReduce,spark等)。
- 可視化:把分析結果可視化展示。
分布式文件系統HDFS
HDFS概述及設計目標
HDFS源于Google的GFS論文,設計目標為
- 非常巨大的分布式文件系統。
- 運行在普通廉價的硬件上。
- 易擴展、為用戶提供性能不錯的文件存儲服務。
HDFS架構
HDFS是一種master/slave的架構。一個HDFS集群包含一個唯一的NameNode(NN),這個master server管理著整個文件系統的命名空間并且調節客戶端對文件的訪問。同時,還擁有一系列的DataNode(DN),每個都管理著他們運行的對應節點的數據存儲。HDFS提供了一個文件系統的命名空間同時允許用戶將數據存在這些文件上。通常,一個文件被拆分成一個或多個數據塊,并且這些數據塊被保存在一系列的DataNode上。NameNode執行文件系統的命名空間的相關操作比如打開、關閉、重命名目錄或者文件。同時決定了數據塊到DataNode的映射。DataNode為客戶端的讀取寫入需求提供服務,同時處理NameNode發來的數據塊的創建、刪除、復制等需求。
?
image.png
HDFS副本機制
在前面說過HDFS使用相對廉價的計算機,那么宕機就是一種必然事件,我們需要讓數據避免丟失,就只有采取冗余數據存儲,而具體的實現就是副本機制。具體為把一個文件分為很多的塊,一個塊默認為128M,而這些塊是以多副本的形式存儲。比如存儲三個副本:
- 第一副本:如果上傳節點是DataNode(DN),則上傳該節點;如果上傳節點是NameNode(NN),則隨機選擇DataNode(DN) 。
- 第二副本:放置在不同機架的DataNode(DN)上 。
-
第三副本:放置在與第二副本相同機架的不同DataNode(DN)上。
?
這種方式可以極大程度上避免了宕機所造成的數據丟失。而數據庫的存儲的元數據是存儲在NameNode(NN)中,在數據讀取是可以知道在那些節點上讀取文件。下面是官方架構圖。image.png
HDFS環境搭建
Apache Hadoop 有版本管理混亂,部署過程繁瑣、升級過程復雜,兼容性差等缺點,而CDH是Hadoop眾多分支中的一種,由Cloudera維護,基于穩定版本的Apache Hadoop構建。使用CDH可以避免在使用過程中的依賴包沖突問題,對版本的升級也很方便,所以我們使用Hadoop-2.6.0-cdh5.7.0版本進行安裝。本人是使用虛擬機進行偽分布式模式的搭建,即在一臺機器上安裝,集群模式其實和偽分布式模式差不太多。
- 第一步安裝JDK
- 第二步安裝SSH
- 安裝hadoop
HDFS shell
HDFS shell的命令有很多,輸入hadoop fs回車,會有有多命令的提示。
Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ...][-chgrp [-R] GROUP PATH...][-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...][-chown [-R] [OWNER][:[GROUP]] PATH...][-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>][-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-count [-q] [-h] [-v] <path> ...][-cp [-f] [-p | -p[topax]] <src> ... <dst>][-createSnapshot <snapshotDir> [<snapshotName>]][-deleteSnapshot <snapshotDir> <snapshotName>][-df [-h] [<path> ...]][-du [-s] [-h] <path> ...][-expunge][-find <path> ... <expression> ...][-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-getfacl [-R] <path>][-getfattr [-R] {-n name | -d} [-e en] <path>][-getmerge [-nl] <src> <localdst>]這里介紹HDFS shell常用命令的使用(其實和Linux命令相似)
//查看文件目錄ls hadoop fs -ls / 查看根目錄 //建立目錄mkdir hadoop fs -mkdir 文件目錄 //上傳文件 put hadoop fs -put 本地文件路徑 hdfs文件路徑 //get 下載文件到本地 hadoop fs -get hdfs文件路徑 //刪除文件/文件夾rm hadoop fs -rm 文件 hadoop fs -rm -R 文件夾 //級聯刪除Java API操作HDFS
IDEA+Maven創建Java工程
添加HDFS相關依賴
開發Java Api操作HDFS文件使用Junit測試的方式,代碼如下
public class JunitTest {FileSystem fileSystem = null;Configuration configuration = null;public static final String URL = "hdfs://192.168.30.130:8092";@Beforepublic void setUp() throws IOException, InterruptedException {//初始化配置configuration = new Configuration();//初始化FileSystem,其中包含了文件操作的函數,其中root為虛擬機用戶名fileSystem = FileSystem.get(URI.create(URL),configuration,"root");}@Testpublic void mkdir() throws IOException {//創建目錄fileSystem.mkdirs(new Path("/test"));}@Testpublic void create() throws IOException {//創建文件,得到輸出流對象FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/test/test.txt"));//寫入文件內容fsDataOutputStream.write("hello dzy".getBytes());//關閉流fsDataOutputStream.close();}@Afterpublic void setDown() throws IOException {configuration.clear();fileSystem.close();} }在以上只是實驗了幾個API還有很多其它的API,感興趣的可以繼續學習。
HDFS文件讀寫流程
三個角色的交互 客戶端/NameNode/DataNode
HDFS寫流程
- 客戶端向NameNode發出寫文件請求。
- 檢查是否已存在文件、檢查權限。若通過檢查,直接先將操作寫入EditLog,并返回輸出流對象。
(注:先寫Log,再寫內存,因為EditLog記錄的是最新的HDFS客戶端執行所有的寫操作。如果后續真實寫操作失敗了,由于在真實寫操作之前,操作就被寫入EditLog中了,故EditLog中仍會有記錄,我們不用擔心后續client讀不到相應的數據塊,因為在第5步中DataNode收到塊后會有一返回確認信息,若沒寫成功,發送端沒收到確認信息,會一直重試,直到成功) - client端按128MB的塊切分文件。
- client將NameNode返回的分配的可寫的DataNode列表和Data數據一同發送給最近的第一個DataNode節點,此后client端和NameNode分配的多個DataNode構成pipeline管道,client端向輸出流對象中寫數據。client每向第一個DataNode寫入一個packet,這個packet便會直接在pipeline里傳給第二個、第三個…DataNode。
(注:并不是寫好一個塊或一整個文件后才向后分發) - 每個DataNode寫完一個塊后,會返回確認信息。
- 寫完數據,關閉輸輸出流。
- 發送完成信號給NameNode。
(注:發送完成信號的時機取決于集群是強一致性還是最終一致性,強一致性則需要所有DataNode寫完后才向NameNode匯報。最終一致性則其中任意一個DataNode寫完后就能單獨向NameNode匯報,HDFS一般情況下都是強調強一致性)
HDFS讀流程
- client訪問NameNode,查詢元數據信息,獲得這個文件的數據塊位置列表,返回輸入流對象。
- 就近挑選一臺datanode服務器,請求建立輸入流 。
- DataNode向輸入流中中寫數據,以packet為單位來校驗。
- 關閉輸入流
HDFS優缺點
優點
- 支持超大文件。
- 檢測和快速應對硬件故障:在集群的環境中,硬件故障是常見的問題。因為有上千臺服務器連接在一起,這樣會導致高故障率。因此故障檢測和自動恢復是hdfs文件系統的一個設計目標。
- 流式數據訪問:Hdfs的數據處理規模比較大,應用一次需要訪問大量的數據,同時這些應用一般都是批量處理,而不是用戶交互式處理。應用程序能以流的形式訪問數據集。主要的是數據的吞吐量,而不是訪問速度。
- 簡化的一致性模型:在hdfs中,一個文件一旦經過創建、寫入、關閉后,一般就不需要修改了。這樣簡單的一致性模型,有利于提高吞吐量。
缺點
- 低延遲數據訪問:如和用戶進行交互的應用,需要數據在毫秒或秒的范圍內得到響應。由于hadoop針對高數據吞吐量做了優化,犧牲了獲取數據的延遲,所以對于低延遲來說,不適合用hadoop來做。
- 大量的小文件:Hdfs的NameNode中存儲了文件分塊的元數據信息,如果有大量的小文件,導致元數據信息增加,增加NameNode負荷。
- 不支持超強的事務:沒有像關系型數據庫那樣,對事務有強有力的支持。
資源調度框架YARN
YARN概述
YARN是Hadoop 2.0中的資源管理系統,可以讓不同計算框架(MapReduce\Spark等)可以共享同一個HDFS集群上的數據,享受整體的資源調度。
YARN架構
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等幾個組件構成。
- ResourceManager是Master上一個獨立運行的進程,負責集群統一的資源管理、調度、分配等等。
- NodeManager是Slave上一個獨立運行的進程,負責上報節點的狀態,處理單個節點的資源管理 、處理來自ResouceManager的命令 、處理來自ApplicationMaster的命令。
- ApplicationMaster和Container是運行在Slave上的組件,為應用程序申請資源,并分配給內部任務 ,任務的監控和容錯等。
- Container是yarn中分配資源的一個單位,包涵內存、CPU等等資源,yarn以Container為單位分配資源。
YARN執行流程
YARN總體上仍然是master/slave結構,在整個資源管理框架中,resourcemanager為master,nodemanager是slave。Resourcemanager負責對各個nademanger上資源進行統一管理和調度。當用戶提交一個應用程序時,需要提供一個用以跟蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,并要求NodeManger啟動可以占用一定資源的任務。由于不同的ApplicationMaster被分布到不同的節點上,因此它們之間不會相互影響。
流程:
- 客戶端向RM中提交程序
- RM向NM中分配一個container,并在該container中啟動AM
- AM向RM注冊,這樣用戶可以直接通過RM査看應用程序的運行狀態(然后它將為各個任務申請資源,并監控它的運行狀態,直到運行結束)
- AM采用輪詢的方式通過RPC協議向RM申請和領取資源,資源的協調通過異步完成
- AM申請到資源后,便與對應的NM通信,要求它啟動任務
- NM為任務設置好運行環境(包括環境變量、JAR包、二進制程序等)后,將任務啟動命令寫到一個腳本中,并通過運行該腳本啟動任務
- 各個任務通過某個RPC協議向AM匯報自己的狀態和進度,以讓AM隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務
-
應用程序運行完成后,AM向RM注銷并關閉自己
?image.png
YARN環境搭建
使用的版本為hadoop-2.6.0-cdh5.7.0
//修改配置文件,配置如下(配置文件在/etc/hadoop下) mapred-site.xml,在默認情況下是沒有mapred-site.xml文件的,只有mapred-site.xml.template文件,所以在修改配置之前需要復制一份 cp mapred-site.xml.template mapred-site.xml vi mapred-site.xml //添加配置 <property> <name>mapreduce.framework.name</name> <value>yarn</value>//配置計算框架運行在yarn之上,為固定配置 </property>yarn-site.xml: vi yarn-site.xml //添加配置 <property><name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value>//nodemanager的services,目前為固定配置,當學習Spark時,其中有動態資源調度,這里才需要修改 </property> //啟動YARN相關的進程 sbin/start-yarn.sh//驗證 jps ResourceManager NodeManager 可訪問http://虛擬機IP:8088可以看到YARN的主界面。//停止YARN相關的進程sbin/stop-yarn.sh提交作業到YARN上執行
在 share目錄為我們提供了MapReduce作業的案例,我們可以使用其中的作業在YARN上執行。
提交mr作業到YARN上運行,我的作業jar包路徑為: /root/apps/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar //使用hadoop jar命令可提交作業到YARN,具體命令為 hadoop jar jar包路徑 有效的程序名字 有效程序的參數// 選用其中PI程序進行運行,在執行之前要記到啟動hdfs和yarn hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 2 3//訪問yarn主界面可看到作業的執行情況
?
image.png
分布式處理框架MapReduce/Spark
MapReduce概述
源于Google的MapReduce論文,Hadoop MapReduce是Google MapReduce的一個克隆版。MapReduce用于大規模數據集(通常大于1TB)的并行運算,實現了Map和Reduce兩個功能。MapReduce的思想是“分而治之”?!胺帧笔前褟碗s的任務分解為若干個“簡單的任務”執行,由map負責?!昂唵蔚娜蝿铡敝笖祿蛴嬎阋幠O鄬τ谠蝿找蟠罂s小;就近計算,即會被分配到存放了所需數據的節點進行計算;這些小任務可以并行計算,彼此間幾乎沒有依賴關系。Reducer負責對map階段的結果進行匯總。
特點:
- 海量數據離線處理
- 橫向擴展,而非縱向擴展,平滑無縫的可擴展性。
- 易開發:用戶不用考慮進程間的通信和套接字編程,已經為我們封裝好框架。這一點只是相對于傳統來講,現在主流的Spark框架更為簡單(Spark為本人知識盲區,后續學習)。
- 易運行:可運行在廉價的硬件之上。
MapReduce編程模型
MapReduce編程模型給出了分布式編程方法的5個步驟:
- 迭代,遍歷輸入數據,將其解析成key/value對;
- 將輸入key/value對映射map成另外一些key/value對;
- 根據key對中間結果進行分組(grouping);
- 以組為單位對數據進行歸約;
- 迭代,將最終產生的key/value對保存到輸出文件中。
MapReduce架構
和HDFS一樣,MapReduce也是采用Master/Slave的架構
MapReduce包含四個組成部分,分別為Client、JobTracker、TaskTracker和Task
- Client 客戶端
每一個 Job 都會在用戶端通過 Client 類將應用程序以及配置參數 Configuration 打包成 JAR 文件存儲在 HDFS,并把路徑提交到 JobTracker 的 master 服務,然后由 master 創建每一個 Task(即 MapTask 和 ReduceTask) 將它們分發到各個 TaskTracker 服務中去執行。 - JobTracker
JobTracke負責資源監控和作業調度。JobTracker 監控所有TaskTracker 與job的健康狀況,一旦發現失敗,就將相應的任務轉移到其他節點;同時,JobTracker 會跟蹤任務的執行進度、資源使用量等信息,并將這些信息告訴任務調度器,而調度器會在資源出現空閑時,選擇合適的任務使用這些資源。在Hadoop中,任務調度器是一個可插拔的模塊,用戶可以根據自己的需要設計相應的調度器。 -
TaskTracker
?
TaskTracker 會周期性地通過Heartbeat 將本節點上資源的使用情況和任務的運行進度匯報給JobTracker,同時接收JobTracker 發送過來的命令并執行相應的操作(如啟動新任務、殺死任務等)。TaskTracker 使用"slot"等量劃分本節點上的資源量。"slot"代表計算資源(CPU、內存等)。一個Task 獲取到一個slot 后才有機會運行,而Hadoop 調度器的作用就是將各個TaskTracker 上的空閑slot分配給Task 使用。slot分為Map slot 和Reduce slot 兩種,分別供Map Task 和Reduce Task 使用。TaskTracker 通過slot 數目(可配置參數)限定Task 的并發度。
-Task
Task 分為Map Task 和Reduce Task 兩種,均由TaskTracker 啟動。HDFS 以固定大小的block 為基本單位存儲數據,而對于MapReduce 而言,其處理單位是split。split 是一個邏輯概念,它只包含一些元數據信息,比如數據起始位置、數據長度、數據所在節點等。它的劃分方法完全由用戶自己決定。但需要注意的是,split 的多少決定了Map Task 的數目,因為每個split 只會交給一個Map Task 處理。image.png
MapReduce編程
通過wordcount詞頻統計分析案例入門。
這個程序能夠計算一個文本中相同單詞出現的次數。
我們在之前演示用Java API操作HDFS的項目上編寫代碼。具體代碼及解釋如下
開發完成后
編譯:mvn clean package -DskipTests上傳到服務器然后運行(根據自己上傳的路徑進行命令參數的調整)
hadoop jar /root/hadoop/lib/hadoop-train-1.0.jar WordCountApp hdfs://192.168.30.130:9020/hello.txt hdfs://192.168.30.130:9020/output/wc運行完畢后可在輸出文件中查看統計的結果(親測可以成功)
注意:
相同的代碼和腳本再次執行,會報錯
在MR中,輸出文件是不能事先存在的。有兩種解決方式
1)先手工通過shell的方式將輸出文件夾先刪除hadoop fs -rm -r /output/wc 2) 在代碼中完成自動刪除功能: 推薦大家使用這種方式Path outputPath = new Path(args[1]);FileSystem fileSystem = FileSystem.get(configuration);if(fileSystem.exists(outputPath)){fileSystem.delete(outputPath, true);System.out.println("output file exists, but is has deleted");}Spark簡單入門
Spark概述
MapReduce框架局限性
- 僅支持Map和Reduce兩種操作,提供給用戶的只有這兩種操作
- 處理效率低效:Map中間結果寫磁盤,Reduce寫HDFS,多個MR之間通過HDFS交換數據
- 任務調度和啟動開銷大:mr的啟動開銷一,客戶端需要把應用程序提交給resourcesManager,resourcesManager去選擇節點去運行,快的話幾秒鐘,慢的話1分鐘左右,開銷二,maptask和reducetask的啟動,當他倆被resourcesManager調度的時候,會先啟動一個container進程,然后讓他倆運行起來,每一個task都要經歷jvm的啟動,銷毀等,這兩點就是mr啟動開銷
- 無法充分利用內存
- Map端和Reduce端均需要排序:map和Reduce是都需要進行排序的,但是有的程序完全不需要排序(比如求最大值求最小值,聚合等),所以就造成了性能的低效
- 不適合迭代計算(如機器學習、圖計算等),交互式處理(數據挖掘)和流式處理(點擊日志分析):因為任務調度和啟動開銷大,所以不適合交互式處理,比如你啟動要一分鐘,任務調度要幾分鐘,我得等半天,這不適合
- MapReduce編程不夠靈活:map和reduce輸入輸出類型格式限制死了,可嘗試scala函數式編程語言
- MapReduce采用了多進程模型,而Spark采用了多線程模型:運行更快,更加節約資源。
Spark特點
- 高效(比MapReduce快10~100倍)
- 內存計算引擎,提供Cache機制來支持需要反復迭代計算或者多次數據共享,減少數據讀取的IO開銷;DAG引擎,這種引擎的特點是,不同任務之間互相依賴,減少多次計算之間中間結果寫到HDFS的開銷;使用多線程池模型來減少task啟動開稍(特指MR中每個task都要經歷JVM啟動運行銷毀操作,Spark的做法是,啟動一些常駐的進程,在進程內部會有多個線程去計算task,來一個task,計算task,并回收線程,以此循環,這樣就沒有JVM的開銷),shuffle過程中避免不必要的sort操作以及減少磁盤IO操作
- 易用:提供了豐富的API,支持Java,Scala,Python和R四種語言
代碼量比MapReduce少2~5倍 - 與Hadoop集成:讀寫HDFS/Hbase與YARN集成
環境搭建
//在安裝之前先要安裝maven和scala環境。由于在之前本人虛擬機上已經安裝了maven所以跳過maven的安裝。 // 解壓scala安裝包 tar -zxvf scala-2.11.8.tgz -C ../apps/ //配置環境變量 pwd //查看路徑/root/apps/scala-2.11.8 vi ~/.bash.profile //添加配置 export SCALA_HOME=/root/apps/scala-2.11.8 export PATH=$SCALA_HOME/bin:$PATH //使配置生效 source ~/.bash.profile //檢驗是否安裝成功 scala -version //出現以下信息,說明安裝成功 Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL//解壓spark tar -zxvf spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz -C ../apps //進入安裝目錄的bin目錄,通過spark-shell可運行spark //若不熟悉命令,可用以下方式 ./spark-shell --help --master MASTER_URL spark://host:port, mesos://host:port, yarn, or local. //表示在本地以兩個線程啟動 ./spark-shell --master local[2] local:默認一個線程 local[n]:n個線程 local[*]:全部線程Spark編程
這里重新實現在上文實現的wordcount程序,代碼如下
sc.textFile("file://root/data/hello.txt").flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_ + _).collect沒有看錯,只是一行代碼。因為Spark封裝了很多方便的函數,相比于MapReduce開發更為方便。這也是它成為主流的原因。
Hadoop整合Spring-boot的使用
Spring Hadoop概述
Spring for hadoop提供了統一的配置模式以簡化Apache Hadoop的開發,并也易于調用HDFS、Mapreduce、Pig和Hive的API。它還提供了與Spring生態圈的其他項目集成的能力,例如Spring Intergration 和Spring Batch,讓你可以優雅地開發大數據的提取/導出和Hadoop工作流項目。
Spring Hadoop開發環境搭建及訪問HDFS
第一步加入依賴
<properties><java.version>1.8</java.version><hadoop.version>2.6.0-cdh5.7.0</hadoop.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>${hadoop.version}</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-hadoop-boot</artifactId><version>2.5.0.RELEASE</version></dependency></dependencies><!--配置下載的倉庫--><repositories><repository><id>cloudera</id><url>http://repository.cloudera.com/artifactory/cloudera-repos/</url></repository></repositories>在配置文件中配置HDFS地址
spring:hadoop:fs-uri: hdfs://192.168.30.130:8092在代碼中訪問HDFS
import org.apache.hadoop.fs.FileStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.data.hadoop.fs.FsShell; import org.springframework.stereotype.Component;/*** Spring Boot操作HDFS* @author zhiying.dong 2019/04/13 16:32*/ @Component public class SpringBootHadoopTest implements CommandLineRunner {//自動注入FsShell,其中封裝了HDFS的訪問函數@Autowiredprivate FsShell fsShell;@Overridepublic void run(String... strings) throws Exception {System.out.println("=========run start============");//獲取根目錄下的文件列表for (FileStatus fileStatus : fsShell.lsr("/")) {System.out.println(">" + fileStatus.getPath());}System.out.println("===========run end===========");} }執行代碼后發現沒有權限訪問HDFS,本人解決的方式為在項目啟動時模擬用戶,網上有多種解決方式,可自行選擇
VM options: -DHADOOP_USER_NAME=虛擬機用戶名總結
大數據已經涉及到生活的方方面面,所以學習和了解大數據知識是很有必要的。Hadoop生態系統為大數據提供了開源的分布式存儲和分布式計算的平臺,而這一章只是對其中基礎的知識進行了入門,后續還需要深入的學習。
作者:董二彎
鏈接:https://www.jianshu.com/p/10700514e3e0
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
總結
以上是生活随笔為你收集整理的大数据入门(Hadoop生态系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nucleus学习
- 下一篇: oracle11g exp 00028,