狠狠撸

狠狠撸Share a Scribd company logo
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 --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)
使?用?方法
? 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
使?用?方法
? 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
使?用案例
? 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-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;
WebUI
WebUI
已知的问题
? Spark SQL不?支持的场景
(1)不?支持INSERT OVERWRITE DIRECTORY ${dir}
(2)不?支持基于bucket 的hive表
(3)不?支持对最后?小?文件的合并
(4)不?支持对表的分区级别进?行缓存,缓存只针对表级
(5)对meta-data的查询也需要启动任务
已知的问题
? ?用户需要根据处理数据量来设置executor数,内存?大
?小和线程数
(1)过少的executor会导致单个executor处理数据过
多,导致OOM问题
(2)过多的executor占据过多资源,所需内存太多,如
果资源紧张,需要?一直等待
已知的问题
? Join的问题
(1)?大表和?小表的join,可以将?小表(MB级别)broadcast到?大表的各个
executor的task中,控制参数
spark.sql.autoBroadcastJoinThreshold 默认10MB,推荐到100MB
(2)中等数据量的表之间的join,有?大量的??网络shuf?e,可能导致
OOM,GC异常等,需要?手动调整shuf?e分区数(相当于mr中reduce
数),控制参数spark.sql.shuf?e.partitions 默认是200,同时参数
spark.sql.planner.externalSort sorts spill到disk,否则都是memory
(3)?大表之间的join,只能测试,?大部分情况?比hive慢,甚?至跑不出来,
使?用sort-merge-join去做
已知的问题
? GROUP BY的问题
GROUP BY操作会在map端聚合,采?用的是hash结
构,如果数据倾斜严重,单个key数据过多,会导致
OOM,hive通过hive.map.aggr设置为false取消,
spark sql没有参数可以控制
已知的问题
? GC问题
spark通信底层使?用netty,会使?用较多堆外内存,shuf?e过
程中的序列化、反序列化也会占?用内存,数据都保存在内存
中..... OOM
检查?方法 GC time in UI
设置spark.executor.extraJavaOptions “-XX:-PrintGCDetails
-XX:+PrintGCTimeStamps”
在log中查看gc时间,短的gc时间没问题,如果?长时间gc就
需要调整
总结
? 对?用户来说,spark sql相?比hive还有?一定差距
(1)数据量不?大的情况下,查询速度是hive的两倍,数
据量较?大的情况下,hive查询时间成线程增?长,
spark sql有可能?无法查询
(2)?用户每条语句都需要调整很多参数来达到优化??目
的,包括heap size, shuf?e个数,是否需要
broadcast,是否外排序,序列化?方法,akka
framesize等等
Q&A
Thanks

More Related Content

Spark sql培训