pyspark on hpc

本地内部集群资源有限,简单的数据处理跑了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

(0)
上一篇 2021年12月14日
下一篇 2021年12月14日

相关推荐

发表回复

登录后才能评论