1. 硬件准備
使用了五台機器,其中兩台8c16g,三台4c8g。一台4c8g用於搭建cmServer和NFS服務端,另外4台作為cloudera-manager agent部署CDH集群。
ip | 主要服務/角色 | hostname(hosts配置與此一致) | 機器規格 |
---|---|---|---|
10.2.223.237 | cmServer NFS server | v-xstest-849-171208-cdh-1.hx | 4c8g200g |
10.2.223.239 | Namenode,resouceManager,Hbase Master等 | v-xstest-855-171208-cdh2-1.novalocal | 8c16g200g |
10.2.223.242 | SecondaryNamenode,hive,hue等 | v-xstest-856-171208-cdh2-2.novalocal | 8c16g200g |
10.2.223.224 | Datanode,regionServer,nodeManager等 | v-xstest-850-171208-cdh-2.novalocal | 4c8g200g |
10.2.223.197 | Datanode,regionServer,nodeManager等 | v-xstest-851-171208-cdh-3.novalocal | 4c8g200g |
2. NFS搭建
2.1 NFS簡介
NFS 就是 Network FileSystem 的縮寫,最早之前是由sun 這家公司所發展出來的。 它最大的功能就是可以透過網絡,讓不同的機器、不同的操作系統、可以彼此分享個別的檔案 (share files)。所以,你也可以簡單的將他看做是一個文件服務器 (file server) 呢!這個 NFS 服務器可以讓你的 PC 來將網絡遠程的 NFS 服務器分享的目錄,掛載到本地端的機器當中, 在本地端的機器看起來,那個遠程主機的目錄就好像是自己的一個磁盤分區槽一樣 (partition)!使用上面相當的便利!
2.2 安裝NFS
- 查看系統是否已經安裝NFS
rpm -qa | grep nfs
rpm -qa | grep rpcbind
- yum安裝NFS
yum -y install nfs-utils rpcbind
2.3 NFS服務端配置
- 在NFS服務端上創建共享目錄/opt/share並設置權限
mkdir -p /opt/share
chmod 666 /opt/share
- 編輯/etc/exports文件
vim /etc/exports
/opt/share *(rw,no_root_squash,no_all_squash,sync)
配置生效命令:
exportfs -r
- 參數說明:
參數值 內容說明
rw ro 該目錄分享的權限是可擦寫 (read-write) 或只讀 (read-only),但最終能不能讀寫,還是與文件系統的 rwx 及身份有關。
sync async sync 代表數據會同步寫入到內存與硬盤中,async 則代表數據會先暫存於內存當中,而非直接寫入硬盤!
no_root_squash root_squash 客戶端使用 NFS 文件系統的賬號若為 root 時,系統該如何判斷這個賬號的身份?預設的情況下,客戶端 root 的身份會由 root_squash 的設定壓縮成 nfsnobody, 如此對服務器的系統會較有保障。但如果你想要開放客戶端使用 root 身份來操作服務器的文件系統,那么這里就得要開 no_root_squash 才行!
all_squash 不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名用戶,通常也就是 nobody(nfsnobody) 啦!
anonuid anongid anon 意指 anonymous (匿名者) 前面關於 *_squash 提到的匿名用戶的 UID 設定值,通常為 nobody(nfsnobody),但是你可以自行設定這個 UID 的值!當然,這個 UID 必需要存在於你的 /etc/passwd 當中! anonuid 指的是 UID 而 anongid 則是群組的 GID 啰。
- 啟動服務
service rpcbind start
service nfs start
2.4 NFS客戶端配置
- 安裝以及啟動同上
- 客戶端設置
mkdir -p /opt/share
showmount -e 10.2.223.237
mount -t nfs 10.2.223.237:/opt/share /opt/share -o proto=tcp -o nolock
3. SSH免密登錄
3.1 實現方法
要實現多台機器相互之間免密登錄,只需要將每台機器ssh-keygen生成的公鑰(id_rsa.pub)寫到一個文件authorized_keys,然后將這個文件復制到每台機器的~/.ssh/authorized_keys,這樣就可以互通了。
3.2 具體步驟
hosts文件編輯,注意一定要保持與每台機器hostname一致,將hosts文件寫到/opt/share/ssh,便於同步
每台機器執行 ssh-keygen -t rsa -f ~/.ssh/id_rsa,連續回車兩次
將每台機器的id\_rsa.pub寫到/opt/share/ssh/authorized\_keys
每台機器執行/opt/share/ssh/sync\_config.sh,保持hosts,authorized\_keys一致
sync\_config.sh:
#!/bin/bash
rm -f /etc/hosts
cp /opt/share/ssh/hosts /etc/hosts
rm -f /root/.ssh/authorized_keys
cp /opt/share/ssh/authorized_keys /root/.ssh/authorized_keys
4. 安裝Cloudera Manager Server和Agent
使用cm5.4.1 el6版本,el5會有python版本問題,el6內置的python2.6.
4.1 資源下載
cm安裝包:http://archive.cloudera.com/cm5/cm/5/cloudera-manager-el6-cm5.4.1_x86_64.tar.gz
cm資源包(parcel):http://archive.cloudera.com/cdh5/parcels/5.4.1/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel
其他:http://archive.cloudera.com/cdh5/parcels/5.4.1/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel.sha1
http://archive.cloudera.com/cdh5/parcels/5.4.1/manifest.json
另外需要准備mysql-jdbc jar包,這個從maven倉庫找一個就行,我用的是:mysql-connector-java-5.1.34.jar
將上面下載資源上傳到NFS目錄/opt/share/cdh,mysql-connector-java-5.1.34.jar放到/opt/share
4.2 安裝
- 解壓:所有機器
mkdir -p /opt/cloudera-manager
tar xvzf share/cloudera-manager*.tar.gz -C /opt/cloudera-manager
- 添加用戶:所有機器
useradd --system --home=/opt/cloudera-manager/cm-5.4.1/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
- 修改cloudera-scm-agent config.ini:所有機器
vim /opt/cloudera-manager/cm-5.4.1/etc/cloudera-scm-agent/config.ini
修改server.host=10.2.223.237 #即cloudera manager Server地址
- 數據庫初始化:僅需要 cloudera manager server 執行
cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera-manager/cm-5.4.1/share/cmf/lib
/opt/cloudera-manager/cm-5.4.1/share/cmf/schema/scm_prepare_database.sh mysql cm_new -h 10.2.222.25 -ubigdata -p'bigdata123' --scm-host 10.2.223.237 bigdata bigdata123 --force
注釋:cm_new 數據庫名稱,自己填寫 -h -u -p連接數據庫配置,如果沒有mysql需要自己搭建 ,--scm-host 后面bigdata bigdata123這兩個是需要連接的數據庫配置,而不是網上的scm scm scm
注2:這個命令執行主要是創建數據庫,並且在/opt/cloudera-manager/cm-5.4.1/etc/cloudera-scm-server/db.properties生成數據庫配置,如果配置成功就OK了,可以忽略其他報錯
- 創建parcel-repo文件夾:cloudera manager server,注意文件夾名字不要寫錯,這個與后面CM配置頁面里面設置對應,也可以修改,建議默認值保持一致
mkdir -p /opt/cloudera/parcel-repo
cp /opt/share/cdh/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel.sha1 /opt/cloudera/parcel-repo/CDH-5.4.1-1.cdh5.4.1.p0.6-el6.parcel.sha #注意修改名稱sha1 sha
cp /opt/share/cdh/manifest.json /opt/cloudera/parcel-repo
chown cloudera-scm:cloudera-scm -R /opt/cloudera/parcel-repo/
- 創建parcels文件夾:cloudera manager agent
mkdir -p /opt/cloudera/parcels
chown cloudera-scm:cloudera-scm /opt/cloudera/parcels
4.3 啟動服務
- Manager Server:/opt/cloudera-manager/cm-5.4.1/etc/init.d/cloudera-scm-server start
- Agent : /opt/cloudera-manager/cm-5.4.1/etc/init.d/cloudera-scm-agent start
5. CDH配置安裝
登錄配置頁面10.2.223.237:7180 默認賬號秘密: admin admin
由於本人安裝時候沒有一個個頁面截圖,具體大家第一次進入之后就可以看到,傻瓜式操作。
5.1 導航安裝
- 登錄進入以后,選擇免費版,進入為CDH集群指定安裝主機頁面后,如果配置安裝正確,所有agent機器都會出現在當前管理的主機,如果沒有,則啟動錯誤或者config.ini配置錯誤。檢查啟動日志,修改錯誤后,刪除4.2中創建的數據庫並且重新執行數據庫初始化,重啟服務
- 進入群集安裝頁面,會讓你選擇CDH版本,勾選使用parcel建議 以及CDH-5.4.1-1.cdh5.4.1.p0.6
- 進入群集設置,選擇需要安裝的服務,建議自定義服務,安裝你需要的相關服務即可
- 接下來是集群分配各節點角色:這塊最好不要按照默認配置的來,相關的服務最好可以合理分配一下,比如我的兩台8c16g就用來安裝Namenode ,resourceManger,hbase master,sendcondary namenode,hive以及hue等。同時,自己手動分配的時候,也會對集群相關服務更了解,后面安裝出錯的時候更容易找到日志定位問題
- 配置hive/oozie/active monitor數據庫:需要提前創建好
- 安裝服務:各個服務按順序安裝,中間出錯的時候請在對應的機器上找到相關的日志,服務的日志都是在/opt/cloudera-manager/cm-5.4.1/run/cloudera-scm-agent/process/,在里面找該服務相關的文件夾,進入之后就可以找到日志文件了。修復問題后,點擊重試,會從最近失敗的服務開始重新安裝,直到所以安裝完成就行了。
- 如果沒有安裝結束就退出,沒有關系,http://10.2.223.237:7180/cmf/hardware/hosts 這個是主機管理頁面,可以看每台機器上還有哪些機器沒有啟動服務,手動啟動也可以的
5.2 服務配置修改
- 修改集群顯示名稱:默認Cluster 1,直接修改初始化數據庫腳本的數據庫名.clusters表,修改display_name
- 其他服務配置:比如hdfs,hbase等,直接在群集選項中選擇該服務,進入以后點擊配置就可以了
6. 相關錯誤以及心得
6.1 常見錯誤
- scm_prepare_database.sh執行報錯
之前我也是參考網上的執行命令,但是沒人解釋最后三個scm scm scm是什么意思,具體在4.2中我已經強調了,只要后面數據庫創建成功並且對應的db.properties文件配置沒錯就行了
- 配置hive/oozie數據庫出錯
要提前創建數據庫,並且安裝服務的機器上在/opt/cloudera-manager/cm-5.4.1/share/cmf/lib有mysql-connector jar包
- 僅完成1個步驟。首個失敗:主機bigdata-cdh-client(id=2)上的客戶端配置(id=1)已使用1退出,而預期值為0
在安裝服務界面,執行失敗時,點擊查看詳細信息,會給出這樣類似的錯誤信息。查看/opt/cloudera-manager/cm-5.4.1/run/cloudera-scm-agent/process目錄下相關日志。
發現上面這個錯誤信息是由於JAVA_HOME問題,啟動腳本中,JAVA_HOME並不是根據環境變量來獲取,而是在它列舉的幾個目錄下尋找,所以只要把你的java路徑ln -s過去就行,比如我的 ln -s /opt/jdk/jdk1.7-7u80/ /usr/java/jdk1.7
- hive metastore server啟動失敗 Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH
將mysql-connectorxxx.jar拷貝到/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hive/lib下,只需要拷貝hive metastore server這台就行了
- urlopen error [Errno -2] Name or service not known> - agent197
我之前為了識別方便,修改了hosts和機器的hostname,但是在我們的DNS服務器中仍無法修改,可以通過nslookup ip 查看比如nslookup 10.2.223.237,發現這個里面的name仍然是修改hostname之前的。
所以建議不要輕易修改hostname,在配置的hosts中也要保持與hostname一致
- 安裝向導頁面創建hive metastore數據庫表出錯:org.apache.hive.beeline.HiveSchemaHelper.getConnectionToMetastore(HiveSchemaHelper.java:79
cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib)
- oozie創建數據庫表失敗,沒有com.mysql.jdbc.driver
cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/oozie/libtools
- oozie服務啟動失敗:stdout.log中也是沒有com.mysql.jdbc.driver
首先,刪除oozie數據庫並重新創建
然后cp /opt/share/mysql-connector-java-5.1.34.jar /opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib
6.2 建議&心得
- 請一定先搭建好NFS,而不是通過大量的scp節省人力。
- cm是一個幫助你安裝hadoop生態的管理工具,類似ambari,但是需要了解並修改每個服務的基本配置
- 在安裝服務過程中一定要找日志,只有日志才會告訴你具體的問題