[Container]Hadoop集群镜像打包

news2024/11/15 1:24:57

文章目录

  • Docker DNS配置
    • Linux Docker DNS设置
    • Windows、MacOs Docker DNS设置
  • 打包Hadoop
    • Dockerfile打包文件
      • 参数声明和基础镜像引入
      • 安装相关依赖库
      • 创建普通用户
      • 下载或导入软件包
      • 环境变量配置
    • 初始化脚本
      • 参数配置
      • `${HADOOP_CONF_DIR}/workers`工作节点
      • `${HADOOP_CONF_DIR}/hadoop-env.sh`环境变量配置
      • `${HADOOP_CONF_DIR}/core-site.xml`Hadoop核心设置
      • 启动SSH,设置SSH免密登录
      • 设置启动服务
      • 主函数

在使用学习Hadoop等相关大数据产品时,为更好的学习和理解分布式的理念和操作,在学习时一般采用多机器的方式进行学习。一般情况下,可以采用通过虚拟机和云服务器等方式满足机器不足等问题。考虑到,云服务器成本过高,虚拟机资源性能等问题,博主决定采用容器的方法来学习搭建Hadoop集群。以便更好的学习Hadoop、容器、Shell等相关概念。

Docker DNS配置

在基于基础镜像进行Hadoop打包时,默认的基础镜像缺失很多库,所以需要在打包时下载相关依赖库,考虑到外网的相关镜像站连接不稳定,可以使用设置DNS的方式来加快访问。

Linux Docker DNS设置

修改/etc/docker/daemon.json文件:

{
	"dns": [
		"8.8.8.8",
		"114.114.114.114"
	]
}

重启docker:

systemctl daemon-reload
systemctl restart docker

Windows、MacOs Docker DNS设置

Windows或者MacOs一般采用Docker Desktop的方式按照Docker。在Docker Desktop的设置界面的Docker Engine界面对Docker DNS进行设置。
Docker DNS设置

打包Hadoop

在打包博客中,综合考虑,博主选择ubuntu:22.04作为基础镜像进行Hadoop打包。

Dockerfile打包文件

参数声明和基础镜像引入

# 初始化添加普通用户
ARG USER="focus"
# 用户默认密码
ARG PASSWORD="0000"
# 用户默认路径
ARG USER_HOME="/data"
# root用户密码,默认为普通用户密码
ARG ROOT_PASSWORF=${PASSWORD}
# 基础镜像版本
ARG BASE_IMAGE_VERSION="0.1"
# 基础镜像发行商
ARG BASE_IMAGE_DISTRO="ubuntu"
# 基础镜像架构,缺省为amd64
ARG BASE_IMAGE_ARCH="amd64"
# 基础镜像环境,缺省为dev
ARG BASE_IMAGE_ENV="dev"

# 引入基础镜像
FROM ubuntu:22.04

# 重新声明进所有参数以继承入口的参数传递
ARG USER
ARG PASSWORD
ARG USER_HOME
ARG ROOT_PASSWORF
ARG BASE_IMAGE_VERSION
ARG BASE_IMAGE_DISTRO
ARG BASE_IMAGE_ARCH
ARG BASE_IMAGE_ENV
  • 在开始部分,通过ARG声明后续需要的参数信息。
    • ARG参数声明可以在打包镜像时指定具体值覆盖默认值
  • 通过FROM命令导入需要的基础镜像,在此基础上进行打包
  • Dockerfile基于层的概念进行打包,引入基础镜像后,前面ARG声明的参数信息将会失效,所以在之后需要重新声明相关参数

安装相关依赖库

RUN  \
    echo "install system library" && \
    apt update && \
    apt -y upgrade && \
    apt -y install sudo openssh-client openssh-server sshpass iputils-ping telnet lsof curl wget vim
  • 由于Dockerfile基于层的概念进行打包,所以在执行如RUN等操作时,尽量在一个语句里面执行多个操作
    • 假设我们在一层中打包了我们不需要的文件,但是在后面的层将此文件删除,但是在打包时,这一层是仍有这个文件的,所以导致执行删除操作并没有使打包镜像减少,文件也并没有被删除,只是被标记为删除了而已。因为这个文件在之前的层中仍存在
  • -y:表示在执行upgrade和install时遇到需要确认的地方默认执行确认操作,避免因无法确认而在终端阻塞
  • 其中sudoopensshsshpass为必要文件,在之后的脚本和开发中需要,其他的根据自己的需求选择依赖库

创建普通用户

RUN \
	# 设置时区
    echo "Asia/Shanghai" > /etc/timezone && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    # root sudo设置
    echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
    echo "root:${ROOT_PASSWORF}" | sudo chpasswd && \
    # 创建默认组
    groupadd -g 1001 ${USER} && \
    # 创建默认用户
    mkdir -p ${USER_HOME} && \
    useradd -u 1001 -g 1001 --no-create-home -d ${USER_HOME} --no-log-init --shell /bin/bash ${USER} && \
    echo "${USER}:${PASSWORD}" | sudo chpasswd && \
    # 赋予sudo权限
    echo "${USER}  ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
  • echo "${USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers:赋予用户免密执行sudo特权操作的权限
  • echo "${USER}:${PASSWORF}" | sudo chpasswd:免交互模式下修改用户密码
  • groupadd:添加用户组
    • -g:用户组ID
  • useradd:添加用户
    • -u:设置用户ID
    • -g:设置用户组ID
    • --no-create-home:不创建默认用户文件夹
    • -d:指定用户默认文件夹
    • --no-log-init:不要将此用户添加到最近登录和登录失败数据库
    • --shell:指定用户的默认shell

下载或导入软件包

# 修改当前用户    
USER ${USER}

# 修改当前工作目录
WORKDIR ${USER_HOME}
COPY ./init_server.sh .

RUN \
	# 修改用户路径下文件权限
    sudo chown -R "${USER}:${USER}" ${USER_HOME} && \
    # JDK
    mkdir -p "${USER_HOME}/software/jdk" && \
    wget https://download.java.net/openjdk/jdk8u43/ri/openjdk-8u43-linux-x64.tar.gz && \
    tar -xzvf openjdk-8u43-linux-x64.tar.gz --strip-components 1 -C ${USER_HOME}/software/jdk && \
    rm openjdk-8u43-linux-x64.tar.gz && \
    # Hadoop
    mkdir -p "${USER_HOME}/software/hadoop" && \
    wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz && \
    tar -xzvf hadoop-3.3.6.tar.gz --strip-components 1 -C ${USER_HOME}/software/hadoop && \
    rm hadoop-3.3.6.tar.gz && \
    mkdir -p "${USER_HOME}/software/hadoop/data/logs" && \
    # code-server
    mkdir -p "${USER_HOME}/software/code-server" && \
    wget https://github.com/coder/code-server/releases/download/v4.14.1/code-server-4.14.1-linux-amd64.tar.gz && \
    tar -xzvf code-server-4.14.1-linux-amd64.tar.gz --strip-components 1 -C ${USER_HOME}/software/code-server && \
    rm code-server-4.14.1-linux-amd64.tar.gz
  • USERWORKDIR:切换当前的执行用户和工作目录
  • COPY ${SRC_PATH} ${CONTAINER_PATH}:将本地的文件复制到镜像中
  • chown:修改文件的用户和用户组,确保新创建的用户可以操作工作路径
  • 在这里的脚本中通过wget命令来下载镜像,但在实际应用中,建议先将软件下载下来,然后通过COPY命令拷贝到容器中,避免因为打包失败或其他因素还需要重新下载
  • 解压后建议及时删除不需要的压缩包
  • –strip-components Number:解压时清除Number个引导目录,一般情况下,Number为1表示不包含打包前原目录
  • -C:指定解压路径

环境变量配置

ENV USER_HOME="${USER_HOME}"

# JDK
ENV JAVA_HOME="${USER_HOME}/software/jdk"
ENV PATH="${JAVA_HOME}/bin:${PATH}"

# HADOOP
ENV HADOOP_HOME="${USER_HOME}/software/hadoop"
# hadoop配置文件位置
ENV HADOOP_CONF_DIR="${HADOOP_HOME}/etc/hadoop"
# hadoop运行文件位置
ENV HADOOP_LOG_DIR="${HADOOP_HOME}/data/logs"
# hadoop数据存储位置
ENV HADOOP_DATA_HOME="${HADOOP_HOME}/data"
# hadoop执行脚本路径
ENV PATH="${HADOOP_HOME}/bin:${PATH}"
ENV PATH="${HADOOP_HOME}/sbin:${PATH}"

# 匿名卷声明
VOLUME [ ${USER_HOME} ]

# 端口声明
# SSH远程登录端口
EXPOSE 22
# code-server访问端口
EXPOSE 8080

CMD ["/bin/bash"]
  • ENV:设置镜像的环境变量。通过ENV设置环境变量后,可以不需要写入export到环境变量配置文件中
  • VOLUME:声明匿名卷
  • EXPOSE:声明可用端口
  • 在设置VOLUMEEXPOSE参数后,不是说只能挂载指定的目录和端口,只是指明了本镜像可能需要哪些工作目录和端口

初始化脚本

在如上设置好打包镜像脚本内容,并打包脚本的情况下,我们的镜像未配置完成,关于Hadoop的集群化,我们仍需添加配置相关的参数才可以集群化,所以,需要在启动镜像是通过参数信息设置Hadoop的集群数量,并启动集群。这里将初始化脚本内容写进${USER_HOME}/init_server.sh脚本中,在打包镜像时打包进去。
在ubuntu镜像中,sh程序是不完整的,所以在这里基于bash程序进行脚本的编写,在执行脚本时,需要使用bash程序执行

参数配置

nodeNum=${1:-1}

集群化设置,主要的操作就是能够根据参数信息获取到集群的数量,所以首先需要根据传入的参数获取集群量

${HADOOP_CONF_DIR}/workers工作节点

workers主要功能为记录所有的数据节点的主机名或IP地址。将集群的所有节点的主机名或者IP地址写入workers文件即可。

function setWorkers() {
    for ((i = 1; i < $nodeNum; i++))
    do
        echo "node$i" >> ./workers
    done
    echo -n "node${nodeNum}" >> ./workers
}
  • -n:不在末尾追加\n
  • worker时文件不要有空行,否则在启动集群时,可能会在本地创建多个从节点

${HADOOP_CONF_DIR}/hadoop-env.sh环境变量配置

在Hadoop中,一些环境变量无法读取系统的环境变量,所以需要配置在hadoop-env.sh文件中,理论上讲,只需要配置JAVA_HOME路径,其他的可以采用默认路径。

function setEnv() {
    echo "export JAVA_HOME=${JAVA_HOME}" >> ${HADOOP_CONF_DIR}/hadoop-env.sh
    echo "export HADOOP_HOME=${HADOOP_HOME}" >> ${HADOOP_CONF_DIR}/hadoop-env.sh
    echo "export HADOOP_CONF_DIR=${HADOOP_CONF_DIR}" >> ${HADOOP_CONF_DIR}/hadoop-env.sh
    echo "export HADOOP_LOG_DIR=${HADOOP_LOG_DIR}" >> ${HADOOP_CONF_DIR}/hadoop-env.sh
}

${HADOOP_CONF_DIR}/core-site.xmlHadoop核心设置

function setCoreSite() {
    # fs.defaultFS:整个hadoop的通讯路径,设置NameNode的通讯路径
    # io.file.buffer.size:IO缓冲池大小
    coreSiteContent="""
        <property>\n
            \t\t<name>fs.defaultFS</name>\n
            \t\t<value>hdfs://node1:9001</value>\n
        \t</property>\n
        \n
        \t<property>\n
            \t\t<name>io.file.buffer.size</name>\n
            \t\t<value>131072</value>\n
        \t</property>
        """
    # 对需要sed写入core-site.xml文件中的内容进行转义
    coreSiteContent=$(echo -E ${coreSiteContent} | sed -e 's/[]/$*.^[]/\\&/g')
    # 获取<configuration>所在行
    begin_line=$(sed -n '/<configuration/=' ${HADOOP_CONF_DIR}/core-site.xml)
    # 讲内容写入<configuration>所在行后
    sed -i "${begin_line}a${coreSiteContent}" ${HADOOP_CONF_DIR}/core-site.xml
}
  • 在bash中调用echo,需要添加-E参数使\t\n等转义符进行转义
  • $(echo -E ${} | sed -e 's/[]/$*.^[]/\\&/g'):主要为对sed中的内容进行转义,否则输出内容将错误无法识别

启动SSH,设置SSH免密登录

function setSSH() {
    USER=`whoami`
    echo "${USER}:${USER_PASSWORD:-0000}" | sudo chpasswd 
    echo "Start SSH"
    sudo /etc/init.d/ssh start
    # 无交互模式生成ssh密钥
    ssh-keygen -t rsa -b 4096 -f ${USER_HOME}/.ssh/id_rsa -N "" -q
    # 解决第一次ssh登录需要输入yes的问题
    sudo sed -i '/StrictHostKeyChecking/c StrictHostKeyChecking no' /etc/ssh/ssh_config
    # sleep 15s
    for ((i = 1; i <= $nodeNum; i++))
    do
        sshpass -p ${USER_PASSWORD:-0000} ssh-copy-id "node$i"
    done
}
  • 可在启动镜像时,设置环境变量#{USER_PASSWORD}来修改用户密码。若是在打包时修改了默认密码,请修改${USER_PASSWORD:-0000}的默认密码

设置启动服务

function startServers() {
    echo "Start Server"
    ${USER_HOME}/software/code-server/bin/code-server --auth none --bind-addr 0.0.0.0:8080 --extensions-dir ${USER_HOME}/software/code-server/extensions ${USER_HOME}
}
  • Docker镜像在启动时需要启动一个守护进程,否则镜像无法正常启动,这里以code-server为守护进程

主函数

function main() {
	if  [${HAVE_INIT} == ""] ; then
	    setWorker
	    setEnv
	    setCoreSite
	    setSSH
	    startServers
	    echo "export HAVE_INIT=1" >> ~/.bash_profile
	    source ~/.bash_profile
	else
		sudo /etc/init.d/ssh start
		${USER_HOME}/software/code-server/bin/code-server --auth none --bind-addr 0.0.0.0:8080 --extensions-dir ${USER_HOME}/software/code-server/extensions ${USER_HOME}
	fi
}

main

未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

97、基于stm32单片机智能药箱药盒温湿度体温光照时钟wifi手机APP监控(程序+原理图+PCB源文件+手机APP源码+硬件设计资料+元器件清单等)

单片机类型选择 方案一&#xff1a;可以使用现在比较主流的单片机STC89C5单片机进行数据处理。这款单片机具有的特点是内存和51的单片机相比多了4KB内存&#xff0c;但是价格和51单片机一样。并且支持数据串行下载和调试助手。此款单片机是有ATMEL公司生产&#xff0c;可用5V电…

appium自动化测试之PO模型设计

目录 PO模型 PO分层 PO模型设计框架 config目录 common目录 pages目录 function目录 case目录 logs目录 report目录 runTest.py文件 总结&#xff1a; 我们在做自动化的时候应该都听过PO模型&#xff0c;那么什么是PO模型呢&#xff1f;PO模型在自动化中的作用是什…

【链表OJ】删除链表中重复的结点

⭐️ 往期链表相关OJ &#x1f4ab;链接1&#xff1a;链表分割 &#x1f4ab;链接2&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接4&#xff1a;leetcode 206.反转链表 &#x1…

第二章React全家桶之面向组件编程

文章目录 一、组件的基本理解和使用1-1、函数式组件1-2、类式组件 二、组件实例的三大核心属性2-1、state的基本使用2-2-1、state的总结 2-2、props的基本使用2-2-1、props的传值与批量传值2-2-2、对props进行限制2-2-3、props的简写2-2-4、类式组件中的构造器与props2-2-5、函…

使用 eKuiper 按需桥接 CAN Bus 数据至 MQTT

CAN Bus 是一种广泛应用于汽车和工业领域的通信协议&#xff0c;它能够让多个设备在同一网络中进行交互。而 MQTT 是一种广泛应用于物联网领域的通信协议&#xff0c;作为一种轻量级的发布-订阅消息传输协议&#xff0c;它有效地促进了机器之间的通信。 通过将 CAN Bus 数据桥…

Vue组件库Element-常见组件-分页

常见组件-Pagination 分页 Pagination 分页&#xff1a;当数据过多时&#xff0c;会使用分页分解数据 具体关键代码如下&#xff1a;&#xff08;重视注释&#xff09; <template><div><!-- Pagination 分页 --><el-pagination background layout"…

Etsy店铺被封的原因是什么?如何防封

ETSY是一个全球知名的在线市场和电商平台&#xff0c;专注于手工艺品、独特商品和创意艺术。它为卖家提供了一个平台来展示和销售自己的手工制品、艺术品、珠宝、家居用品、时尚配饰等各种创意产品。作为一个颇受中国商家青睐的平台&#xff0c;Etsy在账号检测方面也是不亚于亚…

微软MFC技术中消息的分类

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊MFC技术中消息的分类。 微软Windows中的消息虽然很多&#xff0c;但是种类并不繁杂&#xff0c;大体上有3种&#xff1a;窗口消息、命令消息和控件通知消息。 窗口消息 窗口消息是系统中最为常见…

网络安全(黑客)自学路线

一.零基础学习 在网络安全的学习过程中&#xff0c;基础知识是一个绕不过的问题&#xff0c;Web知识本身就非常丰富&#xff0c;覆盖范围也非常广泛。 首先是大家比较熟悉的浏览器、数据库、服务器&#xff1b; 以及由简到难的HTML、JavaScript和CSS、PHP、Java、.net&#…

【Flutter】使用 Drift 实现 Flutter 数据持久化

文章目录 一、前言二、版本信息三、Drift 简介四、如何安装和设置 Drift五、基础使用1. 创建数据库和表2. 插入、查询、更新和删除数据3. 使用事务 六、总结 一、前言 你是否渴望成为 Flutter 的专家&#xff0c;掌握更多的技巧和最佳实践&#xff1f;我们有个好消息要告诉你&…

【vue3】学习笔记--组件通信方式

学习vue3总是绕不开vue2 vue2组件通信方式总结&#xff1a; 1、props&#xff1a;可以实现父子组件&#xff0c;子父组件&#xff0c;甚至兄弟组件通信 2、自定义事件&#xff1a;实现子父组件通信 3、全局事件总线$bus:可以实现任意组件通信 4、pubsub&#xff1a;发布订阅模…

目标检测常用的评价指标

目标检测常用的评价指标 1 IoU&#xff08;Intersection over Union&#xff09;2 GIoU&#xff08;Generalized IoU&#xff09;3 DIoU&#xff08;Distance-IoU&#xff09;4 CIoU&#xff08;Complete-IoU&#xff09;5 EIoU&#xff08;Efficient-IoU&#xff09;6 SIoU7 W…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例&#xff0c;在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时&#xff0c;是不携带cookie&#xff0c;因此无法拿到订单相关信…

Flink的状态是否支持任务间共享

背景&#xff1a; 在日常编写代码的过程中&#xff0c;我们经常会在方法内部new很多的其他类对象来进行编码工作&#xff0c;那么对于这种情况怎么让new出来的对象是一个我们特意创建出来的一个mock实例&#xff0c;从而让我们能完全控制new出来的对象的所有行为呢&#xff1f…

【雕爷学编程】Arduino动手做(154)---AFMotor电机扩展板模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

数模混合项目:模拟跨数字走线注意事项

数模混合项目中&#xff0c;模拟在数字上走线是常有的事&#xff0c;这里需要注意几个点: 1.模拟电源在数字上走线影响不大&#xff0c;但尽量走top metal和AP层。 2.模拟高频线&#xff0c;尤其是时钟&#xff0c;尽量不要在数字上走线&#xff0c;非要走&#xff0c;最好下…

数据总线学习

为啥要数据总线 使用服务化方式发布&#xff0c;业务端和中间件完全解耦合。一处生产&#xff0c;处处消费设计理念。提供用户可定制的托管化通用消费方案&#xff08;如同步mysql到缓存&#xff0c;同步mysql到es&#xff0c;消费mysql到大数据等托管服务&#xff09; 特性 …

python configparser模块常用方法以及常见报错处理

configparser 是 Python 中一个用于处理配置文件的标准库&#xff0c;可以帮助你生成、读取和修改配置文件的内容 1. 生成配置文件 import configparser# 创建一个配置文件对象 config configparser.ConfigParser()# 添加配置项和值 config[Section1] {key1: value1, key2: …

java 科学计算库 Smile

官网 https://haifengl.github.io/ github https://haifengl.github.io/ 简介 统计机器智能和学习引擎&#xff0c;或者简称 Smile&#xff0c;是一个有前途的现代机器学习系统&#xff0c;在某些方面类似于 Python 的 scikit-learn。它是用 Java 开发的&#xff0c;也提供…

私域账号防范手册

微信为什么要养号吗&#xff1f;为什么会被封&#xff1f;是什么原理&#xff0c;怎么解封&#xff0c;这些你的了解吗&#xff1f; 来看看这篇文章&#xff0c;这些都能给你解答。