LU KONG

Results 14 issues of LU KONG

## 场景 在yarn集群上运行Structured Streaming应用一段时间后,发现查询所消耗的时间不是很均匀,会出现周期性的一快一慢的情况,例如前5个查询是1s左右的时间,到第六个查询时就需要4s的时间,接着后面的查询又恢复之前的1s时间。 ## 原因分析 - 可能是Kafka会话超时引起的,具体需要查看Driver端的日志 - 也可能是Driver JVM出现频繁Full GC导致的 ## 处理方案 第一种情况的处理方案: 修改配置属性,增加kafka的会话和心跳时长,具体的参数如下: - heartbeat.interval.ms - session.timeout.ms 第二种情况的处理方案: [参看地址](https://github.com/bjkonglu/resume-bjkonglu/issues/2)

## Java8: CompletableFuture新特性

## Structured Streaming实现query监控实现 [参考链接](https://github.com/bjkonglu/resume-bjkonglu/blob/master/docs/spark-research/structured-streaming/ss%E7%9A%84%E6%9F%A5%E8%AF%A2%E7%9B%91%E6%8E%A7%E5%AE%9E%E7%8E%B0.md)

## 背景 在使用Structured Streaming消费Kafka时,出现*org.apache.kafka.common.errors.RecordTooLargeException*异常,具体的异常信息如下图所示: ![screen shot 2018-10-16 at 2 14 15 pm](https://user-images.githubusercontent.com/26513242/46996076-e46f8180-d14d-11e8-80a1-c937ab951d09.png) ## 分析 通过详细的异常信息不难发现是由于SS从Kafka拉取的一条消息大于配置最大拉取消息的最大值(1MB) ## 处理 ### 方案一 修改Kafka服务端的配置项*message.max.bytes*,将该配置项调小至小于*fetch.message.max.bytes*值。如果不想修改整体Kafka的配置,可以单独修改topic的配置,如下所示: ```scala bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic my-topic --config max.message.bytes=128000 ```...

## 背景 在执行Spark任务时,发现某个Stage里面的一个Task执行时间比同Stage里面的Task执行时间大几倍,最大会达到20倍。而Spark任务执行的原理是要求上一个Stage里面所有的Task都执行完,才能执行后续的Task,所以整体任务会因为单个Task的执行缓慢而延时。 ## 分析 ### 场景一 查看任务上游的数据是不是倾斜了,具体到每个partition里面的数据是否均衡。如果不是,说明数据发生倾斜,这个时候我们通过repartition操作,将每个partition里面的数据均衡 ### 场景二 上游数据源每个partition里面的数据均衡,但是还是出现某个Stage里面的一个Task执行时间明显比其他Task执行时间长的情况。这个时候可以查看一下这个执行时间长的Task是不是都分配到同一个服务器上,如果是,说明该服务的性能不好,无法正常处理Task。 这个时候,我们可以启动Spark里面的推测功能(spark.speculation->true),该功能启动后Spar系统会检测每个Task的执行时间,如果Task的执行时间超过整个Stage所有Task平均执行时间的多少倍(由spark.speculation.multiplier参数控制),会启动另外一个Task处理相同数据,两个Task取最前完成的那个Task处理结果,另一个Task被Kill #### 处理后的结果 ![screen shot 2018-10-12 at 6 19 32 pm](https://user-images.githubusercontent.com/26513242/46864146-02866a80-ce4c-11e8-8354-5ff3f1efdaab.png)

## Spark长时间运行任务kerberos认证过程及原理

## 远程debug的技能修炼 ### 背景 在分布式系统的开发与调试过程中,我们在刚开始的时候一般是使用打日志的方式进行调试,这样会比较耗时。今天我们给大家介绍一下Java的远程debug功能。 ### 使用方式 #### 服务端 如果要让服务器上运行的代码支持远程debug的功能,则在启动服务时必须加上特定的JVM参数,这些参数是: > -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1099 服务器端启动远程dubug功能的例子: > java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1099 -cp real-report-1.0.4-test.jar com.netease.datastream.test.TestCredentials ### 客户端 在本地,我们打开IDEA,在顶部靠右的地方选择“Edit Configuration...”, 进入后点击+号, 选择“Remote”, 按照下图的指引操作即可: 然后点击apply,最后点击OK即可。 启动debug模式,如下图操作:...

## Structured Streaming之Continuous Processing尝试

## 长时间运行的Structured Streaming应用由于Kerberos票据到期而失败 ### 背景 没有设置其他配置, 当Structured Streaming应用提交到集群时,会发布kerberos票证。当票证到期时,Structured Streaming应用不能再从hdfs写入或读取数据。 出现的异常如下: ```java User class threw exception: org.apache.spark.sql.streaming.StreamingQueryException: token (HDFS_DELEGATION_TOKEN token 145 for streams) is expired ``` ### 处理方案 > 在理论上,应该将kerberos主题和keytab作为spark-submit命令传递 ```scala...