Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Spark SQL
江宇
Outline
• 概述
• 使⽤用⽅方法
• 使⽤用案例
• WebUI
• 已知的问题
• Q&A
概述
• Hive、Shark and Spark SQL
概述
• Spark SQL使⽤用户进⾏行关系数据查询,降低学习成
本
• 底层封装对DataFrames的操作(1.3+)
• DataFrames能够通过现有RDD,json格式⽂文件,
Parquet⽂文件和Hive查询构建
使⽤用⽅方法
• 1、Spark-shell提交
(1)提交命令:bin/spark-shell --master yarn --num-executors 10 --
driver-memory 2g --executor-memory 2g...
使⽤用⽅方法
• 2、Spark-submit提交
(1)IDE安装scala插件,新建项⺫⽬目,maven加⼊入spark
依赖
(2)编写程序
(3)打包和提交:提交⽅方式
spark-submit --master yarn  --num...
使⽤用⽅方法
• 3、spark-sql命令
(1)提交命令:bin/spark-sql --master yarn --num-executors 200 --driver-memory
2g --executor-memory 2g --e...
使⽤用案例
• Spark SQL⽀支持⼤大部分
Hive操作,⽤用户可以平
滑迁移使⽤用
使⽤用案例
• 简单的join
两表join ⼤大表与⼩小表 TB join GB
使⽤用案例
执⾏行计划
使⽤用案例
DAG
使⽤用案例
使⽤用案例
• 多表join 六个表join
使⽤用案例
使⽤用案例
• 使⽤用UDF与hive⼀一样,进⼊入spark-sql,然后通过add
jar和create temporary function就可以使⽤用了
spark-sql> add jar hive_udf.jar;
spark-sq...
WebUI
WebUI
已知的问题
• Spark SQL不⽀支持的场景
(1)不⽀支持INSERT OVERWRITE DIRECTORY ${dir}
(2)不⽀支持基于bucket 的hive表
(3)不⽀支持对最后⼩小⽂文件的合并
(4)不⽀支持对表的分区级别...
已知的问题
• ⽤用户需要根据处理数据量来设置executor数,内存⼤大
⼩小和线程数
(1)过少的executor会导致单个executor处理数据过
多,导致OOM问题
(2)过多的executor占据过多资源,所需内存太多,如
果资源紧...
已知的问题
• Join的问题
(1)⼤大表和⼩小表的join,可以将⼩小表(MB级别)broadcast到⼤大表的各个
executor的task中,控制参数
spark.sql.autoBroadcastJoinThreshold 默认10...
已知的问题
• GROUP BY的问题
GROUP BY操作会在map端聚合,采⽤用的是hash结
构,如果数据倾斜严重,单个key数据过多,会导致
OOM,hive通过hive.map.aggr设置为false取消,
spark sql没有参...
已知的问题
• GC问题
spark通信底层使⽤用netty,会使⽤用较多堆外内存,shuffle过
程中的序列化、反序列化也会占⽤用内存,数据都保存在内存
中..... OOM
检查⽅方法 GC time in UI
设置spark.execu...
总结
• 对⽤用户来说,spark sql相⽐比hive还有⼀一定差距
(1)数据量不⼤大的情况下,查询速度是hive的两倍,数
据量较⼤大的情况下,hive查询时间成线程增⻓长,
spark sql有可能⽆无法查询
(2)⽤用户每条语句都需要...
Q&A
Thanks
Upcoming SlideShare
Loading in …5
×

Spark sql培训

844 views

Published on

Spark SQL

Published in: Internet
  • Be the first to comment

Spark sql培训

  1. 1. Spark SQL 江宇
  2. 2. Outline • 概述 • 使⽤用⽅方法 • 使⽤用案例 • WebUI • 已知的问题 • Q&A
  3. 3. 概述 • Hive、Shark and Spark SQL
  4. 4. 概述 • Spark SQL使⽤用户进⾏行关系数据查询,降低学习成 本 • 底层封装对DataFrames的操作(1.3+) • DataFrames能够通过现有RDD,json格式⽂文件, Parquet⽂文件和Hive查询构建
  5. 5. 使⽤用⽅方法 • 1、Spark-shell提交 (1)提交命令:bin/spark-shell --master yarn --num-executors 10 -- driver-memory 2g --executor-memory 2g --executor-cores 1 (2)⼊入⼝口点是sqlContext或其⼦子类如HiveContext scala> import org.apache.spark.sql.hive.HiveContext scala> val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) (3)基于sqlContext查询 scala> sqlContext.sql("select * from **** where dt='20140909' limit 10").collect().foreach(println)
  6. 6. 使⽤用⽅方法 • 2、Spark-submit提交 (1)IDE安装scala插件,新建项⺫⽬目,maven加⼊入spark 依赖 (2)编写程序 (3)打包和提交:提交⽅方式 spark-submit --master yarn  --num-executors 10 --driver-memory 2g --executor- memory 2g --executor-cores 1 --class org.apache.spark.examples. SparkSqlTest sparkSqlTest.jar
  7. 7. 使⽤用⽅方法 • 3、spark-sql命令 (1)提交命令:bin/spark-sql --master yarn --num-executors 200 --driver-memory 2g --executor-memory 2g --executor-cores 1 spark-sql> select * from ***** where dt='20140909' limit 10; (2)通过-f从⽂文件中执⾏行hql spark-sql --master yarn  --num-executors 10 --driver-memory 2g --executor- memory 2g --executor-cores 1 -f hql.txt > result.data 2> hql.log (3)通过-e执⾏行指定的hql spark-sql --master yarn  --num-executors 10 --driver-memory 2g --executor- memory 2g --executor-cores 1 -e "select * from ***** limit 10" > result.data 2> hql.log
  8. 8. 使⽤用案例 • Spark SQL⽀支持⼤大部分 Hive操作,⽤用户可以平 滑迁移使⽤用
  9. 9. 使⽤用案例 • 简单的join 两表join ⼤大表与⼩小表 TB join GB
  10. 10. 使⽤用案例 执⾏行计划
  11. 11. 使⽤用案例 DAG
  12. 12. 使⽤用案例
  13. 13. 使⽤用案例 • 多表join 六个表join
  14. 14. 使⽤用案例
  15. 15. 使⽤用案例 • 使⽤用UDF与hive⼀一样,进⼊入spark-sql,然后通过add jar和create temporary function就可以使⽤用了 spark-sql> add jar hive_udf.jar; spark-sql> create temporary function url_to_mid as ‘*****’; spark-sql> create temporary function mid as ‘*******’; spark-sql> select url_to_mid('z62QS3Ghr','1','0') from dual; spark-sql> select mid('3520617028999724') from dual;
  16. 16. WebUI
  17. 17. WebUI
  18. 18. 已知的问题 • Spark SQL不⽀支持的场景 (1)不⽀支持INSERT OVERWRITE DIRECTORY ${dir} (2)不⽀支持基于bucket 的hive表 (3)不⽀支持对最后⼩小⽂文件的合并 (4)不⽀支持对表的分区级别进⾏行缓存,缓存只针对表级 (5)对meta-data的查询也需要启动任务
  19. 19. 已知的问题 • ⽤用户需要根据处理数据量来设置executor数,内存⼤大 ⼩小和线程数 (1)过少的executor会导致单个executor处理数据过 多,导致OOM问题 (2)过多的executor占据过多资源,所需内存太多,如 果资源紧张,需要⼀一直等待
  20. 20. 已知的问题 • Join的问题 (1)⼤大表和⼩小表的join,可以将⼩小表(MB级别)broadcast到⼤大表的各个 executor的task中,控制参数 spark.sql.autoBroadcastJoinThreshold 默认10MB,推荐到100MB (2)中等数据量的表之间的join,有⼤大量的⺴⽹网络shuffle,可能导致 OOM,GC异常等,需要⼿手动调整shuffle分区数(相当于mr中reduce 数),控制参数spark.sql.shuffle.partitions 默认是200,同时参数 spark.sql.planner.externalSort sorts spill到disk,否则都是memory (3)⼤大表之间的join,只能测试,⼤大部分情况⽐比hive慢,甚⾄至跑不出来, 使⽤用sort-merge-join去做
  21. 21. 已知的问题 • GROUP BY的问题 GROUP BY操作会在map端聚合,采⽤用的是hash结 构,如果数据倾斜严重,单个key数据过多,会导致 OOM,hive通过hive.map.aggr设置为false取消, spark sql没有参数可以控制
  22. 22. 已知的问题 • GC问题 spark通信底层使⽤用netty,会使⽤用较多堆外内存,shuffle过 程中的序列化、反序列化也会占⽤用内存,数据都保存在内存 中..... OOM 检查⽅方法 GC time in UI 设置spark.executor.extraJavaOptions “-XX:-PrintGCDetails -XX:+PrintGCTimeStamps” 在log中查看gc时间,短的gc时间没问题,如果⻓长时间gc就 需要调整
  23. 23. 总结 • 对⽤用户来说,spark sql相⽐比hive还有⼀一定差距 (1)数据量不⼤大的情况下,查询速度是hive的两倍,数 据量较⼤大的情况下,hive查询时间成线程增⻓长, spark sql有可能⽆无法查询 (2)⽤用户每条语句都需要调整很多参数来达到优化⺫⽬目 的,包括heap size, shuffle个数,是否需要 broadcast,是否外排序,序列化⽅方法,akka framesize等等
  24. 24. Q&A Thanks

×