python执行spark任务sparksql、Spark 并发量测试

本文介绍了一个关于Spark集群并发量的测试案例,通过不同程序设置来评估集群在同一时间内能运行的任务数量及其性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值