Spark从入门到精通27:Spark SQL之性能优化

1.将数据缓存到内存

性能调优主要是将数据放入内存中,以加快处理数据的速度。通过spark.cacheTable(“tableName”)或者dataFrame.cache()可以将表缓存到内存;使用spark.uncacheTable(“tableName”)可以从内存中删除表。

案例:将从MySQL中读取到的数据缓存到内存以加速查询。

spark-shell启动时连接MySQL:

# spark-shell --master spark://localhost:7077
--jars /root/trainings/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.46-bin.jar
--driver-class-path /root/trainings/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.46-bin.jar

(1)从MySQL数据库中读取数据生成DataFrame

scala> val usersDF = spark.read.format("jdbc")
.option("url","jdbc:mysql://localhost:3306/spark")
.option("dbtable","tblUsers")
.option("user","root")
.option("password","123456")
.load
usersDF: org.apache.spark.sql.DataFrame = [uID: int, uName: string ... 1 more field]

(2)将usersDF注册成表tblUsers

scala> usersDF.registerTempTable("tblUsers")
warning: there was one deprecation warning; re-run with -deprecation for details

(3)执行第一次查询

scala> spark.sql("select * from tblUsers").show

image

(4)将表进行缓存(标记),并执行第二次查询(触发缓存)

scala> spark.sqlContext.cacheTable("tblUsers")
scala> spark.sql("select * from tblUsers").show

image

(5)执行第三次查询

scala> spark.sql("select * from tblUsers").show

image

(6)通过Web Console查看三次查询的执行时间

在浏览器地址栏输入Spark Master的地址:http://192.168.126.110:8080,在Running Applications中点击Spark shell应用,打开应用详情页面:

image
image

可以看到没有加入缓存时查询的时间远大于加入缓存后的查询时间,即前两次的时间的时间远大于第三次的时间。

(7)清空缓存

scala> spark.sqlContext.cacheTable("tblUsers")
18/07/10 21:33:46 WARN execution.CacheManager: Asked to cache already cached data.
scala> spark.sqlContext.clearCache

2.性能优化相关参数

2.1缓存相关的参数

  • spark.sql.inMemoryColumnarStorage.compressed:默认为true,Spark SQL将会基于统计信息自动为每一列选择一种压缩编码方式;
  • spark.sql.inMemoryColumnarStorage.batchSize:默认值10000,缓存批处理大小。缓存数据时,较大的批处理大小可以提高内存利用率和压缩率,但同时也会带来内存OOM风险;

2.2其他性能相关的配置

  • spark.sql.files.maxPartitionBytes:默认值128MB,读取文件时单个分区可容纳的最大字节数;
  • spark.sql.files.openCostInBytes:默认值4MB,打开文件的估算成本,按照同一时间能够扫描的字节数来测量。当往一个分区写入多个文件时会使用。高估更好,这样的话小文件将会比大文件分区更快(先被调用);
  • spark.sql.autoBroadcastJoinThreshold:默认值10MB,用于配置一个表在执行join操作时能够广播给所有worker节点的最大字节大小。通过将这个值设置为-1可以禁用广播。注意,当前数据统计仅支持已经运行了ANALYZE TABLE <tablename> COMPUTE STATISTICS noscan命令的Hive Metastore表;
  • spark.sql.shuffle.partitons:默认值200,用于配置join或者聚合操作的shuffle操作使用的分区数。

调优参数除了默认值之外,没有什么固定值可供参考,全凭在实际生产环境中经验来设置,调优是一项长期的经验积累过程。本节介绍仅供参考。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容