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集群
- 拉取docker镜像,该镜像为ubuntu:22.04,已经安装好了hadoop
docker pull registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base
- 使用docker images可以查看已经拉取的镜像的列表
docker images
- 建立使用桥接模式的docker子网,一般来说下载完docker会在宿主机虚拟出一个172.17.0.0/16的子网出来,这里我们使用桥接模式创建了一个172.19.0.0/16的子网出来
docker network create --driver=bridge --subnet=172.19.0.0/16 hadoop
- 使用拉取的镜像,启动三个容器,分别是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
- 进入容器内部,配置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
- 对三台容器的/etc/host进行修改,对主机名进行映射
vim /etc/host
- 在/etc/host文件中添加以下信息
172.19.0.2 Master
172.19.0.3 Slave1
172.19.0.4 Slave2
- 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
- 初始化hdfs,启动hadoop集群
- 初始化
hadoop namenode -format
- 启动全部和服务
start-all.sh
- 输入jps指令,如果能查看到以下进程则代表hadoop集群成功启用了
1104 ResourceManager
1456 NodeManager
774 SecondaryNameNode
326 NameNode
521 DataNode
1690 Jps
Spark集群搭建
拉取的镜像没有配置spark,手动配置
- 去官网下载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
- 配置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
- 注意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
- 将spark文件文件传输到其他节点上
scp-r /usr/local/spark Slave1:/usr/local
scp-r /usr/local/spark Slave2:/usr/local
- 启动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虚拟环境
- 选择下载miniconda,更加轻量级的环境
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
- 安装miniconda
bash Miniconda3-latest-Linux-x86_64.sh
一直回车和yes即可,默认安装目录为 /root
- 如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
- 如何映设端口
- 使用ssh的方法,使得容器的端口可以映射到宿主机
ssh-L0.0.0.0:8080:0.0.0.0:8080 [email protected]
在宿主机器的浏览器输入0.0.0.0:8080 就可以查看spark集群的运行状况
- 如何让容器对外网暴露服务
- 在容器创建一个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
版权归原作者 escapeape 所有, 如有侵权,请联系我们删除。