hadoop平臺搭建入門

學習hadoop平臺搭建也有一段時間了,期間也遇到很多問題,為了解決這些問題查了很多資料,浪費不少時間,今天寫下這篇博客,為了幫助初學者,更快解決遇到的問題。

首先,我們要搭建的是完全分布式,mysql作為hive元數(shù)據(jù)庫,spark完全分布式,如果有需要會更新hadoop HA,這個等下次再說,這次需要用到的軟件有 hadoop-2.7.5.tar,jdk-8u151-linux-x64.tar,apache-hive-2.1.1-bin.tar,mysql-connector-java-6.0.6.tar,spark-2.0.2-bin-hadoop2.7,我會把這些軟件放到百度云里分享給大家,大家可以到文章結尾查找。

現(xiàn)在開始部署環(huán)境我用到的系統(tǒng)是ubuntu-16.04.3-desktop-amd64,我也會放在最后的百度云里,這次會用到三臺虛擬機分別為:

master 192.168.0.1 namenode secondarynamenode? resourcemanager hive?

slave1 192.168.0.2 datanode nodemanager worker

slave2 192.168.0.3?datanode nodemanager worker

修改主機名的命令為:sudo vi /etc/hosts,將上面內(nèi)容粘貼進去即可,可以用scp /etc/hosts x@slave1:/etc 發(fā)送到其他的電腦,但要注意修改hosts文件需要有權限,如果你的用戶沒有權限,可以自己一臺一臺的用sudo vi /etc/hosts修改。

修改完主機名之后需要重啟才能生效,重啟之后就要給虛擬機上傳軟件了,如果你用的crt連接虛擬機的話,可以用rz上傳文件,如果沒有安裝,可以用 sudo apt install lrzsz 安裝, 如果沒有crt,也可以用ftp上傳,我用的是FlashFTP,這些軟件一會也會分享給大家。

上傳完之后,開始解壓這些軟件,用到的命令是 tar zxvf XXX -C ~ ,這里我喜歡直接解壓到家目錄里,~

代表家目錄。

XXX:為文件名

這是tar命令常用到的參數(shù):

-z:有gzip屬性的??gz

-j:有bz2屬性的?? bz2

-J?:有xz屬性的?? xz

-v:顯示所有過程

-c: 建立壓縮檔案

-x:解壓

-C 指定輸出路徑

解壓完要修改環(huán)境變量這是我的環(huán)境變量命令是:sudo vi /etc/profile,按G到最后一行,添加你的環(huán)境變量,因為我文件都解壓到root的家目錄里所以HOOM都在root里,修改完同樣用命令 scp /etc/profile X@slavex 傳給別的虛擬機。


查看java的環(huán)境變量有沒有設置好可以用命令java查看,如果設置好會出現(xiàn):


下面開始修改hadoop文件,進入到hadoop目錄下,hadoop的配置文件為etc/hadoop,進入會看到很多配置文件,我們需要配置的只有5個分別為 core-site.xml,haoop-env.sh,hdfs-site.xml,mapred-site.xml(這個文件默認為mapred-site.xml.template 需要改名為mapred-site.xml),yarn-site.xml,slaves,配置這幾個文件的時候我查找了許多大神的博客,但配置項實在是太多了,后來經(jīng)過很多次的調(diào)試,我找的了一個最簡化的配置項。

首先配置core-site.xml文件

fs.default.name也可以寫為fs.defaultFS,后面的應該是比較新的版本寫法但意思一樣,這個配置項是配置namenode的9000是它的端口,

hadoop.tmp.dir 是配置他的臨時文件存放地址,如果不配置的話他默認存放在/tmp下,如果重啟虛擬機的話,這個目錄會清空,導致hadoop無法正常啟動。所以一般把這個目錄配置到hadoop目錄下,如果多次格式化hadoop的時候可能會導致namendoe id 和datanode id 不一致。后面我會詳細講解這個問題。

haoop-env.sh

這個文件需要修改你的JAVA_HOME,找到這一行把#去掉,然后修改路徑


hdfs-site.xml 這個配置項是用來配置DataNode個數(shù),在這次配置中我們有一個namenode,和兩個datanode,所以dfs.replication配置項應該為2。


mapreduce-site.xml

這個文件里,只有一個必須的配置項,但為了給大家拓展一下,我會寫出兩個不是必要的配置項。

必要:


這個配置項指定使用yarn運行mapreduce程序,yarn是hadoop2版本才使用的資源管理框架,負責集群資源管理和調(diào)度。Hadoop 1.0資源管理由兩部分組成:資源表示模型和資源分配模型,想詳細了解的同學可以自行百度。

不是必要的:

<property>

<name>dfs.name.dir</name>

<value>xxx</value>

</property>

這個參數(shù)用于確定將HDFS文件系統(tǒng)的元信息保存在什么目錄下。

如果這個參數(shù)設置為多個目錄,那么這些目錄下都保存著元信息的多個備份。

<property>

<name>dfs.data.dir</name>

<value>xxx<value>

</property>

這個參數(shù)用于確定將HDFS文件系統(tǒng)的數(shù)據(jù)保存在什么目錄下。

我們可以將這個參數(shù)設置為多個分區(qū)上目錄,即可將HDFS建立在不同分區(qū)上。

重點

yarn-site.xml?

這個文件配置項很多,而且都很重要,如果涉及到調(diào)優(yōu)的話,一般都會涉及到這個文件的內(nèi)容。


master為我的namenode主機名

下面我來解釋一下這三個配置項的意思:

yarn.resourcemanager.address

參數(shù)解釋:ResourceManager 對客戶端暴露的地址。客戶端通過該地址向RM提交應用程序,殺死應用程序等。

yarn.resourcemanager.scheduler.address

參數(shù)解釋:ResourceManager對ApplicationMaster暴露的訪問地址。ApplicationMaster通過該地址向RM申請資源、釋放資源等。

yarn.resourcemanager.resource-tracker.address

參數(shù)解釋:ResourceManager對NodeManager暴露的地址.。NodeManager通過該地址向RM匯報心跳,領取任務等。

這三個參數(shù)在偽分布式時可以不用配置,但在完全分布式中,如果不配置,yarn進程會正常啟動,但執(zhí)行任務時會卡主。一會我會詳細講解這個問題。


yarn.nodemanager.resource.memory-mb

【存疑】

表示該節(jié)點上YARN可使用的物理內(nèi)存總量,默認是8192(MB),注意,如果你的節(jié)點內(nèi)存資源不夠8GB,則需要調(diào)減小這個值,而YARN不會智能的探測節(jié)點的物理內(nèi)存總量,這個參數(shù)另一種說法是,該參數(shù)的默認值是8192MB,即使你的機器內(nèi)存不夠8192MB,YARN也會按照這些內(nèi)存來使用,對于這兩種說法,我比較認可第二種,因為我以前都是用2G內(nèi)存搭建的平臺,這個參數(shù)都是默認,但一直正常運行,不用修改。

講到這我想給大家擴展一下yarn框架

ResourceManager做的事情是負責協(xié)調(diào)集群上計算資源的分配。調(diào)度、啟動每一個 Job 所屬的 ApplicationMaster、另外監(jiān)控 ApplicationMaster 的存在情況。

NodeManager 功能比較專一,根據(jù)要求啟動和監(jiān)視集群中機器的計算容器container。負責 Container 狀態(tài)的維護,并向 RM 保持心跳匯報該節(jié)點資源使用情況。

ApplicationMaster 負責一個 Job 生命周期內(nèi)的所有工作。注意每一個Job都有一個 ApplicationMaster。它和MapReduce任務一樣在容器中運行。AM通過與RM交互獲取資源,然后然后通過與NM交互,啟動計算任務。

容器是由ResourceManager進行統(tǒng)一管理和分配的。有兩類container:一類是AM運行需要的container;另一類是AP為執(zhí)行任務向RM申請的。

Container是YARN中的資源抽象,它封裝了某個節(jié)點上的多維度資源,如內(nèi)存、CPU、磁盤、網(wǎng)絡等,當AM向RM申請資源時,RM為AM返回的資源便是用Container表示的。

這只是對yarn初步的理解,在此需要注意的是,cotainer是一個抽象的理解。

yarn.nodemanager.vmem-pmem-ratio

任務每使用1MB物理內(nèi)存,最多可使用虛擬內(nèi)存量,默認是2.1,因為開始運行任務的時候,會先檢查分配給他的資源,如果需要的虛擬內(nèi)存小于分配給他的虛擬內(nèi)存任務會失敗,如果不想讓他運行時檢查虛擬內(nèi)存,可以通過下一個參數(shù)關閉檢測,并不會影響任務運行。

yarn.nodemanager.vmem-check-enabled

是否啟用一個線程檢查每個任務證使用的虛擬內(nèi)存量,如果任務超出了分配值,則直接將其kill,默認是true,修改是將參數(shù)改為 false。


最后一個文件 slaves

在這個文件里添加上,你的datanode節(jié)點的主機名。

修改完配置文件就可以下發(fā)hadoop文件到slave節(jié)點用到的命令是:scp -r [hadoop-版本] [用戶名]@[主機名]:~

發(fā)送到slave主機的用戶的家目錄。

將hadoop文件下發(fā)到slave文件之后就可以格式化文件系統(tǒng)了,在此,我用一張圖來描述linux文件系統(tǒng)和hdfs文件系統(tǒng)的區(qū)別。


需要注意的是 hadoop1 版本的默認hdfs塊大小為64M,而Hadoop2默認的塊大小為128M。

hdfs文件系統(tǒng)的特點

HDFS優(yōu)點:

高容錯性:數(shù)據(jù)自動保存多個副本,副本丟失后,自動恢復

適合批處理:移動計算而飛數(shù)據(jù)。數(shù)據(jù)位置暴露給計算框架

適合大數(shù)據(jù)處理:GB,TB,設置PB級數(shù)據(jù)。百萬規(guī)模以上文件數(shù)量。10K+節(jié)點規(guī)模。

流式文件訪問:一次性寫入,多次讀取。保證數(shù)據(jù)一致性。

可構建在廉價機器上:通過多副本提高可靠性。提供容錯和恢復機制。

HDFS缺點:

不適合低延遲數(shù)據(jù)訪問場景:比如毫秒級,低延遲與高吞吐率。

不適合小文件存取場景:占用NameNode大量內(nèi)存。尋道時間超過讀取時間。

不適合并發(fā)寫入,文件隨機修改場景:一個文件只能有一個寫者。僅支持append。

hdfs文件系統(tǒng)在存儲文件的流程是,client客戶端向namenode發(fā)送存儲請求,namenode檢查路徑是否可以存儲,如果可以回復請求,client客戶端將文件分為128M一個塊的文件(如果文件小于128M占一個塊,但存儲在分布式系統(tǒng)上是它實際大?。热缫粋€257M的文件,client會把它且分為2個128M的文件和1個1M的文件,當寫完一份文件后,datanode會將這份文件復制到其他的節(jié)點上面,默認是存放三份,HDFS文件系統(tǒng)主要是用來處理大量數(shù)據(jù)時使用,增大他的數(shù)據(jù)塊容量有利于文件塊的定位,但也不是越大越好,如果有大量的小數(shù)據(jù)存入到HDFS系統(tǒng)中,因為數(shù)據(jù)的元數(shù)據(jù)都存放在datanode中,因此,HDFS所能存儲的文件數(shù)量會受到namenode內(nèi)存的限制。

拓展

namenode 作用,運行原理

NameNode主要是用來保存HDFS的元數(shù)據(jù)信息,比如命名空間信息,塊信息等。當它運行的時候,這些信息是存在內(nèi)存中的。但是這些信息也可以持久化到磁盤上。

在此引出secondary namenode 的概念,初次聽到這個詞可能很多人以為這是namenode的備份,其實不然,這里就要講一下namenode的工作原理:

namenode主要由兩個文件組成fsimage,edit logs 。當“寫請求”到來時namenode會首先寫editlog到磁盤,即向edits文件中寫日志,成功返回后,才會修改內(nèi)存,并且向客戶端返回。只有在NameNode重啟時,edit logs才會合并到fsimage文件中,從而得到一個文件系統(tǒng)的最新快照。但是在產(chǎn)品集群中NameNode是很少重啟的,這也意味著當NameNode運行了很長時間后,edit logs文件會變得很大。在這種情況下就會出現(xiàn)下面一些問題:

edit logs文件會變的很大,怎么去管理這個文件是一個挑戰(zhàn)。

NameNode的重啟會花費很長時間,因為有很多改動[筆者注:在edit logs中]要合并到fsimage文件上。

如果NameNode掛掉了,那我們就丟失了很多改動因為此時的fsimage文件非常舊](此處摘自hadoop的NAMENODE的管理機制,工作機制和DATANODE的工作原理 - CSDN博客 想詳細了解可以去看看)



因此為了克服這個問題,我們需要一個易于管理的機制來幫助我們減小edit logs文件的大小和得到一個最新的fsimage文件,這樣也會減小在NameNode上的壓力。

SecondaryNameNode就是來幫助解決上述問題的,它的職責是合并NameNode的edit logs到fsimage文件中。


上面的圖片展示了Secondary NameNode是怎么工作的。

首先,它定時到NameNode去獲取edit logs,并更新到fsimage上。[筆者注:Secondary NameNode自己的fsimage]

一旦它有了新的fsimage文件,它將其拷貝回NameNode中。

NameNode在下次重啟時會使用這個新的fsimage文件,從而減少重啟的時間。總之我理解的secondary name是用來幫助namenode處理元數(shù)據(jù)的更新。

好,講解完namenode,secondary namenode開始重回搭建平臺的話題,上回說到修改完配置文件,開始格式化文件系統(tǒng)命令為:hdfs namenode -format 或者hadoop namenode -format 成功后會顯示


成功格式化后,就可以啟動你的進程了。

start-dfs.sh的作用在于啟動主節(jié)點的namenode,啟動secondnamenode,以及各從節(jié)點的datanode進程。

stop-dfs.sh的作用在于關閉主節(jié)點的namenode,啟動secondnamenode,以及各從節(jié)點的datanode進程。

啟動完進程,可以用命令:jps 查看

我的namenode節(jié)點:bootstrap不是我啟動的,他是一個前端框架。


我的datanode節(jié)點


start-yarn.sh 啟動yarn?

namenode節(jié)點


datanode節(jié)點: org 那個不是


啟動完進程就可以測試一下搭建的環(huán)境首先建一個文件a.txt,在里面隨便寫上一些內(nèi)容


然后上傳文件到hdfs系統(tǒng)上,命令hadoop fs -put a.txt? /? 上傳a.txt 到hdfs的根目錄,然后開始我們第一個wordcount 程序,hadoop jar xxx(你的hadoop路徑)/share/hadoop/mapreduce/hadoop-mapreduce-examples-xxx(你的hadoop版本).jar wordcount ? ? /a.txt(輸入路徑 我把a.txt 放在根下) ?? /output(輸出路徑這里我放在根下的output目錄中),這是我的運行命令:注意輸出目錄必須是之前不存在的

,

運行完之后,檢查一下輸出的結果:hadoop fs -cat /output/part-00000


成功,這是最簡單的wordcount,用到的是hadoop自帶的一個jar包,以后根據(jù)不同的需求,需要自己寫wordcount程序,基本會用java或者python寫,都有自己的框架,學習起來也不算太難。

在這里我放上基本的一些hadoop命令:

復制?hadoop fs -cp /tmp/input/hadoop1/hadoop/*.* /tmp/input/hadoop

本地文件上傳到hdfs上?hadoop fs -put /tmp/input/hadoop1/hadoop/*.* /tmp/input/hadoop

從hdfs上下載文件??hadoop fs -get /tmp/input/hadoop1/hadoop/*.* /tmp/input/hadoop

查看文件列表 ?hadoop fs -ls /tmp/input/hadoop1/hadoop/

這些是最基本的命令,hadoop 的命令和linux 差別不大,學會linux即可掌握這些命令。

測試完之后,hadoop搭建基本完成,我們開始搭建hive,首先來簡單介紹一下hive:

Hive是一個數(shù)據(jù)倉庫基礎工具在Hadoop中用來處理結構化數(shù)據(jù)。它架構在Hadoop之上,總歸為大數(shù)據(jù),并使得查詢和分析方便。并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務進行運行。

搭建hive,我們用到了mysql作為元數(shù)據(jù)庫,在ubuntu中可以使用命令:sudo apt install mysql-client mysql-server 安裝mysql,安裝完之后會出現(xiàn)配置界面讓你輸入root用戶密碼,輸入完成,再輸入一遍密碼,配置完成。

賦給hive用戶權限,在這里給hive登錄的用戶名為hive密碼也是hive。

1.進入mysql,我給mysql,root用戶密碼為123456,mysql-uroot -p,登錄成功。

2.grant all on *.* to hive@'%' identified by 'hive'? 這里賦予權限還有幾種遠程登錄,感興趣的可以去看一下。

3.配置完權限,需要用命令 flush privileges 刷新一下權限,然后退出。

4.修改hive配置項,進入$HIVE_HOME/conf,首先修改hive-site.xml.temp,改名為hive-site.xml,然后找到里面的HADOOP_HOME 刪掉前面的#,修改后面的路徑為你的hadoop目錄,然后新建文件hive-site.xml,添加配置項


修改這個配置文件有點小技巧,可以去hive-default.xml.template文件中粘貼這些配置項,然后修改。

修改完之后進入$HIVE_HOME/lib 拷貝jline-2.1.2(可能和我的版本不一樣) ,到$HADOOP_HOME/share/hadoop/yarn/lib


這時還有一個mysql和hive連接的驅(qū)動 mysql-connector-java-5.1.45.tar(最好別用太高版本,這個文件我也會上傳),將這個文件放到$HIVE_HOME/lib中


進入$HIVE_HOME/bin,執(zhí)行./schematool -initSchema -dbType mysql ,初始化元數(shù)據(jù)庫,如果出現(xiàn)初始化失敗,首先檢查配置文件有沒有出錯,如果配置文件沒有問題,那就可能要修改mysql的綁定ip,修改 /etc/mysql/mysql.conf.d/mysqld.cnf,找到里面的bind-address 默認為127.0.0.1 修改為0.0.0.0,此時在重新初始化。



初始化完成之后,進入$HIVE_HOME/sbin目錄下,執(zhí)行./hive ,啟動hive。

有些任務可能涉及到將查詢到的結果輸出到控制臺或者重定向到某個文檔內(nèi) 可以使用hive -e "xxxx"

重定向 hive -e "xxx" >>xx.txt,還有大量數(shù)據(jù)在hive和hdfs互導時會用到sqoop,感興趣的可以去看一下。

spark 分布式搭建

我用的軟件版本是spark-2.0.2-bin-hadoop2.7,解壓完軟件包之后,進入conf目錄,將slaves.template改名為slaves,

添加slave主機名,修改spark-env.sh.template為spark-env.sh,添加配置項


spark_master_ip 為namenode的 ip

下發(fā)spark到datanode節(jié)點,下發(fā)完成后,進入$SPARK_HOME/sbin,執(zhí)行start-all.sh,啟動spark進程,看到namenode上有master,datanode上有worker就說明正常啟動了。


遇到的問題

在剛開始搭建平臺的時候,遇到過很多問題,但問題解決后都沒有記下來,現(xiàn)在只能一點一點回去找,所以暫時更新到這里,后續(xù)會添加上這一塊。

未完待續(xù).....

資源

hadoop 搭建資源

密碼:5dct

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 終極算法 關注微信號每天收聽我們的消息終極算法為您推送精品閱讀 前言 Hadoop 在大數(shù)據(jù)技術體系中的地位至關...
    Yespon閱讀 131,079評論 12 168
  • Zookeeper用于集群主備切換。 YARN讓集群具備更好的擴展性。 Spark沒有存儲能力。 Spark的Ma...
    Yobhel閱讀 7,597評論 0 34
  • 這是Ruifree的平臺分享的第10篇原創(chuàng)文章。 也許經(jīng)歷過生死才會對生命心存感激,會想要去更多地了解生命的本真,...
    空山歆語閱讀 346評論 0 0
  • Error通常是由于物理環(huán)境引起的,也就是說運行的環(huán)境的異常 而Exception是我們變成人員,編碼過程中,考慮...
    夢境中_i閱讀 256評論 0 0
  • 猴年,就要結束了,12年就來一次。上一個猴年,2004,再上一個1992,似乎每個年份都不太順。 回顧一下...
    155守時待命閱讀 240評論 0 0

友情鏈接更多精彩內(nèi)容