用PySpark开发时的调优思路(上)

本文根据美团的Spark性能优化指南,总结了PySpark开发中的四个调优思路:复用RDD并持久化数据,避免低效shuffle算子,使用高效算子,以及广播大变量。通过实例展示了cache的性能提升,并提到了broadcast替代join的方法,强调了广播变量的注意事项。
摘要由CSDN通过智能技术生成

这一小节的内容算是对pyspark入门的一个ending了,全文主要是参考学习了美团Spark性能优化指南的基础篇和高级篇内容,主体脉络和这两篇文章是一样的,只不过是基于自己学习后的理解进行了一次总结复盘,而原文中主要是用Java来举例的,我这边主要用pyspark来举例。文章主要会从4个方面(或者说4个思路)来优化我们的Spark任务,主要就是下面的图片所示:(本小节只写了开发习惯调优哈)


1. 开发习惯调优
1)尽可能复用同一个RDD,避免重复创建,并且适当持久化数据

这种开发习惯是需要我们对于即将要开发的应用逻辑有比较深刻的思考,并且可以通过code review来发现的,讲白了就是要记得我们创建过啥数据集,可以复用的尽量广播(broadcast)下,能很好提升性能。

# 最低级写法,相同数据集重复创建。
rdd1 = sc.textFile("./test/data/hello_samshare.txt", 4) # 这里的 4 指的是分区数量
rdd2 = sc.textFile("./test/data/hello_samshare.txt", 4) # 这里的 4 指的是分区数量
print(rdd1.take(10))
print(rdd2.map(lambda x:x[0:1]).take(10))

# 稍微进阶一些,复用相同数据集,但因中间结果没有缓存,数据会重复计算
rdd1 = sc.textFile("./test/data/hello_samshare.txt", 4) # 这里的 4 指的是分区数量
print(rdd1.take(10))
print(rdd1.map(lambda x:x[0:1]).take(10))

# 相对比较高效,使用缓存来持久化数据
rdd = sc.parallelize(range(1, 11), 4).cache()  # 或者persist()
rdd_map = rdd.map(lambda x: x*2)
rdd_reduce = rdd.reduce(lambda x, y: x+y)
print(rdd_map.take(10))
print(rdd_reduce)

下面我们就来对比一下使用缓存能给我们的Spark程序带来多大的效率提升吧,我们先构造一个程序运行时长测量器。

import time
# 统计程序运行时间
def time_me(info="used"):
    def _time_me(fn):
        @functools.wraps(fn)
        def _wrapper(*args, **kwargs):
            start = time.time()
            fn(*args, **kwargs)
            print("%s %s %s" % (fn.__name__, info, time.time() - start), "second")
        return _wrapper
    return _time_me

下面我们运行下面的代码,看下使用了cache带来的效率提升:

@time_me()
def test(types=0):
    if types == 1:
        print("使用持久化缓存")
        rdd = sc.parallelize(range(1, 10000000), 4)
        rdd1 = rdd.map(lambda x: x*x + 2*x + 1).ca
PySpark中,我们可以使用网格搜索、随机搜索和贝叶斯优化等算法进行超参数调优来优化随机森林模型的性能。超参数调优是通过调整模型的超参数来优化模型的学习过程或结构,这些超参数在训练过程中不会被学习到。 一个常见的超参数调优方法是网格搜索。网格搜索是指在给定的超参数范围内,穷举所有可能的组合,并通过交叉验证来评估每个模型的性能,最终选择性能最好的超参数组合作为最佳模型。在PySpark中,可以使用`ParamGridBuilder`类来定义超参数的网格范围,然后使用`CrossValidator`类进行交叉验证。 另一种超参数调优的方法是随机搜索。随机搜索是指在给定的超参数范围内,随机选择一组超参数,并通过交叉验证来评估模型的性能。通过多次随机选择和评估,可以找到性能较好的超参数组合。在PySpark中,可以使用`RandomSearch`类来进行随机搜索。 此外,贝叶斯优化也是一种常用的超参数调优方法。贝叶斯优化通过构建一个模型来估计超参数与模型性能之间的关系,并使用贝叶斯推断来选择下一个最有可能导致性能提升的超参数组合。在PySpark中,可以使用`mlflow`库的`hyperopt`模块来进行贝叶斯优化。 综上所述,PySpark中的超参数调优可以通过网格搜索、随机搜索和贝叶斯优化等算法来进行。这些方法可以帮助我们找到最佳的超参数组合,从而优化随机森林模型的性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [《大数据机器学习实践探索》 ---- 使用spark MLlib进行机器学习(3.超参数调优:树模型调优)](https://blog.csdn.net/wangyaninglm/article/details/116177170)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值