本地内部集群资源有限,简单的数据处理跑了3天。HPC上有很多计算资源,出于先吃锅里的再吃碗里的思想,琢磨先充分利用共有资源。简单调研下,也不是很复杂的事情。
1 方案
spark 用local模式
spark standalone涉及多节点通讯,复杂度高;而多任务并行完全可以规划数据分片,每个独立用一个spark local处理;这样就规避了复杂的集群搭建。通过申请单任务单节点、多cpu、多内存来实现。
让python环境能够找到pyspark
这本质上是通过env环境变量实现,具体实现一个是python设置,一个.bashrc或shell设置。
2 步骤
1) 安装spark(就是解压)
解压spark-3.1.2-bin-hadoop3.2.tgz到用户目录下,比如/users/username/tools/spark/spark
我用了一个软连接,考虑到后面切换不同的版本
代码语言:txt复制cd /users/[username]/tools/
tar -zxvf spark-3.1.2-bin-hadoop3.2.tgz
ln -s spark-3.1.2-bin-hadoop3.2 spark
2)在python代码中配置,以使用pyspark
下面构建环境及测试代码可以在py文件和jupyter中测试通过。
代码语言:txt复制import os
import sys
os.environ["PYSPARK_PYTHON"] = "/users/[username]/miniconda3/bin/python"
os.environ["SPARK_HOME"] = "/users/[username]/tools/spark"
os.environ["PYLIB"] = os.environ["SPARK_HOME"] "/python/lib"
sys.path.insert(0, os.environ["PYLIB"] "/py4j-10.9-src.zip")
sys.path.insert(0, os.environ["PYLIB"] "/pyspark.zip")
# test code
import random
from pyspark import SparkContext
sc = pyspark.SparkContext(appName="myAppName")
def inside(p):
x, y = random.random(), random.random()
return x*x y*y < 1
NUM_SAMPLES = 1000000
count = sc.parallelize(range(0, NUM_SAMPLES))
.filter(inside).count()
print("Pi is roughly %f" % (4.0 * count / NUM_SAMPLES))
sc.stop()
3)通过bashrc或者脚本配置pyspark
配置myspark.sh
代码语言:txt复制#!/bin/sh
export SPARK_HOME='/users/[username]/tools/spark'
export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH
export PYSPARK_DRIVER_PYTHON="jupyter"
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
export PYSPARK_PYTHON="/users//[username]/miniconda3/bin/python"
把这个放入.bashrc,就不需要上述的python配置,无感使用pyspark。