本地内部集群资源有限,简单的数据处理跑了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
我用了一个软连接,考虑到后面切换不同的版本
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中测试通过。
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
#!/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。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/211900.html