轉帖|行業資訊|編輯:陳俊吉|2016-08-03 09:25:19.000|閱讀 297 次
概述:所謂大數據,是指數據量龐大、產生數度快、結構多樣的價值密度低的數據。其中,數據量龐大是指數據規模超出了1,2臺高性能主機所能處理范圍;結構多樣性是指除了關系型數據庫能夠處理的結構化數據還包含半結構化數據
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
開篇概述
隨著計算機網絡基礎設施的完善,社交網絡和電商的發展以及物連網的推進,產生了越來越多的,使得人工智能最近幾年也有了長足的發展(可供機器學習的樣本數據量足夠大了),的存儲和處理也越來越重要,國家對此也比較重視(可上網搜索關鍵字“大數據白皮書”關鍵字,以了解詳細情況),會長決定和年輕人也一塊兒學習一下,于是報了網易云課堂的課程,不定時將學習到的東西整理為博客,此乃開篇。
學習大數據必先學習,因為它是目前世界上最流行的分布式數據處理框架。
Tips:所謂,是指數據量龐大、產生數度快、結構多樣的價值密度低的數據。其中,數據量龐大是指數據規模超出了1,2臺高性能主機所能處理范圍;結構多樣性是指除了關系型數據庫能夠處理的結構化數據還包含半結構化數據(如各類傳感設備必如地鎊、衛星、GPS設備等產生的純文本格式的數據,還有良心網站NASA官網公布的txt格式的空間天氣數據等成行成列的數據)和非結構化數據(視頻、圖像等)。這些數據的價值密度普遍較低(和具體的應用范圍也有關系,比如NASA的數據,如果想知道某天的太陽射電情況,看當天發布的txt就好了,價值密度很高,但是這就不算大數據了,因為需要采集的數據量很小;如果想知道過去N年太陽射電的極值就需要處理很多數據,這些數據的價值密度就低了),大數據處理的目的就是從價值密度的數據里把有價值的數據過濾分析出來。
Hadoop概述
Hadoop是一個用于分布式大數據處理的編程框架。同時它也是個大數據處理完整的生態系統,圍繞著Hadoop,這個生態系統還包括但不限于:
HBase
Hive
Pig
Spark
ZooKeeper
希望本系列的寫作能夠堅持下去,對上述內容都有所涉及吧。
Hadoop能干什么
假設老王在某不知名IT公司工作,由于最近太陽活動異常,引起了領導的外甥的讀碩士的同學的關注,領導讓老王把山西鐵島太陽射電望遠鏡觀測到的近30年的太陽射電數據下載下來,讓老王從里面找到最高的記錄。老王畢竟搞挨踢已有多年,雖然技術不行,終日碌碌無為,但多年的直覺告訴老王這個很簡單。老王立刻下載了其中一個文件并大致看了文件的機構:數據保存在txt文件里,每行N列,其中包含了時間和數據信息列,大約每0.1s記錄一條數據,一個文件記錄15分鐘的數據,大約有9000條記錄,1個小時4個文件,1天96個文件,30年大約1051200個文件,一共大約100億條數據,這其中還有一些損壞的文件,還有一些用9999表示的未檢測到值的占位數據需要特殊照顧。
老王覺得單機處理這些數據耗時太久,于是老王找來一些公司淘汰下來的舊服務器(一般小公司最破的機器都是服務器),準備每個機器負責一部分,最后把結果匯總,老王在開發的過程中還是遇到了很多問題,比如,如何分配任務,有的機器破,有的機器新,還有的文件大,有的文件小,總是不能保證所有的任務一起完成,先完成任務的機器閑置浪費掉了資源;還有最后把結果通過網絡通信匯總起來,如何保證數據不丟失,不覆蓋;還有如果某臺機器出了問題,如何重新分配任務,這些非核心業務的開發使得老王心力憔悴,還好,老王最后找到了Hadoop這個工具,這個工具給老王提供了一個簡單的編程模型,老王在map方法中寫了分配的任務的邏輯,在reduce方法中寫了合并結果的邏輯,然后Hadoop幫老王完成了其他所有事情,Hadoop就是干這個的。以上故事純屬虛構,如有雷同,實屬巧合。
其實上述意淫的例子里的數據量不是很大,如果每天產生上TB級別的數據,就算是速度很快的固態硬盤也需要小時級時間才能讀取一遍,速度還是遠遠跟不上,終歸有上限,而且高性能主機價格不菲,不如把數據分開放到一個相對廉價又可擴展的計算機集群中,每個節點上運行一段程序并處理一小塊數據,然后在匯總處理結果,使用Hadoop可以讓開發者不必把精力放在集群的建設上,采用Hadoop提供的簡單的編程模型就可以實現分布式處理。
Hadoop的構造模塊
Hadoop集群中運行的守護進程共有5類:
NameNode
DataNode
Secondary NameNode
JobTracker
TaskTracker
Hadoop集群中的機器(節點)分為2類:主節點和從節點,NameNode、JobTracker所在節點為主節點(負責管理),DataNode和TaskTracker所在節點為從節點(負責干活兒)。
NameNode
NameNode節點負責將一個文件分成若干文件塊,并記錄了HDFS文件系統中的文件塊放了在哪些DataNode中(一個數據塊被冗余地放到1個或多個DataNode節點中),一個集群中只有一個NameNode節點(Hadoop2.X中情況有所不同了),且該節點通常不再運行DataNode和TaskTracker守護進程。
DataNode
DataNode實際管理很多NameNode分配給它的很多數據塊,當有文件塊變動時會通知NameNode,同時也從NameNode接受指令。一個集群中有多個DataNode節點,DataNode之間也會保持聯系,復制冗余文件塊,這樣當一個DataNode出現故障后不會影響到文件的完整性。
Secondary NameNode
SNN只與NameNode通信,定時獲取HDFS元數據的快照,一個集群只有一個SNN,且SNN所在節點只運行SNN守護進程,不干其它的事情。當NameNode出現故障后,可以人工啟用SNN作為NameNode。
JobTracker
JobTracker負責分配MapReduce任務給TaskTracker,負責監控任務的執行,如任務失敗后重啟任務。JobTracker守護進程運行在主節點上,通常該節點不運行DataNode和TaskTracker守護進程。
TaskTracker
TaskTracker負責完成JobTracker分配的任務并和JobTranker進行通信,回報情況。TaskTracker守護進程運行在多個子節點上
看圖說話
上圖中,NameNode和JobTracker是分開的,如果集群規模不大也可以運行在同一個節點上(如果這個節點出現故障該如何恢復?)
安裝Hadoop
在安裝Hadoop之前需要先安裝如下軟件:
JDK
ssh
sshd
ssh-kengen
我用的是Ubuntu16.04,已經預裝了ssh和ssh-kengen了,只需要安裝jdk和sshd,可以通過執行命令which命令來檢查是否安裝了某軟件,如which sshd安裝JDK8
下載壓縮包解壓即可:
sudo mkdir /usr/local/lib/jvm
sudo tar -zxv -f ~/setupFiles/jdk-8u101-linux-x64.tar.gz -C /usr/local/lib/jvm
配置環境變量:
修改 /etc/profile文件,追加:
export JAVA_HOME=/usr/local/lib/jvm/jdk1.8.0_101 export PATH=$JAVA_HOME/bin:$PATH
配置完畢后執行命令source /etc/profile,此刻通過echo $JAVA_HOME應該能看到剛才設置的了。
安裝sshd
sudo apt install openssh-server
安裝完了sshd后應該可以通過ssh lcoalhost命令遠程訪問了,但是需要輸入密碼,Hadoop集群節點間要進行通信需要配置為無密碼登錄方式。
無密碼ssh登錄設置
執行如下命令:
ssh-keygen -t rsacat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 0600 ~/.ssh/authorized_keys
其中,執行ssh-keygen命令時一路回車不要輸入密碼,執行完畢后會在/home/userName/.ssh路徑下生成公鑰和私鑰id_rsa和id_rsa.pub。如果一切順利的話,現在可以通過ssh localhost無密碼登錄了
安裝Hadoop
我下載的是1.0.4版本(2.X版本和1.X版本有著很大的差別,還是先學會1.X再看2.X吧,我們的課程也是以1.X為例的,事實上我剛才下的2.X,發現很多東西不懂,又退回1.X了,:-)),先把下載下來的壓縮包解壓到~/wiley/hadoop(其實最好放按照Linux的習慣放到/usr/local下,然后把hadoop目錄及里面的文件所屬用戶和所屬組改成當前用戶和當前用戶所屬組)
解壓后配置文件conf/hadoop-env.sh文件中的JAVA_HOME,反注釋如下行
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun,并且設置為相應的Java所在路徑。
Hadoop可以在三種模式下工作:
單節點模式
偽分布式模式
分布式模式
工作環境下是分布式模式,開發環境下可以使用單節點模式或偽分布式模式,方便調試。解壓后不做配置就是單節點模式,而偽分布式模式意思是指集群中的各個節點實際配置為同一臺機器。下面的步驟用來配置偽分布式模式:
配置conf/core-site.xml
配置conf/hdfs-site.xml
配置conf/mapred-site.xml
啟動Hadoop
在啟動之前先格式和HDFS文件系統:
cd ~/wiley/hadoop/bin ./hadoop namenode -format
然后啟動Hadoop:./start-all.sh,如果一切順利的話用jps命令查看會有5個進程(不包括jps本身):
此時可以打開兩個基于Web的界面
//localhost:50070 :HDFS的狀態
//localhost:50030 :MapReduce作業運行狀態
運行例子WordCount
文章的最后運行一個簡單的MapReduceJob:單詞統計。Hadoop中已經附有一些實例Java代碼,放在了hadoop/src/examples/org/apache/hadoop/examples,其中一個叫做WordCount.java,是用來統計文件中單詞數量的,代碼很簡單的,大家可以去看看。此處先運行一下這個例子感受一下,執行如下命令
mkdir test
mkdir test/classes
mkdir test/src
cp src/examples/org/apache/hadoop/examples/WordCount.java test/src
生成jar文件:
javac -classpath hadoop-core-1.0.4.jar:lib/commons-cli-1.2.jar -d test/classes test/src/WordCount.java
jar -cvf test/WordCount.jar -C test/classes/ .
運行該程序需要兩個參數(可參考源碼文件),一個是放置文本文件的input路徑,一個是輸出結果的output路徑,先在HDFS中創建之:
bin/hadoop dfs -mkdir input
在本地文件系統中創建一個文本文件test/f1.txt,寫入一句話:2b or not 2b is ff,把文件put到HDFS里:
bin/hadoop fs -put test/f1.txt /user/joey/input
激動人心的時刻到了:
bin/hadoop jar test/WordCount.jar org.apache.hadoop.examples.WordCount input output
由于input和output位于/user/joey下面,而/user/joey是默認的工作目錄,所有直接寫input和output,不用在前面加/user/joey/。現在看看運行結果:
詳情請咨詢!
客服熱線:023-66090381
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn