Docker搭建hadoop和spark集群

Docker搭建hadoop和spark集群

本次集群的配置如下

  • Docker 25.0.3
  • JDK 1.8
  • Hadoop 3.1.2
  • Hive 3.1.2
  • mysql 8.0.1
  • mysql-connector-java-8.0.1.jar
  • hive_jdbc_2.5.15.1040

拉取docker镜像,初始化hadoop集群

  1. 拉取docker镜像,该镜像为ubuntu:22.04,已经安装好了hadoop
docker pull registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base
  • 使用docker images可以查看已经拉取的镜像的列表
docker images
  1. 建立使用桥接模式的docker子网,一般来说下载完docker会在宿主机虚拟出一个172.17.0.0/16的子网出来,这里我们使用桥接模式创建了一个172.19.0.0/16的子网出来
docker network create --driver=bridge --subnet=172.19.0.0/16 hadoop
  1. 使用拉取的镜像,启动三个容器,分别是Master,Slave1,Slave2作为集群的三个节点
docker run -it --network  hadoop --ulimit nofile=65535 -h Slave1 --name Slave1 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bash
docker run -it --network hadoop  --ulimit nofile=65535 -h Slave2 --name Slave2 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bash
docker run -it --network hadoop --ulimit nofile=100000  -h Master --name Master -p 9870:9870 -p 8088:8088 -p 10000:10000 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bash 
  • 使用dokcer ps -a查看所用容器的状态
docker ps -a
  • 可以使用以下命令启动容器
docker start Master Slave1 Slave2
  • 使用dokcer attach命令进入容器的bash
docker attach Master #Slave1 or Slave2

注意以下命令使用sudo是在非root用户下才需如此,默认是root用户,不需要使用sudo

  1. 进入容器内部,配置ubuntu的apt清华镜像源
  • 备份源镜像文件
cp /etc/apt/sources.list /etc/apt/sources.list.bak
  • 修改/etc/apt/sources.list, 添加国内镜像源
vi /etc/apt/sources.lists
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
 
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
 
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
  • (同步)更新软件仓库
apt-get update

#安装一些常用的服务与软件
apt-get install vim openssh-server
  1. 对三台容器的/etc/host进行修改,对主机名进行映射
vim /etc/host
  • 在/etc/host文件中添加以下信息
172.19.0.2 Master
172.19.0.3 Slave1
172.19.0.4 Slave2
  1. ssh配置,拉取的镜像已经生成好了公钥和私钥对,我们只需要修改几个参数,就可以实现容器之间还有容器与宿主机的通信
  • 修改/etc/ssh/sshd_config, 修改下面几种参数
PermitRootLogin = true # 允许使用root用户登录
PasswordAuthentication = yes
PubKeyAuthentication = yes

6.拉取的镜像的环境变量默认配置在/etc/profile中

  • /etc/profile
#java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_DATANODE_USER=root
export HDFS_DATANODE_SECURE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_NAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
  • 启用容器的时候默认不会source /etc/profile,因此需要在bash的配置文件中添加语句 source /etc/profile,ssh 服务默认也是不会启用的,还需要在 bash的配置文件中添加service ssh start
vim ~/.bashrc
  • 添加以下内容
source /etc/profile
service ssh start
  • 让环境变量生效
source ~/.bashrc
  1. 初始化hdfs,启动hadoop集群
  • 初始化
hadoop namenode -format
  • 启动全部和服务
start-all.sh
  • 输入jps指令,如果能查看到以下进程则代表hadoop集群成功启用了
1104 ResourceManager
1456 NodeManager
774 SecondaryNameNode
326 NameNode
521 DataNode
1690 Jps

Spark集群搭建

拉取的镜像没有配置spark,手动配置

  1. 去官网下载spark
  • 在宿主机中,将spark的压缩包闯入容器内部
docker cp spark-3.1.2-bin-hive3.1.2.tgz Master:/root
  • docker attach进入容器,解压到/usr/local/中
tar -xvf /root/spark-3.1.2-bin-hive3.1.2 /usr/local/
  • 修改文件夹名称
mv spark-3.1.2-bin-hive3.1.2 spark
  1. 配置spark
  • 进入spark/conf/
cd spark/conf

mv spark-env.sh.template spark-env.sh
vim spark-env.sh
  • 添加以下内容
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
  • 配置worker工作节点
vim wokrer
  • 添加
Master
Slave1
Slave2
  1. 注意hadoop的guava与spark的guava包冲突,选择两者中高版本的,删除低版本的
  • 这里hadoop的guava包版本比较高
cp /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/spark/jars 
mv /usr/local/spark/jars/guava-14.0.1.jar /usr/local/spark/jars/guava-14.0.1.jar.bak
  1. 将spark文件文件传输到其他节点上
scp -r /usr/local/spark Slave1:/usr/local
scp -r /usr/local/spark Slave2:/usr/local
  1. 启动spark
/usr/local/spark/sbin/start-all.sh

查看到以下信息

starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/logs/spark--org.apache.spark.deploy.master.Master-1-Master.out
Slave1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-Slave1.out
Slave2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-Slave2.out
Master: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-Master.out

pyspark 环境配置和任务提交

配置conda

选择conda来管理python虚拟环境

  1. 选择下载miniconda,更加轻量级的环境
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
  1. 安装miniconda
bash Miniconda3-latest-Linux-x86_64.sh

一直回车和yes即可,默认安装目录为 /root

  1. 如conda命令不生效请自行配置~/.bashrc
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/root/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/root/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/root/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/root/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

其他节点(Slave1,Slave2)也要执行以上操作
4. 使用conda创建虚拟环境

conda create -n spark python==3.8
  • 激活环境
conda activae spark
  • 安装必要的库
pip install spark==3.1.2 # pyspark版本要和容器的spark版本一致
pip install numpy,flask,hdfs3
  • 默认环境存储在/root/miniconda3/envs,需要将这份环境拷贝到其他节点
scp -r /root/minicond3/envs/spark Slave1:/root/miniconda3/envs 
scp -r /root/minicond3/envs/spark Slave2:/root/miniconda3/envs

其他问题 or BUG

  1. 如何映设端口
  • 使用ssh的方法,使得容器的端口可以映射到宿主机
ssh -L 0.0.0.0:8080:0.0.0.0:8080 root@172.19.0.2

在宿主机器的浏览器输入0.0.0.0:8080 就可以查看spark集群的运行状况

  1. 如何让容器对外网暴露服务
  • 在容器创建一个web程序flask.py
from flask import Flask, request

app = Flask(__name__)

# 定义路由和处理函数
@app.route('/')
def hello():
    return 'hello,world'


# 运行应用
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=10000)
  • 在容器内运行
python flask.py
  • 在宿主机发送请求

curl 127.0.0.1:10000# Docker搭建hadoop和spark集群

本次集群的配置如下

  • Docker 25.0.3
  • JDK 1.8
  • Hadoop 3.1.2
  • Hive 3.1.2
  • mysql 8.0.1
  • mysql-connector-java-8.0.1.jar
  • hive_jdbc_2.5.15.1040
  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值