
簡(jiǎn)介面向Hadoop運(yùn)維人員與平臺(tái)搭建者的Cloudera Manager 5.14.2離線安裝包適配CentOS7 x86_64環(huán)境解決CM安裝源獲取難、依賴配置復(fù)雜的問(wèn)題。包體共18,362個(gè)文件以Python字節(jié)碼py/pyo/pyc、HTML與JS管理界面、Java jar包、SQL/DDL數(shù)據(jù)庫(kù)腳本、SO動(dòng)態(tài)庫(kù)及各類配置文件為主壓縮后約793.9MB涵蓋服務(wù)端、Agent、數(shù)據(jù)庫(kù)初始化等完整組件。已有277人學(xué)習(xí)下載適合在無(wú)外網(wǎng)或內(nèi)網(wǎng)環(huán)境下部署CDH集群的工程師。除安裝介質(zhì)外資源展示了CM的典型目錄與組件構(gòu)成包括cloudera-scm-server、cloudera-scm-agent、supervisord守護(hù)腳本及Hive/Oozie等元數(shù)據(jù)庫(kù)定義便于理解服務(wù)部署邏輯和依賴關(guān)系??膳浜稀禖loudera Manager在CentOS7上的安裝與配置詳解》一文快速完成安裝、初始化MariaDB、Web界面創(chuàng)建集群、分發(fā)與監(jiān)控服務(wù)等全流程操作同時(shí)為后續(xù)安全配置和性能調(diào)優(yōu)提供基礎(chǔ)是構(gòu)建企業(yè)級(jí)Hadoop平臺(tái)的重要工具包。1. 在 CentOS 7 上部署 CDH 之前先把這個(gè) tar.gz 收好如果你正打算給團(tuán)隊(duì)搭一套離線的大數(shù)據(jù)環(huán)境又不想每次裝 Hadoop 組件都去在線源里碰運(yùn)氣那這份cloudera-manager-centos7-cm5.14.2_x86_64.tar.gz就是你該下的東西。它是 Cloudera Manager 5.14.2 的 CentOS 7 離線安裝包內(nèi)含 CM Server、Agent 和倉(cāng)庫(kù)配置配合 CDH 5.x 的 parcel 包可以在內(nèi)網(wǎng)環(huán)境里完成從零到集群可用的完整部署。我拆過(guò)不少類似的包這個(gè)版本適合那些還在用 5.x 技術(shù)棧、又想避開在線安裝不確定性的人。下面我按實(shí)際部署順序把解壓、配置、啟動(dòng)和踩坑的地方一次說(shuō)清楚。2. 安裝前準(zhǔn)備環(huán)境檢查與三處容易忽略的配置2.1 主機(jī)規(guī)劃與資源評(píng)估拆包之前先把集群拓?fù)湎朊靼?。CM 5.14.2 的架構(gòu)是服務(wù)端加多個(gè) AgentServer 負(fù)責(zé)管理 Web 界面和調(diào)度任務(wù)Agent 部署在每一臺(tái)需要跑大數(shù)據(jù)組件的主機(jī)上。我見(jiàn)過(guò)有人圖省事把 Server 跟 DataNode 塞同一臺(tái)機(jī)器結(jié)果機(jī)器負(fù)載一高整個(gè)管理界面卡成黑匣子排查起來(lái)很痛苦。建議最低規(guī)劃這樣一臺(tái) 4C8G 的機(jī)器跑 CM Server另外幾臺(tái) 4C16G 的機(jī)器跑 Agent磁盤至少留 100G。如果你只是驗(yàn)證功能單臺(tái) All-in-One 也行但后續(xù)擴(kuò)容時(shí)要先改/etc/hosts和 Agent 配置不如一開始就把主機(jī)角色分清楚。先確認(rèn)操作系統(tǒng)版本和內(nèi)核cat /etc/redhat-release uname -r輸出應(yīng)該是 CentOS Linux release 7.x 和 3.10 內(nèi)核。CM 5.14.2 對(duì)內(nèi)核沒(méi)有特殊要求但是對(duì) glibc 有依賴CentOS 7 默認(rèn)的 2.17 版本沒(méi)問(wèn)題。注意不要用 CentOS 8 或更高版本因?yàn)?CM 5.x 的初始化腳本和依賴庫(kù)都是針對(duì) 7 的強(qiáng)行裝會(huì)報(bào)缺少libncurses.so.5之類的鏈接錯(cuò)誤。接著看 Java 環(huán)境。CM 5.14.2 要求 Oracle JDK 1.8不要用 OpenJDK 的某些精簡(jiǎn)版本否則后續(xù)啟動(dòng) NameNode 時(shí)會(huì)碰到UnsupportedClassVersionError。我一般會(huì)在每臺(tái)機(jī)器上統(tǒng)一裝 Oracle JDK 1.8u202 以前的版本因?yàn)橹蟮陌姹拘枰虡I(yè)許可沒(méi)必要惹麻煩。2.2 JDK 與數(shù)據(jù)庫(kù)CM 的心跳依賴JDK 裝好后設(shè)置好JAVA_HOMEexport JAVA_HOME/usr/java/jdk1.8.0_202 export PATH$JAVA_HOME/bin:$PATH記得把這兩行寫進(jìn)/etc/profile然后讓所有 Agent 主機(jī)都同步這個(gè)環(huán)境變量。CM Agent 啟動(dòng)時(shí)是通過(guò)JAVA_HOME找 Java 的如果你只在 Server 上配了Agent 機(jī)器上一堆Cannot find Java的報(bào)錯(cuò)會(huì)讓你懷疑人生。數(shù)據(jù)庫(kù)方面CM 5.14.2 支持 MySQL 5.7、MariaDB 等。我多用 MariaDB因?yàn)?CentOS 7 自帶的是它的社區(qū)版裝起來(lái)簡(jiǎn)單。需要提前建好 CM 自己的庫(kù)和用戶CREATE DATABASE cmf CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER cm% IDENTIFIED BY your_password; GRANT ALL PRIVILEGES ON cmf.* TO cm%; FLUSH PRIVILEGES;這里有個(gè)容易踩的坑CM 初始化時(shí)會(huì)寫很多帶TEXT類型的字段如果用默認(rèn)的latin1字符集后面在界面上看到中文亂碼會(huì)很難受。建庫(kù)時(shí)顯式指定 UTF-8后面省很多事。2.3 免密與防火墻集群通信的基石CM Server 通過(guò) SSH 去管理 Agent 主機(jī)需要配置 Server 到所有主機(jī)包括自己的免密登錄。不要用 root 直接登錄創(chuàng)建一個(gè)普通用戶比如cmuser給它 sudo 權(quán)限然后用ssh-keygen生成密鑰再ssh-copy-id分發(fā)。useradd cmuser echo cmuser ALL(ALL) NOPASSWD: ALL /etc/sudoers ssh-keygen -t rsa -P -f ~/.ssh/id_rsa for host in $(cat /etc/hosts | awk {print $2}); do ssh-copy-id cmuser$host; done防火墻是第二個(gè)大坑。CM 默認(rèn)會(huì)用 7180Web UI、7182server 通信、9000 等端口Agent 反向連接 Server 用 7182。我在測(cè)試環(huán)境里直接關(guān)掉 firewalld 和 SELinux因?yàn)檫@兩樣?xùn)|西的攔截日志不顯眼出了問(wèn)題你還在查端口監(jiān)聽(tīng)實(shí)際上包被 SELinux 丟了。生產(chǎn)環(huán)境如果非要開防火墻至少把7180-7182、8888、9000這幾個(gè)端口放行并且每臺(tái)機(jī)器要互相放行內(nèi)網(wǎng)網(wǎng)段。3. 安裝與初始化解壓、改配置、啟動(dòng) CM Server3.1 解壓安裝包與目錄結(jié)構(gòu)拿到 tar.gz 后先看下里面有什么。解壓到/opt目錄tar -zxvf cloudera-manager-centos7-cm5.14.2_x86_64.tar.gz -C /opt ls /opt/cm-5.14.2目錄里會(huì)有etc/、lib/、share/等標(biāo)準(zhǔn)布局重要的是etc/cloudera-scm-server/和etc/cloudera-scm-agent/里的配置文件。這個(gè)包是預(yù)編譯的二進(jìn)制不需要你重新編譯省了很多編譯工具鏈的麻煩。需要注意這個(gè)包只包含 CM 本身還不包含 CDH 組件。你還需要下載對(duì)應(yīng)的 CDH 5.14.2 parcel 文件.parcel和 manifest 文件放到一個(gè) HTTP 目錄里或者稍后通過(guò) CM 界面上傳。我一般先把 parcel 下載到/opt/cloudera/parcel-repo/這樣在引導(dǎo)集群時(shí)能直接從本地分發(fā)不會(huì)走外網(wǎng)。3.2 配置 CM 數(shù)據(jù)庫(kù)CM Server 啟動(dòng)前必須初始化數(shù)據(jù)庫(kù)。配置文件在/etc/cloudera-scm-server/db.properties你需要改成自己數(shù)據(jù)庫(kù)的連接信息com.cloudera.cmf.db.typemysql com.cloudera.cmf.db.hostlocalhost com.cloudera.cmf.db.namecmf com.cloudera.cmf.db.usercm com.cloudera.cmf.db.passwordyour_password注意這里db.type不要改錯(cuò)。如果是 MariaDB本質(zhì)上也是 MySQL 協(xié)議填mysql就行。改完權(quán)限后執(zhí)行初始化腳本/opt/cm-5.14.2/share/cmf/schema/scm_prepare_database.sh mysql cmf cm your_password這個(gè)腳本會(huì)自動(dòng)建表生成/etc/cloudera-scm-server/db.properties并把它替換成正確的配置。如果腳本運(yùn)行時(shí)報(bào)找不到 MySQL 驅(qū)動(dòng)說(shuō)明你缺少 JDBC 驅(qū)動(dòng)包。CM 的 lib 目錄里自帶一個(gè)mysql-connector-java.jar但有時(shí)候版本不匹配。我一般會(huì)下載 5.1.48 版本的驅(qū)動(dòng)放到/opt/cm-5.14.2/share/cmf/lib/下并把舊的刪掉。初始化完成后可以順手檢查一下庫(kù)表是否生成mysql -ucm -p -e use cmf; show tables;看到一堆AUTH_、USERS、SERVICES開頭的表就說(shuō)明數(shù)據(jù)庫(kù)這關(guān)過(guò)了。3.3 啟動(dòng) cloudera-scm-server 并觀察初始化日志數(shù)據(jù)庫(kù)弄完就可以啟動(dòng) Server 了。系統(tǒng)服務(wù)腳本用的是service或者直接執(zhí)行/etc/init.d/cloudera-scm-server start。啟動(dòng)后不要急著看端口CM Server 的初始化過(guò)程要一兩分鐘日志里有大量 Spring 框架的啟動(dòng)信息。service cloudera-scm-server start tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log等日志里出現(xiàn)Started Jetty server或者Web server started字樣再看端口netstat -ntlp | grep 7180看到j(luò)ava進(jìn)程監(jiān)聽(tīng) 7180就說(shuō)明 Server 起來(lái)了。這時(shí)候?yàn)g覽器訪問(wèn)http://server-ip:7180默認(rèn)用戶名和密碼是admin/admin首次登錄會(huì)強(qiáng)制改密碼改成自己的密碼并記住。Agent 的啟動(dòng)在每臺(tái)主機(jī)上都要做。把整個(gè)/opt/cm-5.14.2目錄同步到所有 Agent 機(jī)器后執(zhí)行/opt/cm-5.14.2/etc/init.d/cloudera-scm-agent start然后看/var/log/cloudera-scm-agent/cloudera-scm-agent.log確認(rèn) Agent 能連上 Server。我一般會(huì)在 Agent 機(jī)器上跑ps -ef | grep cloudera確認(rèn)進(jìn)程存在再通過(guò) Server 的界面上看主機(jī)列表里有沒(méi)有這臺(tái)的 IP。4. 配置集群Web 界面添加主機(jī)與分配服務(wù)4.1 登錄 Web 界面與接受協(xié)議用修改后的密碼登錄 CM 界面進(jìn)來(lái)后是授權(quán)協(xié)議頁(yè)。生產(chǎn)環(huán)境你要勾選“我已閱讀并同意”但這里有個(gè)細(xì)節(jié)如果導(dǎo)入了企業(yè)版 license它會(huì)有額外的激活步驟如果只是試用界面會(huì)提示“試用許可證已生效”。這個(gè)東西不影響功能驗(yàn)證填完主機(jī)信息后再激活也可以。接著填寫集群名稱。注意集群名不要帶中文和特殊字符后面生成的各種路徑和主機(jī)名拼接都會(huì)用到最好用簡(jiǎn)單英文比如cdh-cluster。4.2 主機(jī)發(fā)現(xiàn)與 Parcel 分發(fā)在“添加主機(jī)”這一步CM 會(huì)要求你輸入主機(jī)列表或 IP 范圍。我建議直接寫內(nèi)網(wǎng) IP比如192.168.10.[1-5]比用主機(jī)名靠譜。因?yàn)橹鳈C(jī)名解析如果沒(méi)配好CM 會(huì)通過(guò)反向解析拿到不同的名字導(dǎo)致 Agent 注冊(cè)錯(cuò)亂。填好主機(jī)后CM 會(huì)通過(guò)之前的免密登錄去檢測(cè)每臺(tái)機(jī)器的 Java 版本、內(nèi)存、磁盤等。這一步如果卡住基本都是免密沒(méi)配好或 sudo 權(quán)限不足。我遇到過(guò)最典型的cmuser的 sudoers 只允許執(zhí)行有限命令CM 需要用 superuser 權(quán)限去檢查/proc/meminfo結(jié)果失敗。所以 sudo 那行最好配NOPASSWD: ALL。主機(jī)檢測(cè)通過(guò)后界面會(huì)讓你選擇 CDH 版本。此時(shí) CM 會(huì)去指定倉(cāng)庫(kù)找 parcel。如果你已經(jīng)把 parcel 放到/opt/cloudera/parcel-repo/這里會(huì)自動(dòng)識(shí)別版本并開始分發(fā)到所有 Agent。分發(fā)過(guò)程會(huì)在每臺(tái)機(jī)器上解壓 parcel 到/opt/cloudera/parcels/日志在 Agent 的日志里可以看。4.3 服務(wù)分配與參數(shù)設(shè)定Parcel 分發(fā)完成后進(jìn)入服務(wù)分配頁(yè)面。CM 會(huì)推薦一個(gè)默認(rèn)分配比如把 NameNode 放在第一臺(tái)DataNode 放其他臺(tái)ResourceManager 和 SecondaryNameNode 也各自指定。我一般會(huì)先按推薦來(lái)跑通之后再調(diào)整。如果你有充足內(nèi)存可以一臺(tái)機(jī)器上同時(shí)跑多個(gè)角色但注意不要在同一臺(tái)上既放 NameNode 又放 ResourceManager兩者都是重內(nèi)存角色疊加容易 OOM。參數(shù)設(shè)定界面里有幾個(gè)必須改的DataNode 數(shù)據(jù)目錄默認(rèn)在/dfs/data要確認(rèn)磁盤掛載點(diǎn)有足夠空間。NameNode 元數(shù)據(jù)目錄默認(rèn)在/dfs/name也要檢查。YARN 虛擬內(nèi)存檢查CDH 默認(rèn)開啟虛擬內(nèi)存比例檢查如果你給容器分配的內(nèi)存超過(guò)物理內(nèi)存任務(wù)會(huì)被 kill。我通常會(huì)把yarn.nodemanager.vmem-check-enabled設(shè)為false。HDFS 塊大小默認(rèn) 128MB不用改。這些參數(shù)改好后點(diǎn)擊“繼續(xù)”CM 會(huì)開始創(chuàng)建角色實(shí)例并格式化 NameNode。格式化這一步會(huì)輸出大量日志最容易出的問(wèn)題是目錄權(quán)限不對(duì)。確認(rèn)/dfs/name屬主是hdfs用戶否則格式化會(huì)失敗。5. 避坑與常見(jiàn)問(wèn)題五個(gè)高頻翻車現(xiàn)場(chǎng)與排查方法5.1 現(xiàn)象一Agent 起不來(lái)日志里報(bào) Java 版本錯(cuò)誤Agent 啟動(dòng)瞬間退出日志文件/var/log/cloudera-scm-agent/cloudera-scm-agent.log顯示/usr/bin/java指向的是 JRE 1.7 或者 Java 環(huán)境變量沒(méi)找到。原因是 CM Agent 腳本會(huì)優(yōu)先讀JAVA_HOME其次讀PATH里的java。如果你用了系統(tǒng)自帶的openjdk它的路徑可能被硬編碼在腳本配置里。解決方法是在/etc/default/cloudera-scm-agent里顯式設(shè)置JAVA_HOME/usr/java/jdk1.8.0_202然后重啟服務(wù)。還要檢查which java的路徑確保JAVA_HOME/bin/java能執(zhí)行java -version且版本是 1.8。5.2 現(xiàn)象二數(shù)據(jù)庫(kù)驅(qū)動(dòng)找不到scm_prepare_database.sh報(bào)錯(cuò)ClassNotFoundException: com.mysql.jdbc.Driver。原因是 CM 自帶的驅(qū)動(dòng)包名可能帶版本號(hào)腳本只認(rèn)固定的mysql-connector-java.jar。解決去 MySQL 官網(wǎng)下載 5.1.48 的 jar重命名為mysql-connector-java.jar放到/opt/cm-5.14.2/share/cmf/lib/下再重新執(zhí)行腳本。注意權(quán)限屬主和權(quán)限要能讀。5.3 現(xiàn)象三主機(jī)時(shí)間不同步導(dǎo)致心跳丟失CM 界面上主機(jī)狀態(tài)一會(huì)兒顯示“良好”一會(huì)兒顯示“主機(jī)未聯(lián)系”Agent 日志里有NTP failed或心跳超時(shí)。原因是 CM 要求 Server 和 Agent 之間的時(shí)間差不能超過(guò) 5 秒時(shí)鐘漂移嚴(yán)重會(huì)把 Agent 誤判為其他主機(jī)。解決在所有機(jī)器上配置 NTP 服務(wù)或者更簡(jiǎn)單的方式是每 10 分鐘執(zhí)行一次ntpdate同步。我生產(chǎn)環(huán)境里會(huì)寫一個(gè) crontab*/10 * * * * /usr/sbin/ntpdate ntp-server /sbin/hwclock --systohc之后在 CM 主機(jī)管理里重新檢查一次狀態(tài)就恢復(fù)正常了。5.4 現(xiàn)象四Parcel 分發(fā)卡在 0%“分發(fā) Parcel”進(jìn)度條不動(dòng)Agent 日志里出現(xiàn)connection refused或transfer failed。原因是 CM Server 默認(rèn)用 7182 端口跟 Agent 通信但是 Agent 反向下載 parcel 時(shí)會(huì)用 8080 端口去 Server 的 web 服務(wù)器拉取文件。如果這個(gè)端口被防火墻擋了傳輸就會(huì)卡住。解決確認(rèn) Server 上的httpd服務(wù)或 CM 內(nèi)置的cmf-web服務(wù)監(jiān)聽(tīng)在 8080并且讓防火墻放行。另外確認(rèn) parcel 文件是否完整可以用openssl dgst -sha256對(duì)比 manifest 里記錄的哈希值。5.5 現(xiàn)象五NameNode 啟動(dòng)失敗元數(shù)據(jù)目錄權(quán)限錯(cuò)在服務(wù)啟動(dòng)步驟里NameNode 紅色報(bào)警日志顯示Permission denied或者java.io.IOException: Failed to load fs image file.原因是 CM 格式化 NameNode 時(shí)使用hdfs用戶但數(shù)據(jù)目錄創(chuàng)建時(shí)屬主是 root或者多次格式化后目錄里的current子目錄殘留了舊數(shù)據(jù)。解決先停掉 NameNode 服務(wù)然后清空元數(shù)據(jù)目錄rm -rf /dfs/name/* chown -R hdfs:hdfs /dfs/name chmod 700 /dfs/name再通過(guò) CM 界面重啟 NameNode如果不行就在 CM 的高級(jí)配置里勾選“格式化 NameNode”重新格式化。6. 進(jìn)階驗(yàn)證通過(guò) API 與日志體系確認(rèn)集群真正健康6.1 用 curl 檢查 CM API 狀態(tài)界面正常不代表 API 正常。我每次裝完都會(huì)跑一遍 CM 的 REST API確認(rèn)管理面和數(shù)據(jù)面都在線。先拿集群列表curl -u admin:your_password http://server-ip:7180/api/v5/clusters返回 JSON 包含集群名字和版本。再查主機(jī)狀態(tài)curl -u admin:your_password http://server-ip:7180/api/v5/hosts重點(diǎn)看healthSummary字段如果是GOOD就說(shuō)明所有 Agent 的心跳都正常。6.2 快速驗(yàn)證 HDFS 與 YARN 服務(wù)API 層面檢查完還要驗(yàn)證真正的讀寫。我一般會(huì)用hdfs dfs跑一個(gè)文件操作確認(rèn) HDFS 可用sudo -u hdfs hdfs dfs -mkdir /tmp/test sudo -u hdfs hdfs dfs -put /etc/hostname /tmp/test/hello.txt sudo -u hdfs hdfs dfs -cat /tmp/test/hello.txt能讀到內(nèi)容HDFS 才算活著。YARN 驗(yàn)證更簡(jiǎn)單sudo -u yarn yarn node -list能看到RUNNING狀態(tài)的節(jié)點(diǎn)說(shuō)明 ResourceManager 的調(diào)度鏈路沒(méi)問(wèn)題。6.3 我的收尾習(xí)慣這套 CM 5.14.2 裝好后我會(huì)強(qiáng)制做一遍日志和目錄的復(fù)查確認(rèn)/var/log/cloudera-scm-server和/var/log/cloudera-scm-agent沒(méi)有致命錯(cuò)誤再檢查dfs.name.dir和dfs.data.dir的磁盤余量。因?yàn)?CM 的日志輪轉(zhuǎn)默認(rèn)只在 100MB 自動(dòng)切分如果你日志增長(zhǎng)快建議在/etc/logrotate.d/cloudera-scm-server里把rotate設(shè)大一點(diǎn)。從那以后我每次部署完都收集一次cloudera-scm-agent.log的關(guān)鍵字防止有心跳斷線在后臺(tái)悄悄發(fā)生。希望這份拆包筆記能幫你把集群一次搭起來(lái)少踩幾個(gè)坑。本文還有配套的精品資源點(diǎn)擊獲取