mac-hadoop3.3.6 源码构建以及踩坑记录

1. 为什么需要构建源码

因为hadoop的可执行文件 是在专门的机器上编译的 其中native库 不一定能适用于每个机器 导致在启动hadoop过程中 出现烦人的警告 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

如何说 为了解决 警告的话 可以直接使用已经编译好的库 GitHub地址: https://github.com/silent-night-no-trace/mac-native-hadoop-library
另外使用说明也在文档中可以找到

特殊说明: 解决这个 警告问题 可以直接参考文档: https://blog.csdn.net/a15835774652/article/details/135649394

2. 构建准备

  • 下载源码 https://github.com/apache/hadoop/releases/tag/rel%2Frelease-3.3.6
    直接下载链接地址 :https://github.com/apache/hadoop/archive/refs/tags/rel/release-3.3.6.zip
  • 导入到idea 或者其他的工具

3. 环境准备

解压后的源码导入idea 在根目录下 有个BUILDING.txt
我们直接参考这个编译

  • Unix System
  • JDK 1.8 (最好是)
  • Maven 3.3 or later
  • Protocol Buffers 3.7.1 (if compiling native code)
  • CMake 3.1 or newer (if compiling native code)
  • Zlib devel (if compiling native code)
  • Cyrus SASL devel (if compiling native code)
  • One of the compilers that support thread_local storage: GCC 4.8.1 or later, Visual Studio,
    Clang (community version), Clang (version for iOS 9 and later) (if compiling native code)
  • openssl devel (if compiling native hadoop-pipes and to get the best HDFS encryption performance)
  • Linux FUSE (Filesystem in Userspace) version 2.6 or above (if compiling fuse_dfs)
  • Doxygen ( if compiling libhdfspp and generating the documents )
  • Internet connection for first build (to fetch all Maven and Hadoop dependencies)
  • python (for releasedocs)
  • bats (for shell code testing)
  • Node.js / bower / Ember-cli (for YARN UI v2 building)

因为我们要编译native源码 所以 标记 if compiling native code 这个都需要安装
可以直接使用homebrew来安装 但是需要注意强调的版本

Building on macOS (without Docker)


Installing required dependencies for clean install of macOS 10.14:

  • Install Xcode Command Line Tools
    $ xcode-select --install
  • Install Homebrew
    $ /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
  • Install OpenJDK 8
    $ brew tap AdoptOpenJDK/openjdk
    $ brew cask install adoptopenjdk8
  • Install maven and tools
    $ brew install maven autoconf automake cmake wget
  • Install native libraries, only openssl is required to compile native code,
    you may optionally install zlib, lz4, etc.
    $ brew install openssl
  • Protocol Buffers 3.7.1 (required to compile native code)
    $ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protobuf-java-3.7.1.tar.gz
    $ mkdir -p protobuf-3.7 && tar zxvf protobuf-java-3.7.1.tar.gz --strip-components 1 -C protobuf-3.7
    $ cd protobuf-3.7
    $ ./configure
    $ make
    $ make check
    $ make install
    $ protoc --version

Note that building Hadoop 3.1.1/3.1.2/3.2.0 native code from source is broken
on macOS. For 3.1.1/3.1.2, you need to manually backport YARN-8622. For 3.2.0,
you need to backport both YARN-8622 and YARN-9487 in order to build native code.

4. 源码修改

  • 修改主pom 仓库修改为阿里云仓库
    项目根目录下的 pom.xml 在 repositories 第一个位置新增阿里云仓库

    <repository>
       <id>maven-ali</id>
       <url>https://maven.aliyun.com/repository/public</url>
       <releases>
         <enabled>true</enabled>
       </releases>
       <snapshots>
         <enabled>true</enabled>
         <updatePolicy>always</updatePolicy>
         <checksumPolicy>fail</checksumPolicy>
       </snapshots>
     </repository>
    
  • 修改 hadoop-common-project/hadoop-common/src/main/native/src/exception.c

    # 删除下面代码
    || defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 32)
    
  • 修改 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/container-executor.c

# 在头部添加一行
#include <sys/ioctl.h>
  • 修改 hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/src/lib/MapOutputCollector.cc
    需要在PRIu64宏和字符串文字之间添加空格 (注意每个PRIu64地方都需要按照如下进行改动)示例 如下
    # 修改前
    LOG("%s-spill: { id: %d, collect: %"PRIu64" ms, "
    # 修改后 
    LOG("%s-spill: { id: %d, collect: %" PRIu64 " ms, "
    
  • 修改 hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/src/util/StringUtil.cc
    需要在PRIu64宏和字符串文字之间添加空格 (注意每个PRIu64地方都需要按照如下进行改动)示例 如下
    # 修改后
    snprintf(tmp, 32, "%"PRIu64, v);
    # 修改后 
    snprintf(tmp, 32, "%" PRIu64, v);
    

5. 执行构建

# brew安装的openssl 快捷查看安装位置
brew --prefix openssl

# 官方推荐的执行命令/usr/local/opt/openssl 修改为自己的openssl路径
mvn package -Pdist,native -DskipTests -Dmaven.javadoc.skip \
    -Dopenssl.prefix=/usr/local/opt/openssl
# 遇到编译错误的话,修改后 可以直接从 指定项目开始编译 
#  直接编译 hadoop-yarn-server-nodemanager的native库
mvn clean package -Dmaven.javadoc.skip=true -Pdist,native -DskipTests -Dtar -rf :hadoop-yarn-server-nodemanager
# 直接编译 map reduce的native库
mvn clean package -Dmaven.javadoc.skip=true -Pnative -DskipTests -Dtar -rf :hadoop-mapreduce-client-nativetask

# 增加 编译的详细日志 方便排查问题  
mvn clean package -e -X -Pdist,native -DskipTests -Dmaven.javadoc.skip -Dopenssl.prefix=/usr/local/bin/openssl

然后就等待编译 大概10来分钟
最后 这里
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/runc/runc.c
会报错 提示 linux/loop.h 不存在 这肯定是不存在的 linux特有的库
然后注释到在 运行 可能就会 提示 openssl/evp.h 不存在 可能是个bug 这个路径已经正确配置了。 也是找不到

虽然说 编译没有完成 但是我们要hadoop-common 和 hadoop-hdfs的 native文件 已经编译好了

另外 mapreduce的native 编译 可以直接编译 hadoop-mapreduce-client-nativetask 这个项目
执行如下命令

mvn clean package -Dmaven.javadoc.skip=true -Pnative -DskipTests -Dtar -rf :hadoop-mapreduce-client-nativetask

当编译到 如下图的时候 即可 停止
在这里插入图片描述
完成编译图 如下 还是推荐提前就停止 可以看到完整的编译这部分 mapreduce native 耗时还是比较久的
在这里插入图片描述

当mapreduce-examples 执行完后 说明编译的native库 已经通过测试 可以使用了

6. 使用

到这里我们完成了 3个 主要项目的native库 分别是hadoop-common hadoop-hdfs hadoop-mapreduce 其中 yarn项目 因为涉及到修改源码并未完成编译

建议将原有的native库 $HADOOP_HOME/lib/native/ 备份下

# 拷贝 hadoop-common 的native文件 到hadoop 目录
cp hadoop-common-project/hadoop-common/target/native/target/usr/local/lib/*  $HADOOP_HOME/lib/native/

# 拷贝hadoop hdfs native到 hadoop的lib/native目录
cp hadoop-hdfs-project/hadoop-hdfs-native-client/target/native/target/usr/local/lib/*   $HADOOP_HOME/lib/native/

# 拷贝 mapreduce的native库
cp hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/target/native/target/usr/local/lib/* $HADOOP_HOME/lib/native/

然后在进行检查 本地库支持信息

# 查看 Hadoop 支持的本地库信息:
$HADOOP_HOM/Ebin/hadoop checknative -a

效果图如下 发现已经hadoop本地的库 已经被加载到了 以及 zlib zstd
在这里插入图片描述

7. 遗留的编译问题

  • hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/runc/runc.c 中的 linux/loop.h 文件不存在 以及相应的代码修改
  • hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl/runc/runc.c 中的 openssl/evp.h 文件不存在,但是本机上 openssl3已经正确配置了。

8. 总结

  • 非必要不进行编译源码 尤其是在mac上
  • 如果使用的 ubuntu的可视化linux 系统 或者纯正的linux上 可以尝试编译
  • 另外搭建hadoop环境的话 搭建伪集群就可以 直接运行 需要docker环境 另外可能要修改 Dockerfile文件 可直接执行 源码根目录下的 start-build-env.sh 脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/335740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测

分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测 目录 分类预测 | Matlab实现WOA(海象)-XGboost分类【24年新算法】基于海象优化算法(WOA)优化XGBoost的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本…

mariadb数据库从入门到精通

mariadb数据库的安装以及安全初始化 mariadb数据库的安装以及安全初始化 mariadb数据库的安装以及安全初始化一、实验前提二、mariadb数据库的安装三、mariadb数据库安全初始化3.1 设定数据库基本的安全初始化3.2关闭对外开放端口 系列文章目录一、查看数据库二、进入库并且查看…

什么是安全SCDN,有什么作用?

前两天有个站长被朋友推荐联系到了德迅云安全&#xff0c;想要对自己网站做一些安全防护&#xff0c;聊天中问及到了安全SCDN是什么意思&#xff0c;有哪些作用&#xff1f;那么德迅云安全今天就来简单讲述一下安全SCDN&#xff0c;来了解下什么是安全SCDN&#xff0c;以及它有…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器&#xff0c;有时候需要启动SSH会话&#xff0c;启动的时候发现没反应&#xff0c;且事件日志显示&#xff1a;无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边&#xff0c;发现“无默…

vector的模拟实现

一、vector的基本结构 template<class T> class vector { public:typedef T* iterator;typedef const T* const_iterator; private:iterator _start;//vector的迭代器&#xff0c;指向起始位置iterator _finish;//指向存放最后一个元素的下一个位置iterator _end_of_sto…

C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员

上次把默认的成员函数部分梳理完毕了&#xff1a;C初阶类与对象&#xff08;三&#xff09;&#xff1a;详解复制构造函数和运算符重载 今天接着讲下面的内容&#xff1a; 文章目录 1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.2.1格式和概念1.2.2由来情况1情况2 1.2.3特性…

C语言第三弹---数据类型和变量

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 数据类型和变量 1、数据类型介绍1.1、整型1.2、浮点型1.3、字符型1.4、布尔类型1.5、各种数据类型的长度1.5.1、sizeof操作符1.5.2、数据类型的长度1.5.3、sizeo…

全网最详细!!Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…

【蓝桥杯EDA设计与开发】立创开源社区分享的关于蓝桥被EDA真题与仿真题的项目分析

立创开源社区内有几个项目分享了往年 EDA 设计题目与仿真题&#xff0c;对此展开了学习。 【本人非科班出身&#xff0c;以下对项目的学习仅在我的眼界范围内发表意见&#xff0c;如有错误&#xff0c;请指正。】 项目一 来源&#xff1a;第十四届蓝桥杯EDA赛模拟题一 - 嘉立…

JS-WebAPIs-其他事件(三)

• 页面加载事件 页面加载事件主要有二种事件&#xff0c;分别是load和DOMContentLoaded 加载外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件为什么要学&#xff1f; 有些时候需要等页面资源全部处理完了做一些事情老代码喜欢把 scrip…

Git教程学习:01 Git简介与安装

目录 1 版本控制1.1 什么是版本控制系统&#xff1f;1.2 本地版本控制系统1.3 集中式版本控制系统1.4 分布式版本控制系统 2 Git简史3 Git的安装3.1 在Linux上安装3.2 初次运行Git前的配置 1 版本控制 1.1 什么是版本控制系统&#xff1f; 版本控制系统(Version Control Syst…

LLaVA-Plus: Learning to Use Tools for Creating Multimodal Agents

LLaVA-Plus: Learning to Use Tools for Creating Multimodal Agents 最近在调研一些多模态大模型相关的论文&#xff0c;发现Arxiv上出的论文根本看不过来&#xff0c;遂决定开辟一个新坑《一页PPT说清一篇论文》。自己在读论文的过程中会用一页PPT梳理其脉络和重点信息&#…

【2023】java使用WebClient实现chatGPT调用建立web socket连接

&#x1f4bb;目录 一、介绍1、使用技术2、效果 二、代码1、前端代码2、后端代码2.1、maven依赖2.2、model2.2.1、请求接口的格式2.2.2、响应数据对象 2.3、工具类2.3.1、&#x1f534;使用WebClient调用chatgpt方法2.3.2、&#x1f7e0; webSocket连接对话方法 2.4、Controlle…

【微信小程序开发】环境介绍和基本使用

文章目录 前言1. 项目的基本组成结构1.1 JSON 配置文件的作用1.2 如何新建小程序页面1.3 修改项目首页1.4 WXML 模板1.5 WXSS 样式1.6 JS 逻辑交互 2. 宿主环境2.1 什么是宿主环境2.2 通信模型2.3 运行机制2.4 组件2.4.1 view 组件的基本使用&#xff1a;2.4.2 scroll-view 组件…

【数据结构与算法】1.时间复杂度和空间复杂度

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

vue3前端开发,生命周期函数的基础练习

vue3前端开发,生命周期函数的基础练习&#xff01; 下面先给大家看一个图片&#xff0c;帮助大家了解&#xff0c;vue3的生命周期函数&#xff0c;和旧版本vue2的生命周期函数&#xff0c;有什么变化。 如图所示&#xff0c;vue3里面&#xff0c;把前面2个函数&#xff0c;混在…

展锐T618_虎贲T618紫光展锐安卓核心板规格参数

基于紫光展锐八核T618平台的纯国产化方案&#xff0c;采用了开放的智能Android操作系统&#xff0c;并集成了4G网络、2.5G5G双频WIFI(可支持1*1 MIMO)、BLUETOOTH近距离无线传输技术以及GNSS无线定位技术。用户可以根据特定场合的需求&#xff0c;选择合适的嵌入式ARM核心模块&…

禅道的安装及使用

文章目录 1.禅道的下载安装2.禅道管理员管理账户3.禅道管理产品角色操作4.禅道关联需求 1.禅道的下载安装 1、禅道下载网址&#xff1a;http://www.zentao.net/ 2、下载好之后把该文件放到D盘上 3、双击点开然后点击”Extract“进行解压该文件 4、解压中 5、解压完就会出现…

Git学习笔记(第5章):Git团队协作机制

目录 5.1 团队内协作 5.2 跨团队协作 Git进行版本控制都是在本地库操作的。若想使用Git进行团队协作&#xff0c;就必须借助代码托管中心。 5.1 团队内协作 问题引入&#xff1a;成员1&#xff08;大佬&#xff09;利用Git在宿主机上初始化本地库&#xff0c;完成代码的整体…

Oracle 12CR2 RAC部署翻车,bug避坑经历

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…