前提条件:除了基本环境外还需要依赖以下包:

1. 编译snappy-1.1.5

编译leveldbjni-all-1.8.jar之前,需要先将snappy和leveldb编译成静态库,再将两个静态库编译进leveldbjni.so里,最后生成leveldbjni-all-1.8.jar压缩包。
从github下载源码。
wget https://github.com/google/snappy/archive/1.1.5.tar.gz
解压源码包。
tar -zxvf 1.1.5.tar.gz
进入解压目录。
cd snappy-1.1.5
执行编译。
./autogen.sh
./configure —with-pic
make -j20
编译完成后,将在“snappy-1.1.5/.libs”目录下生成libsnappy.so和libsnappy.a文件,将libsnappy.a文件拷贝到上一级目录。
cp .libs/libsnappy.a ./
设置SNAPPY_HOME。
export SNAPPY_HOME=pwd

2. 编译leveldb-1.20

编译leveldbjni-all-1.8.jar之前,需要先将snappy和leveldb编译成静态库,再将两个静态库编译进leveldbjni.so里,最后生成leveldbjni-all-1.8.jar压缩包。
从github下载源码。
wget https://github.com/google/leveldb/archive/v1.20.tar.gz
解压源码包。
tar -zxvf v1.20.tar.gz
进入解压后目录。
cd leveldb-1.20
修改文件build_detect_platform,按照下图修改250至252行,其中第250-251行是修改原行内容,而第252行是新增行。
vim build_detect_platform
echo “PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS $PLATFORM_SHARED_CFLAGS” >> $OUTPUT echo “PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS $PLATFORM_SHARED_CFLAGS” >> $OUTPUT echo “PLATFORM_SHARED_CFLAGS=” >> $OUTPUT
image.jpeg
手动合入leveldb.so源码的patch,具体patch参考github提交
Patch的提交页面只显示了一个提交,本次提交的前一个代码提交中还有一个patch需要合入。
在“db/db_impl.cc”文件中,增加127至131行和1479至1511行。
image.jpeg

image.jpeg
在“db/db_impl.h”文件中,增加45至48行和141至148行
image.jpeg

image.jpeg
在“db/db_test.cc”文件中,增加1870至1873行
image.jpeg
在“include/leveldb/db.h”文件中,增加144至147行。
image.jpeg
执行编译
make -j20
编译完成后,将在“out-shared”目录下生成动态库libleveldb.so等,在out-static目录下生成libleveldb.a静态库和其它二进制文件。将out-static目录下的静态库拷贝到当前目录,并设置LEVELDB_HOME。
export LEVELDB_HOME=pwd
cp out-static/libleveldb.a ./
将静态库拷贝到对应目录,是为了后续将静态库编译进leveldbjni.so做准备。

3. 开始编译leveldbjni-all-1.8.jar

1.从github下载源码。
master分支支持aarch64,编译前需要修改pom.xml文件里面的版本号。
git clone https://github.com/fusesource/leveldbjni.git
2.进入当前目录,设置LEVELDBJNI_HOME。
cd leveldbjni
export LEVELDBJNI_HOME=pwd
3.修改pom.xml文件。
修改当前目录下的“pom.xml”文件。
注释无关操作系统类型(freebsd64、sunos64-amd64、sunos64-sparcv9、linux64-ppc64le),避免引起编译不通过。注释方法:在被注释掉的行的开头添加
image.jpeg

image.jpeg

增加第60、61行,将编译的目标module加入leveldbjni-all和linux64模块。
image.jpeg
修改“leveldbjni-linux64-aarch64/pom.xml”文件第77行为下图所示
image.jpeg
修改“leveldbjni-all/pom.xml”文件
注释无关操作系统类型(freebsd64、sunos64-amd64、sunos64-sparcv9、linux64-ppc64le),避免引起编译不通过。
注释dependency相关的依赖。
image.jpeg
注释build的native code部分:将SunOS、FreeBSD和processor = ppc64le部分(154-157行)提取到Bundle-Native Code标签页后面并注释,然后修改153行,将x86-64修改为aarch64,表明生成的leveldbjni-all-1.8.jar里面对应linux64目录下的so也为aarch64。后续在ambari的nodemanager启动过程中,默认使用的是该目录的so。
image.jpeg
修改所有“pom.xml”文件中的版本号,将所有“pom.xml”文件中的版本“99-master-SNAPSHOT”改为“1.8”。
sed -i ‘s/99-master-SNAPSHOT/1.8/g’ find . -name pom.xml
执行编译
mvn clean package -P download -P linux64-aarch64 -DskipTests
image.jpeg
修改leveldb项目文件“include/leveldb/slice.h”的源码,将变量暂时修改为公有的。
image.jpeg