spark
记录Spark开发过程中的问题
PowerMee
@南京
展开
-
Spark DataSource API 分析
什么是Spark Datasource APISpark Datasource API 是一套连接外部数据源和Spark引擎的框架它主要是给Spark框架提供一种快速读取外界数据的能力,它可以方便地把不同的数据格式通过DataSource API注册成Spark的表,然后通过Spark SQL直接读取。它可以充分利用Spark分布式的优点进行并发读取,而且SparkSQL本身有一个很好的Catalyst优化引擎,能够极大的加快任务的执行。Spark Datasource API 同时提供了一套优化机制原创 2020-05-20 11:11:47 · 435 阅读 · 0 评论 -
Spark Streaming 指定消费Topic中某个Partition的数据
最近接触到一个需求:通过Driect API消费Kafka topic中指定partiton中的数据。这个partition中的数据是用户通过某种算法过滤出的有效数据,其他partition数据不作处理,代码片段实现如下:val kafkaParams = Map[String, String]("metadata.broker.list" -> "ip:port", "auto.offset.reset" -> "largest") val kc = new KafkaCluste原创 2020-05-20 11:10:06 · 475 阅读 · 0 评论 -
SparkStreaming 新增Metrics 支持Kafka数据消费堆积监控
在SparkStreaming任务运行的过程中,由于数据流量或者网络的抖动,任务的batch很可能出现delay,所以就出现了一个需求:实时监控任务对kafka消息的消费,及时了解堆积情况。这个需求应该有很多种解决方案,我这边提供的思路是基于Spark Metrics System的。SparkStreaming任务在运行过程中,会产生很多Metrics信息,不断地推送到Sink上面,我们这里使用到的是MetricsServlet。打开Spark UI,我们能够很方便地通过RestAPI方式请求任务Me原创 2020-05-20 11:07:04 · 427 阅读 · 0 评论 -
SparkStreaming使用messageHandler预处理Kafka数据
在SparkStreaming任务中,可以使用DirectKafkaInputDStream中的messageHandler功能对接受到的kafka数据做下预处理,接口声明如下图:最近就收到一个需求,很简单:如果kafka中的原数据类似于【a,b,1:2:3,d】,但想要将数据的[1:2:3]字段拆开分别跟其他字段组成一个字符串,如:【a,b,1,d】【a,b,2,d】【a,b,3,d】这时就可以使用messageHandler对原数据做处理,实现主要代码如下:...原创 2020-05-20 11:05:35 · 320 阅读 · 0 评论 -
HistoryServer 进程运行日志无限增长问题解决
Spark-HistoryServer在运行过程中会打印自身进程的日志,这里是指打印在${SPARK_HOME}/logs目录下,名称为spark-spark-org.apache.spark.deploy.history.HistoryServer-1-node.hostname.out的日志,非eventLog。这个日志在Spark层面没有做相应的控制,也没有相应的参数做调优。这种情况下该日志文件会无限增长,最终将磁盘打满。前面我分享过一篇关于Driver/Executor日志控制的文章(在这里),这篇原创 2020-05-20 11:04:13 · 326 阅读 · 0 评论 -
SparkOptimizer 优化规则:OptimizeMetadataOnlyQuery
这两天在SparkSQL Core看到一个优化规则:OptimizeMetadataOnlyQuery,它的意思是如果一个sql只涉及表的分区字段元信息查询的话,执行过程将不会路由到TableScanExec的PhysicalPlan进行表扫描,而是通过分区元信息的字段和值构建LocalRelation,进而构造一个LocalTable,走LocalTableScanExec的PhysicalPlan。这个规则的触发要满足下面几个条件:sql中所有查询的字段必须是分区字段如果使用了聚合函数,必须满足原创 2020-05-20 11:01:55 · 368 阅读 · 0 评论 -
SparkSQL针对DataSource表的Cache优化
Spark内部针对DataSource表的查询做了缓存优化,使得在同一任务中多次访问同一张DataSource表场景下可以跳过重复的获取表meta数据过程,以提升表读取性能。缓存的内容是表名和其对应的LogicalRelation。缓存机制:SQL语法解析后进行Analyzer的过程,因为我们关注表的缓存机制,所以只看表分析中的一个关键Rule:ResolveRelations。Analyzer 对Parsed Logical Plan进行遍历,发现UnresolvedRelation后,就对它启动合规原创 2020-05-20 11:00:17 · 459 阅读 · 0 评论 -
Spark日志过大导致磁盘溢出问题解决方案
一 问题背景平台近期出现多次spark任务日志文件将磁盘打满,导致平台异常报警和任务失败的情况,这些任务包括Spark-Streaming任务和普通Spark任务。产生该问题的原因主要是:Spark-Streaming任务运行时间比较长,Executor和Driver进程产生的Spark系统日志数量很大;业务用户在应用代码中使用System.out.print等输出了大量的调试信息(曾有任务运行40分钟打满100G日志文件)。以上信息全部输出在Yarn Container日志路径下的stdout和std原创 2020-05-20 10:58:50 · 1399 阅读 · 0 评论 -
SparkOptimizer 优化:OptimizeIn(In to InSet)
最近在调试Spark-SQL的时候看了一个OptimizeIn优化规则,该规则做了两个事情:去除In中重复的Literal条件;如果In中Literal条件数目大于optimizerInSetConversionThreshold(默认值为10),做In到InSet的表达式转换。在做DataSource扩展filter pushdown的时候要注意处理这种优化。源码如下:实例:...原创 2020-05-18 12:02:41 · 327 阅读 · 0 评论 -
使用Spark-SQL进行ElasticSearch数据探查
目前针对SQL on ElasticSearch 已经有了比较好的解决方案:elasticsearch-sql,其实Spark-SQL也可以满足一些基本的ES数据探查的需求,实现起来也相对简单。elasticsearch-spark的包针对ES扩展了Spark Datasource,我们可以使用sql查询es中的数据,中间Spark充当了“SQL解析器”的角色。环境与数据准备:Spark-2.1.0环境;elasticsearch-spark-20_2.11-5.4.2.jar;Hive环境E原创 2020-05-18 12:01:12 · 662 阅读 · 0 评论 -
Spark JDBC DataSource 下推全部SQL逻辑
通过源码可以知道,目前Spark JDBC Datasource在拉取数据形成JDBCRDD时,只把查询字段列表,表名和Filter下推到了数据库一侧:如果我的sql还有聚合查询,那么聚合查询其实是在Spark端执行的。即先经过过滤把所需字段的所有数据抽取出来形成RDD,在RDD上再执行聚合操作。那能不能把全部SQL都下推到数据库侧呢?答案是可以的。看代码逻辑,只要将table变量构成一个子句即可,子句的逻辑就是我要查询的sql逻辑,比如select avg(scores), class from原创 2020-05-18 11:58:57 · 432 阅读 · 0 评论 -
Spark LogicalPlan 逆向生成SQL语句
在使用spark进行sql分析过程中,一般是将sql语句解析成LogicalPlan查看执行计划,LogicalPlan能够帮助我们了解Spark-SQL的解析,转换,优化,映射和执行的机制。最近在看Spark-SQL源码过程中,了解到一个逆向逻辑,即将LogicalPlan逆向生成SQL语句。代码实现在org.apache.spark.sql.catalyst.SQLBuilder中。如果手上有一个logicalPlan,通过创建SQLBuilder实例,调用toSQL方法就可以进行逆向转化。值原创 2020-05-18 11:55:19 · 603 阅读 · 0 评论