距離第一次接觸大數據已經快一年了,中間參加了爲期4個月左右的中國軟件杯,拿了個國家三等獎,還算是爲我時間的犧牲得到了一點回報。暑假到前半個月,一直在學JavaWeb,接觸了後臺之後對很多知識有了更深入的理解,同時也對大數據的應用有了更加清晰的認識。目前準備花一個月的時間將大數據相關的知識總結一下捋一下,然後再做一個推薦系統或者合適的大數據開發項目。最後就開始苦逼的備戰面試複習了。
如果你想入門大數據,對大數據的生態圈有一個比較全面的瞭解,我相信我的文章應該對你有所幫助,下面就帶你走進大數據(臭屌絲)的世界。
Hadoop吹牛逼的話我就不多介紹了,文章核心還是放在對於Hadoop的運用以及理解上面。
Apache Hadoop
Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。
用戶可以在不瞭解分佈式底層細節的情況下,開發分佈式程序。充分利用集羣的威力進行高速運算和存儲。
[1] Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統中的數據。
Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS爲海量的數據提供了存儲,而MapReduce則爲海量的數據提供了計算。 -----百度百科
說的挺高級挺牛逼的,其實的確也牛逼?。不得不佩服老外咋能搞出這玩意。Hadoop是05年出來的,誕生於谷歌三大論文GFS MapReduce BigTable ->Hdfs MapReduce Hbase。總之: Hadoop可以簡單認識爲可擴展的分佈式計算(大數據存儲分析網絡數據)
Hadoop的發展
Hadoop目前經歷了1.x、2.x、到現在的3.x我主要說一下1.x和2.x的區別吧,這兩個版本的區別算是比較明顯的。
Hadoop1.0和Hadoop2.0版本之間還是存在很大的差異的。
整體上,1.0版本是由分佈式存儲系統HDFS和分佈式計算框架MapReduce組成,其中HDFS由一個NameNode和多個DataNode組成,MapReduce由一個JobTracker和多個TaskTracker組成。
2.0版本中,引入HDFS Fedration,它讓多個NameNode分管不同的目錄進而實現訪問隔離和橫向拓展,同時解決了NameNode單點故障問題;引入資源管理框架Yarn,可以爲各類應用程序進行資源管理和調度。
Hadoop的案例
- 阿里 最開始 用的Hadoop-0.19.0 開始非常早
- 大數據經典案例 《啤酒與尿布》 -->百度去吧,懶得打字!?
Hadoop企業搭建核心架構
此圖也是我大數據複習階段的核心內容。
對於這裏面的部分框架我想做個簡單的說明,也是我自己的理解。
- Hive 大數據倉庫 方便開發人員對數據處理簡化寫MR的過程 底層任是MR
- Sqoop(SQLto Hadoop 數據轉換) oozie(任務調度) flume(文件收集 實時蒐集) hue(web工具) 大數據輔助框架
- Hbase 分佈式數據庫(一個表幾十億上百億 秒級別查詢) 就是一個數據庫 做到實時查詢 可以說是一個DBA的角色
- spark 數據處理框架 運行在yarn上處理Hdfs 不可替代Hadoop 必須看源碼 社區特別火 核心RDD
Hadoop核心模塊
- Hadoop Common
爲其他hadoop模塊提供基礎設施 - Hadoop Yarn
任務調度與資源管理框架 - Hadoop Hdfs
高可靠高吞吐量的分佈式文件系統 - Hadoop Mapreduce
分佈式離線並行計算框架
下面我按此順序一一介紹:
- Common是爲其他hadoop模塊提供基礎設施,一般情況沒人碰他吧,反正我沒碰過。
- Yarn 數據操作系統(雲操作系統)類似與Windows操作系統爲各個軟件提供服務 負責整個集羣管理調度監控(爲各種框架分配資源進行隔離Container 容器:將任務放入其中進行隔離)
架構圖
- ResourceManager:處理客戶端請求;啓動/監控ApplicationMaster;監控NodeManager;資源分配與調度
- ApplicationMaster:數據切分;爲應用程序申請資源,並分配給內部任務;任務監控與容錯
- NodeManager:單個節點上的資源管理;處理來自ResourceManager的命令;處理來自ApplicationMaster的命令
- Container:對任務運行環境的抽象,封裝了CPU、內存等多維資源以及環境變量、啓動命令等任務運行相關的信息
- HDFS 官方一點的說法是高可靠高吞吐量的分佈式文件系統。以流式數據訪問模式來存儲超大文件,運行於商用硬件集羣上,是管理網絡中跨多臺計算機存儲的文件系統。簡單的理解就是一個超級大硬盤,百度雲盤,360雲盤估計也是如此。
HDFS不適合用在:要求低時間延遲數據訪問的應用,存儲大量的小文件,多用戶寫入,任意修改文件。
值得一提的是:在HDFS上數據是以block的方式存儲的
HDFS數據塊:HDFS上的文件被劃分爲塊大小的多個分塊,作爲獨立的存儲單元,稱爲數據塊。默認64M.
如:128 M
200M
blk_0001:128M
blk_0002 : 72M
使用數據塊的好處是:
- 一個文件的大小可以大於網絡中任意一個磁盤的容量。文件的所有塊不需要存儲在同一個磁盤上,因此它們可以利用集羣上的任意一個磁盤進行存儲。
- 簡化了存儲子系統的設計,將存儲子系統控制單元設置爲塊,可簡化存儲管理,同時元數據就不需要和塊一同存儲,用一個單獨的系統就可以管理這些塊的元數據。
- 數據塊適合用於數據備份進而提供數據容錯能力和提高可用性。
上架構圖:
在這裏主要注意的是
- HDFS文件系統由三部分組成:Namenode(是存在內存當中的,本地磁盤也有他的備份
fsimage:鏡像文件edites:編輯日誌 ) Datanode Secondary Namenode(用來監控HDFS狀態的輔助後臺程序,每隔一段時間獲取HDFS元數據的快照)。 - 在HDFS上,文件是以塊保存的,默認存入三個副本。默認是在HDFS客戶端上放第一個副本,第二個副本放在與第一個不同且隨機的另外的選擇的機架中的節點上。第三個副本與第二個副本在同一個機架但是不同節點上。
- 數據的存取(數據流不經過namenode)僅僅通過Datanode,Namenode只是保存的一些元數據。
Mapreduce的核心思想是“分而治之”,學過分治法的應該很熟悉,比如他將一個10G的數據量分配(map)給10個CPU計算,最後將結果收集(reduce)到一起,這就是Mapreduce工作的基本流程。
Mapreduce原理
Map任務處理
1.1 讀取HDFS中的文件。每一行解析成一個<k,v>。每一個鍵值對調用一次map函數。
1.2 覆蓋map(),接收1.1產生的<k,v>,進行處理,轉換爲新的<k,v>輸出。
1.3 對1.2輸出的<k,v>進行分區。默認分爲一個區.
1.4 對不同分區中的數據進行排序(按照k)、分組。
1.5對分組後的數據進行歸約。
Reduce任務處理
2.1 多個map任務的輸出,按照不同的分區,通過網絡copy到不同的reduce節點上。
2.2 對多個map的輸出進行合併、排序。覆蓋reduce函數,接收的是分組後的數據,實現自己的業務邏輯,處理後,產生新的<k,v>輸出。
2.3 對reduce輸出的<k,v>寫到HDFS中。
基本內容介紹完了,接下來說說Hadoop到底怎麼玩?Hadoop有三種運行方式,單機模式,僞分佈式模式,分佈式模式,我們來一一學習。
Hadoop安裝與配置
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html 這個網站是權威我基本上也是看着這個來的。
Hadoop的運行需要java環境
- 安裝JDK,照着操作行了,沒什麼難點。
- rpm -qa|grep java
xxx yyy zzz爲你要卸載的插件,插件之間以空格隔開
rpm -e --nodeps xxx yyy zzz - rpm -ivh jdk-8u172-linux-x64.rpm
- vim /etc/profile
export JAVA_HOME=/usr/java/default
export PATH=PATH - source /etc/profile
- echo $JAVA_HOME
上傳Hadoop 解壓安裝
直接開始玩單節點
- $ mkdir input
- $ cp etc/hadoop/*.xml input
- $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output ‘dfs[a-z.]+’
- $ cat output/*
- bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount wcinput wcoutput
(經典案例 統計單詞個數)
僞分佈式
- 核心配置文件
這些都是需要我們修改的文件,我們一個一個來操作。 - core-site.xml
前者配置 dfs文件系統 指定了namenode運行的節點
後者配置文件臨時目錄 覆蓋到默認的目錄 - hdfs-site.xml
配置文件備份數 在此爲一份 因爲目前是僞分佈式 只有一個節點 - yarn-site.xml
前者配置 運行MapReduce
後者配置 yarn主機 - 修改mapred-site.xml
<configuration>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
設置MapReduce運行在yarn上
- 格式化hdfs文件系統
bin/hdfs namenode -format
注意:格式化確認輸入Y - 啓動Hadoop
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode - 啓動Yarn
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
注意
- 最好修改三個配置文件腳本 mapred-env.sh yarn-env.sh hadoop-env.sh
- 配置好JDK路徑 /usr/java/jdk1.8.0_91
- There are 0 datanode(s) running and no node(s) are excluded in this operation.
出現上述問題可能是格式化兩次hadoop,導致沒有datanode
解決辦法是:找到hadoop安裝目錄下 hadoop-2.4.1/data/dfs/data裏面的current文件夾刪除
然後從新執行一下 hadoop namenode -format
再使用start-dfs.sh和start-yarn.sh 重啓一下hadoop
用jps命令看一下就可以看見datanode已經啓動了
安裝常見問題解決
- bin/hdfs namenode -format
原因:core-site.xml 文件部分內容寫錯 或者主機名與ip的映射寫錯
- namenode啓動出錯
原因:自查日誌文件(logs)
結束
到此僞分佈式的基礎配置基本上就結束了,對於分佈式:多搞幾臺機器 修改DataNode個數 配置slave(指定DataNode)文件 配置hosts文件 ssh OK OK不? 反正我不想打字寫分佈式配置了。
其他配置
- Yarn上的歷史服務查看(日誌聚集)
修改yarn-site.xml
前者 啓動日誌聚集
後者 設計報廢時間
- 啓動yarn yarn historyserver 再重跑任務 ,最後訪問查看。
- 在sbin目錄下 ./mr-jobhistory-daemon.sh start historyserver
- 在sbin目錄下 ./mr-jobhistory-daemon.sh stop historyserver
-
hdfs垃圾回收
hdfs-site.xml
(寫成具體值否則出錯)
在垃圾箱中可以恢復文件 -
Secondarynamenode
-
分開啓動
-
一鍵啓動
start-all.sh(不推薦) -
需要配置ssh祕鑰
- cd ~
- ssh-keygen -t rsa
- ssh-copy-id master
- 測試
- ssh master
- exit
友情提醒
我的配置中用的是IP 沒有寫主機名master,訪問路徑啥的可能會出現問題,你參照着官網的內容,別一股腦照着全般了。
總結
關於Hadoop的學習,這僅僅是個入門,Hadoop核心的內容在後面幾篇文章裏面,此文主要給沒有基礎的朋友瞭解Hadoop以及簡單使用Hadoop。說實話,這篇文章排版有一點點的亂,後面有時間在一點點修訂補充吧。雖然時間挺緊張的,但是我感覺花個一倆小時總結也是挺主要的,這點時間成本還是挺值得。?