學習hadoop平臺搭建也有一段時間了,期間也遇到很多問題,為了解決這些問題查了很多資料,浪費不少時間,今天寫下這篇博客,為了幫助初學者,更快解決遇到的問題。
首先,我們要搭建的是完全分布式,mysql作為hive元數據庫,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,我會把這些軟件放到百度云里分享給大家,大家可以到文章結尾查找。
現在開始部署環境我用到的系統是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,將上面內容粘貼進去即可,可以用scp /etc/hosts x@slave1:/etc 發送到其他的電腦,但要注意修改hosts文件需要有權限,如果你的用戶沒有權限,可以自己一臺一臺的用sudo vi /etc/hosts修改。
修改完主機名之后需要重啟才能生效,重啟之后就要給虛擬機上傳軟件了,如果你用的crt連接虛擬機的話,可以用rz上傳文件,如果沒有安裝,可以用 sudo apt install lrzsz 安裝, 如果沒有crt,也可以用ftp上傳,我用的是FlashFTP,這些軟件一會也會分享給大家。
上傳完之后,開始解壓這些軟件,用到的命令是 tar zxvf XXX -C ~ ,這里我喜歡直接解壓到家目錄里,~
代表家目錄。
XXX:為文件名
這是tar命令常用到的參數:
-z:有gzip屬性的??gz
-j:有bz2屬性的?? bz2
-J?:有xz屬性的?? xz
-v:顯示所有過程
-c: 建立壓縮檔案
-x:解壓
-C 指定輸出路徑
解壓完要修改環境變量這是我的環境變量命令是:sudo vi /etc/profile,按G到最后一行,添加你的環境變量,因為我文件都解壓到root的家目錄里所以HOOM都在root里,修改完同樣用命令 scp /etc/profile X@slavex 傳給別的虛擬機。
查看java的環境變量有沒有設置好可以用命令java查看,如果設置好會出現:
下面開始修改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,配置這幾個文件的時候我查找了許多大神的博客,但配置項實在是太多了,后來經過很多次的調試,我找的了一個最簡化的配置項。
首先配置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個數,在這次配置中我們有一個namenode,和兩個datanode,所以dfs.replication配置項應該為2。
mapreduce-site.xml
這個文件里,只有一個必須的配置項,但為了給大家拓展一下,我會寫出兩個不是必要的配置項。
必要:
這個配置項指定使用yarn運行mapreduce程序,yarn是hadoop2版本才使用的資源管理框架,負責集群資源管理和調度。Hadoop 1.0資源管理由兩部分組成:資源表示模型和資源分配模型,想詳細了解的同學可以自行百度。
不是必要的:
<property>
<name>dfs.name.dir</name>
<value>xxx</value>
</property>
這個參數用于確定將HDFS文件系統的元信息保存在什么目錄下。
如果這個參數設置為多個目錄,那么這些目錄下都保存著元信息的多個備份。
<property>
<name>dfs.data.dir</name>
<value>xxx<value>
</property>
這個參數用于確定將HDFS文件系統的數據保存在什么目錄下。
我們可以將這個參數設置為多個分區上目錄,即可將HDFS建立在不同分區上。
重點
yarn-site.xml?
這個文件配置項很多,而且都很重要,如果涉及到調優的話,一般都會涉及到這個文件的內容。
下面我來解釋一下這三個配置項的意思:
yarn.resourcemanager.address
參數解釋:ResourceManager 對客戶端暴露的地址。客戶端通過該地址向RM提交應用程序,殺死應用程序等。
yarn.resourcemanager.scheduler.address
參數解釋:ResourceManager對ApplicationMaster暴露的訪問地址。ApplicationMaster通過該地址向RM申請資源、釋放資源等。
yarn.resourcemanager.resource-tracker.address
參數解釋:ResourceManager對NodeManager暴露的地址.。NodeManager通過該地址向RM匯報心跳,領取任務等。
這三個參數在偽分布式時可以不用配置,但在完全分布式中,如果不配置,yarn進程會正常啟動,但執行任務時會卡主。一會我會詳細講解這個問題。
yarn.nodemanager.resource.memory-mb
【存疑】
表示該節點上YARN可使用的物理內存總量,默認是8192(MB),注意,如果你的節點內存資源不夠8GB,則需要調減小這個值,而YARN不會智能的探測節點的物理內存總量,這個參數另一種說法是,該參數的默認值是8192MB,即使你的機器內存不夠8192MB,YARN也會按照這些內存來使用,對于這兩種說法,我比較認可第二種,因為我以前都是用2G內存搭建的平臺,這個參數都是默認,但一直正常運行,不用修改。
講到這我想給大家擴展一下yarn框架。
ResourceManager做的事情是負責協調集群上計算資源的分配。調度、啟動每一個 Job 所屬的 ApplicationMaster、另外監控 ApplicationMaster 的存在情況。
NodeManager 功能比較專一,根據要求啟動和監視集群中機器的計算容器container。負責 Container 狀態的維護,并向 RM 保持心跳匯報該節點資源使用情況。
ApplicationMaster 負責一個 Job 生命周期內的所有工作。注意每一個Job都有一個 ApplicationMaster。它和MapReduce任務一樣在容器中運行。AM通過與RM交互獲取資源,然后然后通過與NM交互,啟動計算任務。
容器是由ResourceManager進行統一管理和分配的。有兩類container:一類是AM運行需要的container;另一類是AP為執行任務向RM申請的。
Container是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等,當AM向RM申請資源時,RM為AM返回的資源便是用Container表示的。
這只是對yarn初步的理解,在此需要注意的是,cotainer是一個抽象的理解。
yarn.nodemanager.vmem-pmem-ratio
任務每使用1MB物理內存,最多可使用虛擬內存量,默認是2.1,因為開始運行任務的時候,會先檢查分配給他的資源,如果需要的虛擬內存小于分配給他的虛擬內存任務會失敗,如果不想讓他運行時檢查虛擬內存,可以通過下一個參數關閉檢測,并不會影響任務運行。
yarn.nodemanager.vmem-check-enabled
是否啟用一個線程檢查每個任務證使用的虛擬內存量,如果任務超出了分配值,則直接將其kill,默認是true,修改是將參數改為 false。
最后一個文件 slaves
在這個文件里添加上,你的datanode節點的主機名。
修改完配置文件就可以下發hadoop文件到slave節點用到的命令是:scp -r [hadoop-版本] [用戶名]@[主機名]:~
發送到slave主機的用戶的家目錄。
將hadoop文件下發到slave文件之后就可以格式化文件系統了,在此,我用一張圖來描述linux文件系統和hdfs文件系統的區別。
需要注意的是 hadoop1 版本的默認hdfs塊大小為64M,而Hadoop2默認的塊大小為128M。
hdfs文件系統的特點
高容錯性:數據自動保存多個副本,副本丟失后,自動恢復
適合批處理:移動計算而飛數據。數據位置暴露給計算框架
適合大數據處理:GB,TB,設置PB級數據。百萬規模以上文件數量。10K+節點規模。
流式文件訪問:一次性寫入,多次讀取。保證數據一致性。
可構建在廉價機器上:通過多副本提高可靠性。提供容錯和恢復機制。
不適合低延遲數據訪問場景:比如毫秒級,低延遲與高吞吐率。
不適合小文件存取場景:占用NameNode大量內存。尋道時間超過讀取時間。
不適合并發寫入,文件隨機修改場景:一個文件只能有一個寫者。僅支持append。
hdfs文件系統在存儲文件的流程是,client客戶端向namenode發送存儲請求,namenode檢查路徑是否可以存儲,如果可以回復請求,client客戶端將文件分為128M一個塊的文件(如果文件小于128M占一個塊,但存儲在分布式系統上是它實際大小),比如一個257M的文件,client會把它且分為2個128M的文件和1個1M的文件,當寫完一份文件后,datanode會將這份文件復制到其他的節點上面,默認是存放三份,HDFS文件系統主要是用來處理大量數據時使用,增大他的數據塊容量有利于文件塊的定位,但也不是越大越好,如果有大量的小數據存入到HDFS系統中,因為數據的元數據都存放在datanode中,因此,HDFS所能存儲的文件數量會受到namenode內存的限制。
拓展
namenode 作用,運行原理
NameNode主要是用來保存HDFS的元數據信息,比如命名空間信息,塊信息等。當它運行的時候,這些信息是存在內存中的。但是這些信息也可以持久化到磁盤上。
在此引出secondary namenode 的概念,初次聽到這個詞可能很多人以為這是namenode的備份,其實不然,這里就要講一下namenode的工作原理:
namenode主要由兩個文件組成fsimage,edit logs 。當“寫請求”到來時namenode會首先寫editlog到磁盤,即向edits文件中寫日志,成功返回后,才會修改內存,并且向客戶端返回。只有在NameNode重啟時,edit logs才會合并到fsimage文件中,從而得到一個文件系統的最新快照。但是在產品集群中NameNode是很少重啟的,這也意味著當NameNode運行了很長時間后,edit logs文件會變得很大。在這種情況下就會出現下面一些問題:
edit logs文件會變的很大,怎么去管理這個文件是一個挑戰。
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處理元數據的更新。
好,講解完namenode,secondary namenode開始重回搭建平臺的話題,上回說到修改完配置文件,開始格式化文件系統命令為:hdfs namenode -format 或者hadoop namenode -format 成功后會顯示
成功格式化后,就可以啟動你的進程了。
start-dfs.sh的作用在于啟動主節點的namenode,啟動secondnamenode,以及各從節點的datanode進程。
stop-dfs.sh的作用在于關閉主節點的namenode,啟動secondnamenode,以及各從節點的datanode進程。
啟動完進程,可以用命令:jps 查看
我的namenode節點:bootstrap不是我啟動的,他是一個前端框架。
我的datanode節點
start-yarn.sh 啟動yarn?
namenode節點
datanode節點: org 那個不是
啟動完進程就可以測試一下搭建的環境首先建一個文件a.txt,在里面隨便寫上一些內容
然后上傳文件到hdfs系統上,命令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包,以后根據不同的需求,需要自己寫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是一個數據倉庫基礎工具在Hadoop中用來處理結構化數據。它架構在Hadoop之上,總歸為大數據,并使得查詢和分析方便。并提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。
搭建hive,我們用到了mysql作為元數據庫,在ubuntu中可以使用命令:sudo apt install mysql-client mysql-server 安裝mysql,安裝完之后會出現配置界面讓你輸入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連接的驅動 mysql-connector-java-5.1.45.tar(最好別用太高版本,這個文件我也會上傳),將這個文件放到$HIVE_HOME/lib中
進入$HIVE_HOME/bin,執行./schematool -initSchema -dbType mysql ,初始化元數據庫,如果出現初始化失敗,首先檢查配置文件有沒有出錯,如果配置文件沒有問題,那就可能要修改mysql的綁定ip,修改 /etc/mysql/mysql.conf.d/mysqld.cnf,找到里面的bind-address 默認為127.0.0.1 修改為0.0.0.0,此時在重新初始化。
初始化完成之后,進入$HIVE_HOME/sbin目錄下,執行./hive ,啟動hive。
有些任務可能涉及到將查詢到的結果輸出到控制臺或者重定向到某個文檔內 可以使用hive -e "xxxx"
重定向 hive -e "xxx" >>xx.txt,還有大量數據在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
下發spark到datanode節點,下發完成后,進入$SPARK_HOME/sbin,執行start-all.sh,啟動spark進程,看到namenode上有master,datanode上有worker就說明正常啟動了。
遇到的問題
在剛開始搭建平臺的時候,遇到過很多問題,但問題解決后都沒有記下來,現在只能一點一點回去找,所以暫時更新到這里,后續會添加上這一塊。
未完待續.....
資源
密碼:5dct