1. 程式人生 > >spark2.3安裝以及遇到的一些坑

spark2.3安裝以及遇到的一些坑

最近公司的基於CDH的Hadoop大資料計算平臺需要遷移,由於時間過長,原來的搭建步驟以及踩過的坑都忘得差不多了,現在為了將來能夠有個依據,特將本次重新搭建平臺所踩的坑給記錄下來。

    使用的軟體及版本:

        CDH-5.14.2-1.cdh5.14.2.p0.3

        jdk1.8.0_171

        Spark2.3

    下面記錄的是一些上面那篇檔案中沒有談到的一些問題,也就是我所碰到的另外的一些坑的處理辦法。

    1.新增Cloudera資料來源

    在安裝的第一步更新源的過程中,需要選擇適合自己linux版本的cloudear.list,如我的ubuntu是xenial,因而我選擇的是http://archive.cloudera.com/cm5/ubuntu/xenial/amd64/cm/cloudera.list,並儲存在目錄/etc/apt/sources.list.d中,在執行系統更新命令"apt update && apt upgrade"之前,需要把archive.key取下來,我的對應的是http://archive.cloudera.com/cm5/ubuntu/xenial/amd64/cm/archive.key,並通過命令"apt-key add archive.key"將其key新增到系統中。

2.手動安裝JDK1.8

如果只想使用CDH當前自帶的Spark1.6,那麼可以不用安裝JDK1.8,安裝JDK1.7即可,如果需要使用Spark2.3(後面有如何安裝),則需要安裝JDK1.8,否則後面想使用的時候再來修改叢集中的JDK,那會碰到很多莫名的問題,別問我為什麼知道。

安裝JDK1.8最好是從Oracle官方下載,然後解壓到/usr/lib/jvm目錄中,並在/etc/profile中增加上JAVA_HOME變數並把bin目錄加到PATH中:
  1. JAVA_HOME=/usr/lib/jvm/jdk1.8.0_171
  2. PATH=$JAVA_HOME/bin:$PATH
  3. export PATH JAVA_HOME
    為了防止其它問題的發生,最好建立如下的軟連結:

  1. ln -s /usr/lib/jvm/jdk1.8.0_171 /etc/alternatives/java
  2. ln -s /etc/alternatives/java /usr/bin/java
  3. ln -s /usr/bin/java /bin/java

    3.修改SCM的模式為生產模式

    修改scm的資料庫為外部資料庫,這樣做的目的是不使用其自帶的資料庫,以避免SCM控制檯提示非生產環境,也可以避免以後將資料從自帶的資料庫遷移到外面,當然資料也確實會更加安全。

    相關參考:https://www.cloudera.com/documentation/enterprise/latest/topics/cm_ig_installing_configuring_dbs.html#cmig_topic_5_2

    1)準備好外部可用的資料庫:
  1. create database scm default character set utf8;
  2. grant all privileges on scm.* to 'scm'@'%' by 'scm';
  3. flush privileges;
    2)然後執行資料庫初使化(在執行資料庫初使用指令碼之前,需要先安裝後JDK):    
/usr/share/cmf/schema/scm_prepare_database.sh mysql -h db_server scm scm scm

    命令的使用方法,可直接輸入scm_prepare_database.sh不帶引數,會有提示。

    4.安裝mysql的jdbc驅動
    在上面的提到的參考文章中的安裝過程的第5步啟動cloudera manager過後,可能無法訪問7180埠,此時檢視cloudera的日誌檔案,其存放於/var/log/cloudera-scm-server目錄下,會發現“JDBC Driver class not found: com.mysql.jdbc.Driver” 這樣的錯誤,這是沒有找到對應的mysql jdbc connector,解決方案是通過如下命令安裝mysql的java驅動:
apt install libmysql-java
    然後安裝的搜尋出來的libmysql-java解決的問題。

    5.準備spark2.3的相關的包

    將spark2.3的paralles放到cloudera對應的目錄下,以便於cdh可以正確發現該包,並可以執行安裝。為了簡化,我使用以下命令處理:    

  1. cd /opt/cloudera/csd
  2. wget http://archive.cloudera.com/spark2/csd/SPARK2_ON_YARN-2.3.0.cloudera2.jar
  3. cd /opt/cloudera/parcel-repo
  4. wget http://archive.cloudera.com/spark2/parcels/2.3.0.cloudera2/SPARK2-2.3.0.cloudera2-1.cdh5.13.3.p0.316101-xenial.parcel
  5. wget http://archive.cloudera.com/spark2/parcels/2.3.0.cloudera2/SPARK2-2.3.0.cloudera2-1.cdh5.13.3.p0.316101-xenial.parcel.sha1
  6. wget http://archive.cloudera.com/spark2/parcels/2.3.0.cloudera2/manifest.json
  7. mv SPARK2-2.3.0.cloudera2-1.cdh5.13.3.p0.316101-xenial.parcel.sha1 SPARK2-2.3.0.cloudera2-1.cdh5.13.3.p0.316101-xenial.parcel.sha

    以上命令在每臺伺服器上都要執行,並且一定要在CM的管理控制檯Hosts->Parcels中找到Spark2,並點選Distribute,分發完成後,再點選Active,然後才能夠在CM中增加該服務

    6.重新安裝Cloudera服務可能會碰到的一些問題

    在某些情況下,叢集可能需要重灌,有甚至於整個Cloudera服務都需要刪除過後再重灌,但是重灌並不是我們想像中的那麼簡單,它甚至於第一次安裝都更有可能碰到莫名的問題,以下是我所碰到一些莫名問題的記錄。

    1)啟動scm服務時找不到JAVA_HOME
    操作步驟:
    安裝cloudera manager service後執行啟動scm服務的命令:    
service cloudera-scm-server start
    在scm server的日誌檔案中報找不到JAVA_HOME的錯誤"Error: JAVA_HOME is not set and Java could not be found",但是系統確實是設定了JAVA_HOME,通過echo $JAVA_HOME也可以看到
    解決辦法:
    通過修改/etc/default/cloudera-scm-server該檔案,在其中增加上JAVA_HOME,如下:    
export JAVA_HOME="/usr/lib/jvm/jdk1.8.0_171"

    再次啟動服務就正常了。

    2)在scm的web控制檯安裝新的叢集時,填入應用如hive等外部資料庫的連結時,點測試連結提示無法連結。
    這種情況會有兩個錯誤:
    a)沒有安裝mysql把jdbc驅動,這種錯誤可以通過在每臺伺服器上執行以下安裝命令即可解決問題:    
apt install libmysql-java
    b)明明有安裝jdk,也有配置JAVA_HOME,但是卻提示找不到java
    通過檢視日誌,agent會在/usr/lib/jvm目錄下遍歷一些jdk的目錄,如下:
  1. 2018-05-24 03:16:55,668 INFO CommandPusher:com.cloudera.cmf.service.AbstractDbConnectionTestCommand: ++ ls -rvd '/usr/lib/jvm/java-openjdk*'
  2. + for candidate_regex in '${JAVA_HOME_CANDIDATES[@]}'
  3. ++ ls -rvd '/usr/lib/jvm/jre-openjdk*'
  4. + for candidate_regex in '${JAVA_HOME_CANDIDATES[@]}'
  5. ++ ls -rvd '/usr/lib/jvm/java-1.7.0-openjdk*'
  6. + for candidate_regex in '${JAVA_HOME_CANDIDATES[@]}'
  7. ++ ls -rvd '/usr/lib/jvm/java-7-openjdk*'
  8. + for candidate_regex in '${JAVA_HOME_CANDIDATES[@]}'
  9. ++ ls -rvd '/usr/lib/jvm/java-1.8.0-openjdk*'
  10. + for candidate_regex in '${JAVA_HOME_CANDIDATES[@]}'
  11. ++ ls -rvd /usr/lib/jvm/java-8-openjdk
  12. + for candidate in '`ls -rvd ${candidate_regex}* 2>/dev/null`'
  13. + '[' -e /usr/lib/jvm/java-8-openjdk/bin/java ']'
  14. + export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
  15. + JAVA_HOME=/usr/lib/jvm/java-8-openjdk
    從上面的日誌可以看出,它會嘗試讀取一些JDK的安裝目錄,但我安裝的是jdk1.8.0_171,並不在它檢查的列表裡面,此時解決的辦法也簡單,在/usr/lib/jvm下面,給其檢查列表中的JDK增加一個軟連結即可,每臺伺服器執行以下命令:
  1. cd /usr/lib/jvm
  2. ln -s jdk1.8.0_171 java-8-openjdk
    3)在web控制檯檢視伺服器狀態時,提示有些伺服器的狀態是“Host is in bad health”
    通過檢視該臺伺服器scm agent的日誌,發現其中有報如下錯誤:
MainThread agent        ERROR    Error, CM server guid updated, expected 348656e4-51b5-4d77-b056-181ff1f70c54, received 78e112e3-4c6f-46d0-b141-bec649b737c5
    解決方法如下:
    a)停止agent服務    
service service-scm-agent stop
    b)刪除原來的cm_guid(不同版本的scm,這個檔案的位置可能不一樣,可以通過檢視命令的找出來:find / -name cm_guid)    
rm /var/lib/cloudera-scm-agent/cm_guid
    c)啟動agent服務    
service service-scm-agent start

    7.其它一些伺服器準備的指令碼   

    1)建立外部資料庫(SQL指令碼)
  1. create database scm default character set utf8;
  2. create database hive default character set utf8;
  3. create database hue default character set utf8;
  4. create database amon default character set utf8;
  5. create database rman default character set utf8;
  6. create database oozie_oozie_server default character set utf8;
  7. create database navms default character set utf8;
  8. grant all privileges on scm.* to 'scm'@'%' identified by 'scm';
  9. grant all privileges on hive.* to 'hive'@'%' identified by 'hive';
  10. grant all privileges on hue.* to 'hue'@'%' identified by 'hue';
  11. grant all privileges on amon.* to 'amon'@'%' identified by 'amon';
  12. grant all privileges on rman.* to 'rman'@'%' identified by 'rman';
  13. grant all privileges on oozie_oozie_server.* to 'oozie'@'%' identified by 'oozie';
  14. grant all privileges on navms.* to 'navms'@'%' identified by 'navms';
    2)在每臺伺服器上執行硬碟格式化和掛載,這裡的硬碟是/dev/xvdb,如果是其它位置根據情況調整
  1. mkfs.ext4 /dev/xvdb
  2. mkdir /data
  3. mount /dev/xvdb /data
  4. echo "/dev/xvdb /data ext4 defaults 0 0" >> /etc/fstab
    3)設定伺服器的名稱(每臺伺服器執行命令帶不同的引數,這裡可以不用執行,預設伺服器的名稱就類似如下的)
  1. hostnamectl set-hostname ip-172-31-16-71
  2. hostnamectl set-hostname ip-172-31-20-195
  3. hostnamectl set-hostname ip-172-31-31-194
  4. hostnamectl set-hostname ip-172-31-19-103
  5. hostnamectl set-hostname ip-172-31-28-125
  6. hostnamectl set-hostname ip-172-31-24-50
  7. hostnamectl set-hostname ip-172-31-24-63
  8. hostnamectl set-hostname ip-172-31-31-193
  9. hostnamectl set-hostname ip-172-31-22-39
  10. hostnamectl set-hostname ip-172-31-31-171
    4)增加控制swap的引數
  1. echo "vm.swappiness=0" >> /etc/sysctl.conf
  2. sysctl -p
    5)增加hosts配置(伺服器的IP和名稱情況實際情況調整),在每臺伺服器上面都執行
  1. echo "" >> /etc/hosts
  2. echo "172.31.16.71 ip-172-31-16-71 bigdata-1" >> /etc/hosts
  3. echo "172.31.20.195 ip-172-31-20-195 bigdata-2" >> /etc/hosts
  4. echo "172.31.31.94 ip-172-31-31-194 bigdata-3" >> /etc/hosts
  5. echo "172.31.19.103 ip-172-31-19-103 bigdata-4" >> /etc/hosts
  6. echo "172.31.28.125 ip-172-31-28-125 bigdata-5" >> /etc/hosts
  7. echo "172.31.24.50 ip-172-31-24-50 bigdata-6" >> /etc/hosts
  8. echo "172.31.24.63 ip-172-31-24-63 bigdata-7" >> /etc/hosts
  9. echo "172.31.31.193 ip-172-31-31-193 bigdata-8" >> /etc/hosts
  10. echo "172.31.22.39 ip-172-31-22-39 bigdata-9" >> /etc/hosts
  11. echo "172.31.31.171 ip-172-31-31-171 bigdata-10" >> /etc/hosts