更新时间:2024-11-25 GMT+08:00
安装Spark
前提条件
您需要准备一台可访问公网的Linux机器,节点规格建议为4U8G及以上。
配置JDK
以CentOS系统为例,安装JDK 1.8。
- 查询可用的JDK版本。
yum -y list java*
- 选择安装JDK 1.8。
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
- 安装完成后,查看JDK版本。
# java -version openjdk version "1.8.0_382" OpenJDK Runtime Environment (build 1.8.0_382-b05) OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)
- 添加环境变量。
- Linux环境变量配置在/etc/profile文件中。
vim /etc/profile
- 在编辑模式下,在文件最后添加如下内容:
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64 PATH=$PATH:$JAVA_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME PATH CLASSPATH
- 保存并关闭profile文件,执行如下命令使其生效。
source /etc/profile
- 查看JDK环境变量。
echo $JAVA_HOME echo $PATH echo $CLASSPATH
- Linux环境变量配置在/etc/profile文件中。
获取Spark包
由于OBS适配hadoop2.8.3和3.1.1版本,本文使用3.1.1。
- 下载v3.1.1版本的Spark。如环境中未安装git,您需要先执行yum install git安装git。
git clone -b v3.1.1 https://github.com/apache/spark.git
- 修改/dev/make-distribution.sh文件,指定Spark版本,目的是为了让编译的时候跳过检测。
- 使用搜索找到 VERSION 所在行,查看版本号所在行数。
cat ./spark/dev/make-distribution.sh |grep -n '^VERSION=' -A18
- 显示129行到147行,将这些内容注释,并指定版本。
sed -i '129,147s/^/#/g' ./spark/dev/make-distribution.sh sed -i '148a VERSION=3.1.3\nSCALA_VERSION=2.12\nSPARK_HADOOP_VERSION=3.1.1\nSPARK_HIVE=1' ./spark/dev/make-distribution.sh
- 使用搜索找到 VERSION 所在行,查看版本号所在行数。
- 下载依赖包。
wget https://archive.apache.org/dist//maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz tar -zxvf apache-maven-3.6.3-bin.tar.gz && mv apache-maven-3.6.3 ./spark/build
- 执行如下命令进行编译。
./spark/dev/make-distribution.sh --name hadoop3.1 --tgz -Pkubernetes -Pyarn -Dhadoop.version=3.1.1
- 编译可能需要一定时间,请耐心等待。编译完成后,软件包名称为spark-3.1.3-bin-hadoop3.1.tgz。
配置Spark运行环境
为了操作简便,使用root用户,并将编译出的软件包spark-3.1.3-bin-hadoop3.1.tgz放置于操作节点/root目录下。
- 将软件包移动至/root目录。
mv ./spark/spark-3.1.3-bin-hadoop3.1.tgz /root
- 执行命令安装Spark。
tar -zxvf spark-3.1.3-bin-hadoop3.1.tgz mv spark-3.1.3-bin-hadoop3.1 spark-obs cat >> ~/.bashrc <<EOF PATH=/root/spark-obs/bin:\$PATH PATH=/root/spark-obs/sbin:\$PATH export SPARK_HOME=/root/spark-obs EOF source ~/.bashrc
- 此时已经可以使用spark-submit等二进制,执行以下命令查看所用的Spark版本。
spark-submit --version
配置Spark对接OBS
- 获取华为云OBS jar包。本文使用hadoop-huaweicloud-3.1.1-hw-45.jar,获取地址:https://github.com/huaweicloud/obsa-hdfs/tree/master/release。
wget https://github.com/huaweicloud/obsa-hdfs/releases/download/v45/hadoop-huaweicloud-3.1.1-hw-45.jar
- 复制华为云OBS jar包到相应目录。
cp hadoop-huaweicloud-3.1.1-hw-45.jar /root/spark-obs/jars/
- 修改Spark配置项。为了对接OBS,需要为Spark添加对应的配置项。
- 获取AK/SK,详情请参见访问密钥。
- 修改AK_OF_YOUR_ACCOUNT / SK_OF_YOUR_ACCOUNT / OBS_ENDPOINT为实际值。
- AK_OF_YOUR_ACCOUNT:上一步中获取的AK。
- SK_OF_YOUR_ACCOUNT:上一步中获取的SK。
- OBS_ENDPOINT:OBS的Endpoint,可前往地区和终端节点查询。
cp ~/spark-obs/conf/spark-defaults.conf.template ~/spark-obs/conf/spark-defaults.conf cat >> ~/spark-obs/conf/spark-defaults.conf <<EOF spark.hadoop.fs.obs.readahead.inputstream.enabled=true spark.hadoop.fs.obs.buffer.max.range=6291456 spark.hadoop.fs.obs.buffer.part.size=2097152 spark.hadoop.fs.obs.threads.read.core=500 spark.hadoop.fs.obs.threads.read.max=1000 spark.hadoop.fs.obs.write.buffer.size=8192 spark.hadoop.fs.obs.read.buffer.size=8192 spark.hadoop.fs.obs.connection.maximum=1000 spark.hadoop.fs.obs.access.key=AK_OF_YOUR_ACCOUNT spark.hadoop.fs.obs.secret.key=SK_OF_YOUR_ACCOUNT spark.hadoop.fs.obs.endpoint=OBS_ENDPOINT spark.hadoop.fs.obs.buffer.dir=/root/hadoop-obs/obs-cache spark.hadoop.fs.obs.impl=org.apache.hadoop.fs.obs.OBSFileSystem spark.hadoop.fs.obs.connection.ssl.enabled=false spark.hadoop.fs.obs.fast.upload=true spark.hadoop.fs.obs.socket.send.buffer=65536 spark.hadoop.fs.obs.socket.recv.buffer=65536 spark.hadoop.fs.obs.max.total.tasks=20 spark.hadoop.fs.obs.threads.max=20 spark.kubernetes.container.image.pullSecrets=default-secret EOF
预置镜像到SWR
在K8s内运行Spark任务,需要构建相同版本的Spark容器镜像,并将其上传到SWR。在编译Spark时,会自动生成配套的Dockerfile文件,您可通过此文件制作镜像并上传至SWR。
- 制作镜像。
cd ~/spark-obs docker build -t spark:3.1.3-obs --build-arg spark_uid=0 -f kubernetes/dockerfiles/spark/Dockerfile .
- 上传镜像。
- (可选)登录SWR管理控制台,选择左侧导航栏的“组织管理”,单击页面右上角的“创建组织”,创建一个组织。
- 在左侧导航栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成临时登录指令”,单击复制登录指令。
- 在集群节点上执行上一步复制的登录指令,登录成功会显示“Login Succeeded”。
- 登录制作镜像的节点,复制登录指令。
docker tag [{镜像名称}:{版本名称}] swr.ap-southeast-1.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称} docker push swr.ap-southeast-1.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
记录下镜像的访问地址以供后文填写。
例如记录下地址为:swr.ap-southeast-1.myhuaweicloud.com/dev-container/spark:3.1.3-obs
配置Spark History Server
- 修改~/spark-obs/conf/spark-defaults.conf文件,开启Spark事件日志记录,并配置OBS桶名称及目录。
cat >> ~/spark-obs/conf/spark-defaults.conf <<EOF spark.eventLog.enabled=true spark.eventLog.dir=obs://{bucket-name}/{log-dir}/ EOF
- spark.eventLog.enabled:设置为true,表示开启Spark事件日志记录。
- spark.eventLog.dir:OBS桶名称及路径,格式为obs://{bucket-name}/{log-dir}/,例如obs://spark-sh1/history-obs/。请务必修改OBS桶名称及目录为正确值。
- 修改~/spark-obs/conf/spark-env.sh文件,如果该文件不存在,使用命令复制模板为文件。
cp ~/spark-obs/conf/spark-env.sh.template ~/spark-obs/conf/spark-env.sh cat >> ~/spark-obs/conf/spark-env.sh <<EOF SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=obs://{bucket-name}/{log-dir}/" EOF
此处的OBS地址需要与上一步spark-default.conf中的一致。
- 直接启动history server。
start-history-server.sh
回显如下:
starting org.apache.spark.deploy.history.HistoryServer, logging to /root/spark-obs/logs/spark-root-org.apache.spark.deploy.history.HistoryServer-1-spark-sh1.out
- 启动后可以通过节点端口18080访问。
如需关闭history server,可执行以下脚本:
stop-history-server.sh