0


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 --ulimitnofile=65535-h Slave1 --name Slave1 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bashdocker run -it--network hadoop  --ulimitnofile=65535-h Slave2 --name Slave2 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bashdocker run -it--network hadoop --ulimitnofile=100000-h Master --name Master -p9870:9870 -p8088:8088 -p10000:10000 registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base bash
  • 使用dokcer ps -a查看所用容器的状态
dockerps-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-getinstallvim 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
#javaexportJAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
exportJRE_HOME=${JAVA_HOME}/jre
exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
exportPATH=${JAVA_HOME}/bin:$PATH#hadoopexportHADOOP_HOME=/usr/local/hadoop
exportPATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
exportHADOOP_COMMON_HOME=$HADOOP_HOMEexportHADOOP_HDFS_HOME=$HADOOP_HOMEexportHADOOP_MAPRED_HOME=$HADOOP_HOMEexportHADOOP_YARN_HOME=$HADOOP_HOMEexportHADOOP_INSTALL=$HADOOP_HOMEexportHADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
exportHADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec
exportJAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHexportHADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
exportHDFS_DATANODE_USER=root
exportHDFS_DATANODE_SECURE_USER=root
exportHDFS_SECONDARYNAMENODE_USER=root
exportHDFS_NAMENODE_USER=root
exportYARN_RESOURCEMANAGER_USER=root
exportYARN_NODEMANAGER_USER=root
  • 启用容器的时候默认不会source /etc/profile,因此需要在bash的配置文件中添加语句 source /etc/profile,ssh 服务默认也是不会启用的,还需要在 bash的配置文件中添加service ssh start
vim ~/.bashrc
  • 添加以下内容
source /etc/profile
servicessh 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的压缩包闯入容器内部
dockercp 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
  • 添加以下内容
exportSPARK_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[$?-eq0];theneval"$__conda_setup"elseif[-f"/root/miniconda3/etc/profile.d/conda.sh"];then."/root/miniconda3/etc/profile.d/conda.sh"elseexportPATH="/root/miniconda3/bin:$PATH"fifiunset __conda_setup
# <<< conda initialize <<<

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

conda create -n spark python==3.8
  • 激活环境
conda activae spark
  • 安装必要的库
pip installspark==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-L0.0.0.0:8080:0.0.0.0:8080 [email protected]

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

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

app = Flask(__name__)# 定义路由和处理函数@app.route('/')defhello():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
标签: spark docker hadoop

本文转载自: https://blog.csdn.net/escapeape/article/details/137224130
版权归原作者 escapeape 所有, 如有侵权,请联系我们删除。

“Docker搭建hadoop和spark集群”的评论:

还没有评论