用CDH5搭建hadoop集群
本文記錄搭建CDH的重難點,講解一些我能懂的原理,幫助大數據領域新人通過CDH,理解、構建大數據系統。
什麼是CDH5???
CDH5是cloudera公司出品的,包含hadoop生態園的多種工具的,一個「打包發行版」。
即cloudera公司在原本的hadoop等開源項目的基礎上,進行二次開發,從而得到了CDH。筆者做此文時,CDH的最高版本為CDH已經發行到第五代。
為什麼選擇CDH???
- CDH將hadoop生態圈的幾種工具融合到了一起,在一定程度上解決了工具之間的兼容問題
- CDH提供了一套可讀性比較高的日誌系統,使得運維人員可以快速定位錯誤。
- CDH支持自動化部署節點,使得集群易於擴展,可以很簡單的為集群添加工具。
CDH5.10包含的工具有:HDFS、YARN、ZooKeeper、Oozie、Hive、Hue、HBase、Impala、Solr、Spark、Key-Value Store Indexer
如果你和我一樣,是個大數據領域的新晉學徒,不妨嘗試先用CDH快速的搭建集群,而後再使用中,熟悉各工具的原理。只要對工具的原理有所了解,即使脫離CDH轉而使用原生hadoop生態,也自然是得心應手的。
實驗環境:
推薦使用的操作系統為Centos7 64位,GNONE版。
Centos是linux眾多發行版中比較穩定的,適合做伺服器。Ubuntu是linux發行版中比較好用的,比較適合家用,用做伺服器的話坑會比Centos多一些,但是我依然會稍帶說一點ubuntu的配置方法。
Centos7的linux內核,版本號為el7,即enterprise linux(企業版linux),所以在CDH的網站下載資源時,應選擇標有Centos7或el7的版本。
在安裝Centos7時會要求選擇安裝的軟體,默認為最小安裝,只有命令行,可以選擇GNONE版,GNONE是一套還不錯的用戶圖形界面。
- 使用root登錄
- 配置靜態ip
- 修改hostname與hosts
- 配置ssh免密碼登錄
- javaJDK
- 關閉防火牆
- 安裝mysql
- 統一集群時間
—————————————————————————————————————————
一、root登錄
目的:
這個是Cloudera官方文檔里寫明的,集群管理器要有超級管理員許可權,或者有運行sudo的許可權並配置sudo密碼。另外不root登錄會有各種各樣的許可權問題,運行的命令全要加sudo,所以一上來要做的第一件事情就是使用root登錄集群各主機。
—————————————————————————————————————————
二、配置靜態IP
目的:
集群中各節點要能互相訪問,因此各主機的IP不能輕易變化,所以要配置靜態IP
具體配置:
推薦使用圖形界面
# 文件坐標ubuntu: /etc/network/interfacescentos: /etc/sysconfig/network-scripts/ifcfg-ens33# centos7的配置實例BOOTPROTO="static" #dhcp改為static ONBOOT="yes" #開機啟用本配置 IPADDR=192.168.1.250 #靜態IP GATEWAY=192.168.1.1 #默認網關 NETMASK=255.255.255.0 #子網掩碼 DNS1=8.8.8.8 #DNS 配置 DNS2=114.114.114.114 #DNS 配置
注意:
- 在使用ubuntu系統時,如果系統版本高於過等於14.04,dns是可以直接在interfaces文件里配的
- 在使用centos系統時,如果使用圖形界面配置網路,記得要去配置文件里把參數ONBOOT的值改為true,否則系統啟動是不會自動聯網的。
拓展閱讀:
Ubuntu14.04 server靜態ip配置
Centos 7 學習之靜態IP設置
—————————————————————————————————————————
三、hosts、hostname
目的:
集群中各節點需要互相訪問,因此各主機都要有自己的名字(hostname),各主機都要有一份通訊錄(hosts),通訊錄要寫明各主機的名字(hostnames)與對應的IP地址。
集群中的主機名可根據主機的職責來命名,如集群管理者(cloudera manager)可命名為CM
,HDFS的主節點可命名為Master,子節點可命名為Slave1(2、3、4、5、6)。
具體配置:
# 文件坐標hosts: /etc/hostshostname: /etc/hostname# hosts,集群所有主機IP地址與對應主機名格式:IP(空)主機名例:127.0.0.1 localhost# hostname把主機名直接寫入此文件
注意:
- 上古時代的centos,其hostname需要在/etc/sysconf/network中配置。
- 因為集群中每台機器的hosts是相同的,所以hosts文件只需要配置一遍,用拷貝或ssh發送置各節點即可
—————————————————————————————————————————
四、ssh
目的:
集群之間的連接依靠ssh,腳本調用ssh是不會輸入密碼驗證的,所以要做到集群之間各主機的ssh互相免密碼。
具體步驟:
# sheel中運行↓生成一對密鑰,公鑰(id_rsa.pub)私鑰(id_rsa)。# 之後一路回車,因為是用root登錄的,所以公鑰與私鑰的位置在/root/.ssh中ssh-keygen -t rsa# 把公鑰放進authorized_keys文件夾中cd /root/.sshcat ./id_rsa.pub >> ./authorized_keys# 把整個包含公鑰私鑰的文件發送到集群的各個節點,# 無論公鑰私鑰最開始由誰生成,只要各節點擁有統一的一套公鑰私鑰,就可以保證互相免密碼scp -r /root/.ssh slave1:/root/# 驗證,執行↓命令,slave1替換成相應的主機名,# 各主機之間互相登錄,均不需要驗證密碼,則說明配置成功ssh slave1
請注意:
- 為了方便我一般直接把整個.ssh文件發過去,如上所示。但是在某些版本的Linux里,公鑰私鑰要打包進壓縮包再傳,否則驗證失敗,原因不明。
- centos7自帶的ssh默認配置不允許免密碼登錄,需要取消文件/etc/ssh/sshd_conf中RSAAuthentication yes與PubkeyAuthentication yes這兩項前面的#
- slave1替換成目標主機的hostname,因為CDH需要root許可權,所以各節點均全程使用root用戶執行安裝,所以.ssh文件夾在/root下,如果不使用root用戶操作,.ssh文件夾生成在用戶的home中。
—————————————————————————————————————————
五、javaJDK
注意:
- 安裝之前要卸載openJDK,否則各種bug,卸載方法見下面拓展閱讀
- 我習慣把環境變數配置到/etc/profile中,但是後面出現了spark讀不到JAVA_HOME的問題,有人說要把環境變數配置到/etc/environment里。下面是兩種配置的區別,大家自己理解吧。
/etc/environment是設置整個系統的環境,而/etc/profile是設置所有用戶的環境,前者與登錄用戶無關,後者與登錄用戶有關。
- 但是在上面兩種配置方法都使用了的情況下,依然有某些腳本報讀不到JAVA_HOME,在/etc/sudoers 的最後一行增加:Defaults env_keep+=JAVA_HOME,此處的JAVA_HOME換成你的javaJDK路徑
拓展閱讀:
卸載CentOS7-x64自帶的OpenJDK並安裝Sun的JDK7的方法 - 多米諾 - 博客園
—————————————————————————————————————————
六、防火牆
目的:
因為CDH包含了很多工具,因此集群各主機都要開放很多埠,可以對照Cloudera官方文檔配置防火牆,也可以先關掉防火牆往下做,日後再配。
linux的防火牆包括selinux、firewall,早期版本的centos不使用firewall而是使用iptables。
具體配置:
# selinux配置文件坐標:/etc/selinux/config# 把其中參數SELINUX的值改為disabled即可# 關閉firewall的方法:# 禁止開機啟動防火牆systemctl disable firewalld.service# 關閉防火牆systemctl stop firewalld.service
擴展閱讀:
防火牆的詳細配置方法請參見:
CentOS7使用firewalld打開關閉防火牆與埠 - 莫小安 - 博客園
selinux的詳細配置方法請參見:
第十六章、程序管理與 SELinux 初探
—————————————————————————————————————————
七、mysql
注意:
- 資料庫其實裝在哪都無所謂的,只要能訪問的到就行。
主要任務:
創建三個資料庫,賦予許可權
# hive資料庫create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci# 集群監控資料庫create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci# hue資料庫create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci# 授權用戶登錄grant all on *.* to root@"%" Identified by "你的密碼";flush privileges;
擴展閱讀:
安裝方法、設置等命令請參考:CentOS 7 安裝 MySQL
—————————————————————————————————————————
八、ntp
我感覺吧:
時間是統一的就行吧。為什麼網上找到的教程都要我搭本地ntp伺服器啊,我linux已裝好就自動設置時間了啊。
不知道為什麼centos7上配置ntp伺服器,區域網內同步速度奇慢無比,彷彿不能用。據友人說,在ubuntu上配ntp就毫無障礙。
簡略配置:
# 在所有節點安裝ntpyum install ntp# 開機啟動ntp服務chkconfig ntpd on# 去網上同步時間以確保master的時間是準確的,# 這個是官方的ntp伺服器中國站↓ntpdate -u cn.pool.ntp.org
擴展閱讀:
服務配置詳情見CentOS 7 中使用NTP進行時間同步
配置完後發現無法開機啟動ntp,解決方法請見RHEL7/CentOS7 NTP開機無法啟動的解決方法
—————————————————————————————————————————
正式安裝CDH
- 下載CDH離線包
- 啟動CDH的管理台
—————————————————————————————————————————
一、CDH的離線包
這些包都是什麼??
CDH的離線包包括集群管理器(cloudera manager),parcel包,parcel.sha文件,以及manifest.json 文件。
其中cloudera manager是一個管理器,你可以藉助它快速地部署諸如hdfs、hive、hbase等工具;你可以很方便地為集群添置一台新主機,或踢掉一台老機器;它還提供了一套使用的日誌轉載系統,可以把冗長的java報錯以簡明扼要的方式展示給你,又可以在指定的位置保存原始的報錯供你慢慢分析。實乃運維排錯必備之良品(# 滑稽
parcel包是一個壓縮包,涵括了所有CDH所支持的工具。下載了這個包,你就可以體驗離線安裝各種各樣的工具。好吧只是把安裝時需要的資源提前下載好而已,這樣的好處主要在於,你可以用迅雷快速地下載這些資源,而不必為repo一條條地配置鏡像站點,要知道「網速慢」可不總是配兩條鏡像地址就能解決的問題。
manifest.json 文件里寫了某種大概關於版本的信息,看不懂。
parcel.sha文件里寫了你所用的是哪個版本的parcel包,想必用來確定你的版本的,所以請對著版本正確下載。
下載地址:
- 管理器官方鏈接,請看好操作系統版本和管理器本體版本:Index of /cm5/cm/5
- parcel包、parcel.sha1文件和json三個文件的官方鏈接:Index of /cdh5/parcels/5.10
請對著操作系統版本下載,parcel和parcel.sha1。parcel.sha1下載好後請改名,去掉一個最後那個1(one)
—————————————————————————————————————————
二、啟動CDH的管理台
1、在每台主機上,解壓clouedera manager壓縮包到/opt目錄下。
2、在agent上配置server的地址或hostname。
對於整個CDH集群來說,有一個伺服器(server)用來監控、管理整個集群。自然地,其他受管理的主機就都是用戶(agent)了。為了讓agent能在網路中找到server,我們要配置某個文件,把server的位置或名字告訴agent。
# 文件位置(↓這個位置根據版本要改噢)/opt/cm-5.10.0/etc/cloudera-scm-agent/config.ini將server_host的值改為server的hostname
3、告訴主節點如何連接資料庫
# 在主節點上運行sheel指令如下,文件夾的名字要根據版本號改,資料庫的配置根據實際改/opt/cm-5.10.0/share/cmf/schema/scm_prepare_database.sh mysql -h資料庫地址 -u資料庫賬號 -p資料庫密碼 --scm-host clouderaManager的伺服器名(本機hostname) scm scm scm
4、下載JDBC(java操作資料庫的jar包)並放入各節點
JDBC地址:Download Connector/J
放到/opt/cm-5.10.0/share/cmf/lib/
5、啟動
# 在server/opt/cm-5.10.0/etc/init.d/cloudera-scm-server start# 在agent/opt/cm-5.10.0/etc/init.d/cloudera-scm-agent start
至此,訪問server的7180埠應能進入web管理台頁面
問題解決思路:
於是,順風順水的日子至此為止了,之前步驟中所有的錯誤操作,都會在此爆發。
如果你的7180埠無法訪問,請檢查防火牆,檢查文件許可權,檢查在上面的配置過程中有沒有拼寫錯誤。等等,要知道任何一個細節處的小錯誤都有可能導致你的web界面無法訪問
如果你的資料庫連接不上請確認JDBC放置到了正確的地方,確認資料庫的配置是允許CDH所處網段訪問的。
報找不到JAVA_HOME請確認/etc/sudoers和/etc/profile中正確地配置了JAVA_HOME
—————————————————————————————————————————
推薦閱讀:
※入場比特幣堪比大冒險?他用一千多種交易數據給你定心丸
※分散式資料庫數據一致性原理說明與實現
※HDFS中的Namenode和Datanode
※大數據行業的浮躁
※如何自學大數據?先對自己來一個深度剖析