轉載自鯤鵬論壇
今天為大家分享的是一家專業從事工業互聯網關鍵技術,產品開發的全棧解決方案供應商,致力於工業制造直接的工業互聯網應用以及工業企業大數據服務為兩大核心業務,在進行鯤鵬遷移時,遇到的問題及經驗分享。
首先是大數據組件CDH的編譯安裝。CDH是用Java編寫的,默認配置是在x86的機器上運行,需要進行修改才能在鯤鵬雲服務器上運行。在修改過程中遇到不少坑,在這分享一下踩坑經歷,以供各位參考。
CDH是Apache Hadoop和相關項目的最完整,經過測試的流行發行版。 CDH提供了Hadoop的核心元素 - 可擴展的存儲和分布式計算 - 以及基於Web的用戶界面和重要的企業功能。 CDH是Apache許可的開放源碼,是唯一提供統一批處理,交互式SQL和交互式搜索以及基於角色的訪問控制的Hadoop解決方案。
環境信息:
類別 |
子項 |
版本 |
OS |
CentOS |
7.5 |
Kernel |
4.14 |
|
軟件 |
CDH-hadoop |
hadoop-2.6.0-cdh5.13.3 |
Maven |
3.5.4 |
|
Ant |
1.9.4 |
|
Git |
1.8.3.1 |
|
GCC |
4.8.5 |
|
Cmake |
3.11.2 |
|
JDK |
1.8 |
依賴安裝
yum -y install gcc-c++ autoconf automake libtool cmake svn openssl-devel ncurses-devel
組件編譯安裝
下載安裝包
1、安裝jdk-1.8.0
參考《華為雲鯤鵬雲服務最佳實踐-JDK-1.8.0 安裝配置指南》
2、安裝Maven
簡介:通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件。
安裝軟件:apache-maven-3.5.4-bin.tar.gz
wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
解壓
tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /opt/ClouderaHadoopTAR/
配置mvn的環境變量
1 vim/etc/profile 2 3 export M2_HOME=/opt/ClouderaHadoopTAR/apache-maven-3.5.4 4 5 export PATH=$M2_HOME/bin:$PATH
source /etc/profile
測試是否安裝完成
mvn -v
3、安裝Findbugs
安裝軟件:findbugs-3.0.1.tar.gz
wget http://prdownloads.sourceforge.net/findbugs/findbugs-3.0.1.tar.gz
解壓
tar -zxvf findbugs-3.0.1.tar.gz -C /usr/local/hadoopapps/findbugs/
配置Findbugs環境變量
1 export FINDBUGS_HOME=/usr/local/hadoopapps/findbugs/findbugs-3.0.1/ 2 3 export PATH=$PATH:$FINDBUGS_HOME/bin
使環境變量生效
source /etc/profile
測試是否安裝成功
findbugs -version
4、安裝ProtocolBuffer
直接用yum安裝
yum install protobuf-compiler.aarch64
測試是否安裝成功
protoc --version
5、安裝Snappy
簡介:Snappy 是一個 C++ 的用來壓縮和解壓縮的開發包。
安裝軟件:snappy-1.1.3.tar.gz
wget https://github.com/google/snappy/releases/download/1.1.3/snappy-1.1.3.tar.gz
解壓
tar -zxvf snappy-1.1.3.tar.gz
進入snappy目錄
cd snappy-1.1.3/
編譯安裝
1 ./configure 2 3 make 4 5 make install
測試是否安裝成功,查看snappy文件庫
ls -lh /usr/local/lib | grep snappy
相關依賴安裝完之后,就可以開始編譯CDH了。
編譯要求:hadoop-2.6.0-cdh5.13.3
wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.13.3.tar.gz
解壓
tar -zxvf hadoop-2.6.0-cdh5.13.3.tar.gz
進入hadoop-2.6.0-cdh5.13.3目錄
cd hadoop-2.6.0-cdh5.13.3/src #pom.xml所在同級目錄
使用JDK8需要改動的地方
(1)修改Hadoop依賴的JDK版本
sed -i "s/1.7/1.8/g" `grep javaVersion -rl /usr/local/src/hadoop-2.6.0-cdh5.13.3/pom.xml`
否則會報以下錯誤
1 [WARNING] Rule 1: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message: 2 3 Detected JDK Version: 1.8.0-131 is not in the allowed range [1.7.0,1.7.1000}].
(2)替換依賴的jdk.tools版本
sed -i "s/1.7/1.8/g" `grep 1.7 -rl /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/pom.xml`
否則會報以下錯誤
1 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project hadoop-annotations: Compilation failure: Compilation failure: 2 3 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/src/main/java/org/apache/hadoop/classification/tools/ExcludePrivateAnnotationsJDiffDoclet.java:[20,22] error: package com.sun.javadoc does not exist 4 5 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/src/main/java/org/apache/hadoop/classification/tools/ExcludePrivateAnnotationsJDiffDoclet.java:[21,22] error: package com.sun.javadoc does not exist 6 7 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/src/main/java/org/apache/hadoop/classification/tools/ExcludePrivateAnnotationsJDiffDoclet.java:[22,22] error: package com.sun.javadoc does not exist 8 9 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/src/main/java/org/apache/hadoop/classification/tools/ExcludePrivateAnnotationsJDiffDoclet.java:[35,16] error: cannot find symbol 10 11 [ERROR] symbol: class LanguageVersion 12 13 [ERROR] location: class ExcludePrivateAnnotationsJDiffDoclet
(3)替換不規范的字符
sed -i "s/<\/ul>//g" `grep "</ul>" -l /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/src/main/java/org/apache/hadoop/classification/InterfaceStability.java`
否則會報以下錯誤
1 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.8.1:jar (module-javadocs) on project hadoop-annotations: MavenReportException: Error while creating archive: 2 [ERROR] Exit code: 1 - /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/src/main/java/org/apache/hadoop/classification/InterfaceStability.java:27: error: unexpected end tag: </ul> 3 [ERROR] * </ul> 4 [ERROR] ^ 5 [ERROR] 6 [ERROR] Command line was: /usr/local/jdk1.8.0_131/jre/../bin/javadoc @options @packages 7 [ERROR] 8 [ERROR] Refer to the generated Javadoc files in '/usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-annotations/target' dir. 9 [ERROR]
(4)關閉DocLint特性
Java 8 新增了DocLint特性,這個特性主要是在開發階段生產javadoc文檔之前就檢查Javadoc注釋的錯誤,並且鏈接到源代碼。如果javadoc的注釋有錯誤,不生產javadoc。
默認情況下DocLint功能是開啟的,在配置里添加-Xdoclint:none可以關閉這個功能,生成javadoc就不會做檢查。
vim /usr/local/src/hadoop-2.6.0-cdh5.13.3/pom.xml
(5)在<properties></properties>之間添加如下屬性
<additionalparam>-Xdoclint:none</additionalparam>
否則會報以下錯誤
1 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.8.1:jar (module-javadocs) on project hadoop-nfs: MavenReportException: Error while creating archive: 2 3 [ERROR] Exit code: 1 - /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/RpcCallCache.java:126: warning: no @return 4 5 [ERROR] public String getProgram() { 6 7 [ERROR] ^ 8 9 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-common-project/hadoop-nfs/src/main/java/org/apache/hadoop/oncrpc/RpcCallCache.java:131: warning: no @param for clientId
(6)修復bug
參考鏈接https://issues.apache.org/jira/browse/YARN-3400
替換兩個文件:
./hadoop-2.6.0-cdh5.13.3/src/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/src/lib/primitives.h
. /hadoop-2.6.0-cdh5.13.3/src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java
替換文件請見附件,由於文件上傳限制,需要修改文件名,分別改為primitives.h和RPCUtil.java
否則會報
1 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project hadoop-yarn-common: Compilation failure: Compilation failure: 2 3 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java:[101,10] error: unreported exception Throwable; must be caught or declared to be thrown 4 5 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java:[104,10] error: unreported exception Throwable; must be caught or declared to be thrown 6 7 [ERROR] /usr/local/src/hadoop-2.6.0-cdh5.13.3/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java:[107,10] error: unreported exception Throwable; must be caught or declared to be thrown
(7)安裝protobuf
版本必須與Hadoop一致,否則會報錯
1 WARNING] [protoc, --version] failed: java.io.IOException: Cannot run program "protoc": error=2, No such file or directory 2 3 [ERROR] stdout: []
查看Hadoop版本中指定的protobuf版本
1 grep "<cdh.protobuf.version>" /root/.m2/repository/com/cloudera/cdh/cdh-root/5.13.3/cdh-root-5.13.3.pom 2 3 <cdh.protobuf.version>2.5.0</cdh.protobuf.version>
替換yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
執行命令進行編譯
mvn package -DskipTests -Pdist,native -Dtar -Dsnappy.lib=/usr/local/lib -Dbundle.snappy -Dmaven.javadoc.skip=true
編譯結果位於./hadoop-dist/target/
hadoop-2.6.0-cdh5.13.3.tar.gz是壓縮包
hadoop-2.6.0-cdh5.13.3是文件夾
1.編譯時可能會遇到javah錯誤
配置JAVA_HOME路徑即可
2.checksum.cc文件的問題
注釋掉硬件CRC32的實現,使用軟件實現方式
修改/opt/hadoop-2.6.0-cdh5.13.3/src/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/src/util/Checksum.cc
注釋掉582行,583,584行,即可繼續編譯.
編譯libtorrent-rasterbar.so
1.安裝依賴
yum install -y boost boost-devel
2.下載源碼
wget https://github.com/arvidn/libtorrent/releases/download/libtorrent-1_0_6/libtorrent-rasterbar-1.0.6.tar.gz
3.編譯源碼
1 tar -zxvf libtorrent-rasterbar-1.0.6.tar.gz 2 3 cd libtorrent-rasterbar-1.0.6 4 5 ./configure 6 7 make -j4 8 9 make install
通過swig將c/c++封裝成python可調用的so動態鏈接庫4.找到libtorrent-rasterbar.so文件
1.安裝swig
yum install -y swig
2.下載源碼
git clone https://github.com/AGWA/parentdeathutils.git
3.改寫源碼
1 cd parentdeathutils 2 3 cp diewithparent.c diewithparent.i 4 5 vim diewithparent.i 6 7 /***在文件頭部添加如下內容***/ 8 9 %module diewithparent 10 11 %{ 12 13 #define SWIG_FILE_WITH_INIT 14 15 #include <sys/prctl.h> 16 17 #include <signal.h> 18 19 #include <unistd.h> 20 21 #include <stdio.h> 22 23 #include <stdlib.h> 24 25 %}
4.建python模塊,利用-python參數執行swig
swig -python diewithparent.i
執行完命令后生成兩個不同的文件:diewithparent_wrap.c和diewithparent.py
5.利用distutils生成動態庫
先定義一個配置文件,命名為setup.py
vim setup.py
setup.py內容如下:
1 # -*- coding: utf-8 -* 2 3 from distutils.core import setup, Extension 4 5 6 7 diewithparent_module = Extension('_diewithparent',sources=['diewithparent_wrap.c','diewithparent.c'],) 8 9 setup (name='diewithparent',version='1.0',author="SWIG Docs",description="""Simple swig diewithparent from docs""",ext_modules = [diewithparent_module],py_modules = ["diewithparent"],)
6.生成_diewithparent.so動態庫
python setup.py build_ext --inplace
作者:南七技校林書豪