avatar

目录
大数据常用框架源码编译

源码编译通用步骤

一、搭建编译环境

一般编译环境为Linux + JDK + Maven,有些框架可能需要别的环境支持,一般都会注明,在后面细说。以下教程都是基于Linux + JDK8环境编译。

  • Linux和JDK环境这里不再赘述

  • MAVEN环境搭建

    bash
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #1. 从apache网站拉取tar包并解压
    MVNTAR=$(curl http://maven.apache.org/download.cgi | grep -E ">apache-maven-.*bin\.tar\.gz<" | sed 's/.*a href="\(.*\)".*/\1/g')
    curl $MVNTAR | tar zxC /opt/module
    mv /opt/module/$(basename $MVNTAR | cut -d - -f 1,2,3) /opt/module/maven

    #2. 配置环境变量
    vim /etc/profile.d/my_env.sh

    #添加如下内容并保存退出
    export M2_HOME=/opt/module/maven
    export MAVEN_HOME=/opt/module/maven
    export PATH=${MAVEN_HOME}/bin:${PATH}

    完成后重启Xshell会话

二、下载源码

下载你想要编译的框架的源码。一般源码下载有两种方式:

  1. 想编译的版本已经发布release版,但是由于兼容性原因需要重新编译。这种情况直接从框架官网下载源码包并解压即可。
  2. 想测试框架还没发布的最新功能。此时从git托管服务器拉取最新源码,这时,我们需要git环境
  • Git环境搭建

    bash
    1
    2
    sudo yum install -y epel-release
    sudo yum install -y git
  • https://git-wip-us.apache.org/repos/asf 查看想要编译的框架的git服务器,拉取源码(以Hive为例)

    bash
    1
    2
    3
    4
    5
    6
    #新建源码存储目录
    mkdir -p /opt/software/source
    cd /opt/software/source

    #拉取源码
    git clone https://git-wip-us.apache.org/repos/asf/hive.git
  • 进入拉取的源码目录,切换到自己想要的分支

    bash
    1
    2
    3
    4
    5
    6
    #查看所有本地和远程分支,这里也可以切换到之前版本的分支
    cd hive
    git branch -a

    #新建本地分支同步远程分支
    git checkout -b 3.1 origin/branch-3.1
  • 如果想切换到特定release的源码,使用git tag命令

    bash
    1
    2
    3
    4
    5
    #查看所有tag
    git tag

    #切换到想要的tag,这里以release-3.1.2为例
    git checkout rel/release-3.1.2

三、查看编译说明

一般来说,源码根目录都会有building.txt之类的文件作为编译说明,如果没有找到,也可以去官网查看编译说明。说明里一般都会注明前置要求,例如一些额外的编译环境要求等。

Hive没有前置要求,我们直接进入第四步

四、对源码做必要修改

一般我们只有在框架不兼容的情况下我们需要重新编译,不兼容一般是由于框架依赖版本不一致造成的,一般我们只需要编辑框架的pom.xml文件修改依赖版本即可。但是有些依赖新版本和旧版本不兼容,此时我们就需要对源码进行更多的修改。这些修改最好在IDE中进行。

Hive的guava版本和Hadoop 3.1.3的不兼容,我们修改其为27.0-jre

xml
1
2
3
4

<guava.version>19.0</guava.version>
修改为
<guava.version>27.0-jre</guava.version>

这个依赖新老版本就不兼容,修改版本后我们需要对源码进行必要修改。详细修改步骤会在另外一篇教程中讲述

五、编译

准备工作全部做完,最后我们开始编译。一般的编译命令为:

bash
1
mvn clean package -Pdist -DskipTests -Dmaven.javadoc.skip=true

然后静待编译完成。这个过程会比较久,而且会从maven官网拉取大量jar包,所以要保证网络状况良好。

编译完成的Tar包的位置,各个框架都不一样,我们可以用下面的命令查找

bash
1
find ./ -name *.tar.gz

Hive编译

  • 拉取源码
bash
1
2
cd /opt/software/source
git clone https://git-wip-us.apache.org/repos/asf/hive.git
  • 修改pom.xml,将guava的版本改为如下版本
Code
1
<guava.version>27.0-jre</guava.version>
  • 修改以下文件中关于 com.google.common.util.concurrent.Futures#addCallback 的调用

    • src\java\org\apache\hadoop\hive\llap\AsyncPbRpcProxy.java
    java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //173行
    Futures.addCallback(
    future,
    new ResponseCallback<U>(
    request.getCallback(), nodeId, this)
    ,executor);

    //278行
    Futures.addCallback(requestManagerFuture, new FutureCallback<Void>() {
    @Override
    public void onSuccess(Void result) {
    LOG.info("RequestManager shutdown");
    }

    @Override
    public void onFailure(Throwable t) {
    if (!(t instanceof CancellationException)) {
    LOG.warn("RequestManager shutdown with error", t);
    }
    }
    }, requestManagerExecutor);
    • src\java\org\apache\hadoop\hive\llap\daemon\impl\AMReporter.java
    java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    //162行
    Futures.addCallback(queueLookupFuture, new FutureCallback<Void>() {
    @Override
    public void onSuccess(Void result) {
    LOG.info("AMReporter QueueDrainer exited");
    }

    @Override
    public void onFailure(Throwable t) {
    if (t instanceof CancellationException && isShutdown.get()) {
    LOG.info("AMReporter QueueDrainer exited as a result of a cancellation after shutdown");
    } else {
    LOG.error("AMReporter QueueDrainer exited with error", t);
    Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), t);
    }
    }
    }, queueLookupExecutor);

    //266行
    Futures.addCallback(future, new FutureCallback<Void>() {
    @Override
    public void onSuccess(Void result) {
    LOG.info("Sent taskKilled for {}", taskAttemptId);
    }

    @Override
    public void onFailure(Throwable t) {
    LOG.warn("Failed to send taskKilled for {}. The attempt will likely time out.",
    taskAttemptId);
    }
    }, executor);

    //331行
    Futures.addCallback(future, new FutureCallback<Void>() {
    @Override
    public void onSuccess(Void result) {
    // Nothing to do.
    }

    @Override
    public void onFailure(Throwable t) {
    QueryIdentifier currentQueryIdentifier = amNodeInfo.getQueryIdentifier();
    amNodeInfo.setAmFailed(true);
    LOG.warn("Heartbeat failed to AM {}. Marking query as failed. query={}",
    amNodeInfo.amNodeId, currentQueryIdentifier, t);
    queryFailedHandler.queryFailed(currentQueryIdentifier);
    }
    }, executor);
    • src\java\org\apache\hadoop\hive\llap\daemon\impl\LlapTaskReporter.java
    java
    1
    2
    //131行
    Futures.addCallback(future, new HeartbeatCallback(errorReporter), heartbeatExecutor);
    • src\java\org\apache\hadoop\hive\llap\daemon\impl\TaskExecutorService.java
    java
    1
    2
    3
    4
    5
    //178行
    Futures.addCallback(future, new WaitQueueWorkerCallback(), executionCompletionExecutorServiceRaw);

    //692行
    Futures.addCallback(future, wrappedCallback, executionCompletionExecutorService);
    • src\java\org\apache\hadoop\hive\llap\tezplugins\LlapTaskSchedulerService.java
    java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //747行
    Futures.addCallback(nodeEnablerFuture, new LoggingFutureCallback("NodeEnablerThread", LOG),nodeEnabledExecutor);

    //751行
    Futures.addCallback(delayedTaskSchedulerFuture,
    new LoggingFutureCallback("DelayedTaskSchedulerThread", LOG),delayedTaskSchedulerExecutor);

    //755行
    Futures.addCallback(schedulerFuture, new LoggingFutureCallback("SchedulerThread", LOG),schedulerExecutor);
    • src\java\org\apache\hadoop\hive\ql\exec\tez\WorkloadManager.java
    java
    1
    2
    3
    4
    5
    6
    7
    8
    //1089行
    Futures.addCallback(future, FATAL_ERROR_CALLBACK, timeoutPool);

    //1923行
    Futures.addCallback(getFuture, this,timeoutPool);

    //1977行
    Futures.addCallback(waitFuture, this, timeoutPool);
    • src\test\org\apache\hadoop\hive\ql\exec\tez\SampleTezSessionState.java
    java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //121行
    Futures.addCallback(waitForAmRegFuture, new FutureCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean result) {
    future.set(session);
    }

    @Override
    public void onFailure(Throwable t) {
    future.setException(t);
    }
    },timeoutPool);
  • 编译

bash
1
mvn clean package -Pdist -DskipTests -Dmaven.javadoc.skip=true

Tez编译

  • 拉取源码

    bash
    1
    2
    cd /opt/software/source
    git clone https://git-wip-us.apache.org/repos/asf/tez.git
  • 安装Tez必要环境

    bash
    1
    sudo yum install -y protobuf protobuf-static protobuf-devel
  • 编译

    查看编译说明,按照编译说明用下列命令编译

    bash
    1
    2
    cd tez
    mvn clean package -Dhadoop.version=3.1.3 -Phadoop28 -P\!hadoop27 -DskipTests -Dmaven.javadoc.skip=true

Phoenix编译

  • 拉取源码
bash
1
2
cd /opt/software/source
git clone https://git-wip-us.apache.org/repos/asf/phoenix.git
  • 编译
bash
1
2
cd phoenix
mvn clean package -DskipTests -Dhbase.profile=2.2 -Dhbase.version=2.2.4

Spark编译

  • 去spark官网下载源码,解压到/opt/software/source
  • 进入该目录,编译
bash
1
./dev/make-distribution.sh --name without-hive --tgz -Pyarn -Phadoop-3.1 -Dhadoop.version=3.1.3 -Pparquet-provided -Porc-provided -Phadoop-provided
文章作者: Yang4
文章链接: https://masteryang4.github.io/2020/06/07/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%B8%B8%E7%94%A8%E6%A1%86%E6%9E%B6%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MasterYangBlog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论