安装PySpark
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark
测试
cd /export/server/spark/bin
./pyspark --master local[*]
import sys
from pyspark.sql import SparkSession
sc = SparkSession.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.enableHiveSupport() \
.getOrCreate()
# sc = SparkSession.builder.appName("PysparkExample") \
# .config ("spark.sql.shuffle.partitions", "50") \
# .config("spark.driver.maxResultSize","5g") \
# .config ("spark.sql.execution.arrow.enabled", "true") \
# .getOrCreate()
# date_range_list = ['20210215', '20201130', '20201214']
date_range_list = ['2021-02-15']
def run_sql_process(run_sqls):
run_sql_list = run_sqls.split(';')
for run_sql in run_sql_list:
if run_sql:
print("running: %s " % (run_sql.strip()))
sc.sql(run_sql)
def mutil_process(sqltxt):
for date in date_range_list:
run_sql = sqltxt.replace('${START_DT}', date)
print(run_sql)
# 创建进程
run_sql_process(run_sql)
if __name__ == '__main__':
sql_file = sys.argv[1]
arg2 = sys.argv[2]
if sql_file: # and os.path.exists(sql_path):
print("if sql_path:", sql_file)
# if sql_path is not None:
# print("sql_path is not None:")
# elif True:
# print("Still True")
# else:
# print("False")
# 读取 sql 文件文本内容
# sql = open(sql_file, 'r', encoding='utf8')
# sqltxt = sql.readlines()
with open(sql_file) as fr:
sqltxt = fr.read()
# print("sqltxt:", sqltxt)
mutil_process(sqltxt)
print("程序运行成功!!!!!")
/apache/spark/bin/spark-submit \
--master yarn \
--deploy-mode client \
--queue xxx \
--conf spark.pyspark.driver.python=/usr/share/anaconda2/bin/python \
--conf spark.pyspark.python=/usr/share/anaconda2/bin/python \
--executor-cores 4 \
--executor-memory 20g \
--driver-memory 1g \
--num-executors 50 \
/apache/releases/spark-2.3.1.1.1.6-bin-ebay/python/pyspark/tests.py arg1 arg2
二、Spark 并发量测试
任务描述
测试Spark集群能承受多少并发量
测试目的:
1.测试公司内部Spark集群同一时间能运行多少个spark任务
2.多个spark任务若能同时进行,执行速度怎么样
3.在spark集群无资源可申请的同时又有任务提交,spark集群会采取怎么操作
4.若提交一个任务,spark集群只能满足其一部分申请,这个任务该如何进行
Spark集群分配参数
节点数:5
cpu:20核
内存:40g
硬盘:500g
每台节点分配参数
cpu:4核
内存:8g
硬盘:100g
测试案例(通过spark集群自带WEBUI进行监控任务提交运行状态)
1.编写测试程序1,无限循环通过Spark restful API 提交任务到spark集群运行,每个任务申请worker数1个,cpu:1核,内存:1g,driver端 cpu:核,内存1g,程序只提交spark任务不进行任务读取文件和处理分析操作,申请到资源就立马释放
2.编写测试程序2,条件同上,然后每个任务读取指定文件进行分词计数,并且上一个任务提交后休眠1-2秒再进行提交下一个任务
3.编写测试程序3,提交2个任务,第一个任务先提交并申请spark集群所有资源,然后提交第二个任务,第二个任务也要获取spark集群所有资源
4.编写测试程序4,提交2个任务,第一个任务先提交并申请spark集群50%资源,然后提交第二个任务,第二个任务也要获取spark集群50%资源
5.编写测试程序5,提交2个任务,第一个任务先提交并申请spark集群70%资源,然后提交第二个任务,第二个任务也要获取spark集群70%资源
测试结果
测试案例1:
提交任务速度太快,当提交到20个任务的时候,spark集群资源完全分配完,后续任务直接卡死
(一个任务最少要占两个CPU,一个driver端cpu,一个worker占用的cpu,提交任务时先申请driver端,延迟1-2秒后再去申请这个driver端的worker节点)
后续任务卡死的原因:
spark集群的所有cpu都分配给前20个任务的driver端了,没有多余的资源去分配给其他任务,也没有一点资源为前20个任务继续分配worker节点,结果就卡死了
测试案例2:
当提交到10个任务的时候,spark集群完全分配完,后续任务进入等待状态,当前10个任务中有某个任务执行结束了,后续任务就会按序号继续申请spark资源进行运行
测试案例3
第一个任务占用完spark集群所有资源,第二个任务直接进入等待状态,等待第一个任务执行完再进行申请资源
测试案例4
两个任务可以一起运行在spark集群上
测试案例5
第一个任务申请70%资源,第二个任务继续申请到30%资源,一起运行在spark集群上,当第一个任务结束后,spark集群会继续分配多出来的资源给第二个任务
备注:集群配置只适合测试环境,为保证提交的任务都能快速运行(分配4核4g)建议同时运行任务不超过4-5个.
————————————————
原文链接:https://blog.youkuaiyun.com/qq_29726869/article/details/82757381