spark比java快吗_为什么我的Spark DataFrame比RDD慢得多?

这两个数字似乎都相对较高,并且不清楚如何创建 DataFrame 或测量时间,但一般来说,这样的差异可以通过与分区数量相比较少的记录来解释 .

spark.sql.shuffle.partitions 的默认值为200,表示您获得的任务数 . 使用50K记录时,启动任务的开销将高于从并行执行中获得的加速 . 让我们用一个简单的例子来说明 . 首先让我们创建一个示例数据:

import string

import random

random.seed(323)

def random_string():

n = random.randint(3, 6)

return (''.join(random.choice(string.ascii_uppercase) for _ in range(n)), )

df = (sc

.parallelize([random_string() for _ in range(50000)], 8).toDF(["name"])

.cache())

并根据 shuffle.partitions 的数量来衡量时间:

sqlContext.setConf("spark.sql.shuffle.partitions", "1")

%timeit -n 10 df.groupby('name').count().collect()

## 10 loops, best of 3: 504 ms per loop

sqlContext.setConf("spark.sql.shuffle.partitions", "1")

%timeit -n 10 df.groupby('name').count().collect()

## 10 loops, best of 3: 451 ms per loop

sqlContext.setConf("spark.sql.shuffle.partitions", "100")

%timeit -n 10 df.groupby('name').count().collect()

## 10 loops, best of 3: 624 ms per loop

sqlContext.setConf("spark.sql.shuffle.partitions", "200")

%timeit -n 10 df.groupby('name').count().collect()

## 10 loops, best of 3: 778 ms per loop

sqlContext.setConf("spark.sql.shuffle.partitions", "1000")

%timeit -n 10 df.groupby('name').count().collect()

## 10 loops, best of 3: 1.75 s per loop

虽然这些值与您声称的值不可比,并且此数据已在本地模式下收集,但您可以看到相对清晰的模式 . 这同样适用于RDD:

from operator import add

%timeit -n 10 df.rdd.map(lambda x: (x['name'], 1)).reduceByKey(add, 1).collect()

## 10 loops, best of 3: 414 ms per loop

%timeit -n 10 df.rdd.map(lambda x: (x['name'], 1)).reduceByKey(add, 10).collect()

## 10 loops, best of 3: 439 ms per loop

%timeit -n 10 df.rdd.map(lambda x: (x['name'], 1)).reduceByKey(add, 100).collect()

## 10 loops, best of 3: 1.3 s per loop

%timeit -n 10 df.rdd.map(lambda x: (x['name'], 1)).reduceByKey(add, 1000).collect()

## 10 loops, best of 3: 8.41 s per loop

在适当的分布式环境中,由于网络IO的成本,这将更高 .

仅供比较,让我们检查在没有Spark的情况下在本地执行此任务需要多长时间

from collections import Counter

data = df.rdd.flatMap(lambda x: x).collect()

%timeit -n 10 Counter(data)

## 10 loops, best of 3: 9.9 ms per loop

您还应该查看数据位置 . 根据您使用的存储和配置,即使使用这样的小输入,这也会给您的作业增加额外的延迟 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值