- 浏览: 44263 次
- 性别:
- 来自: 上海
最新评论
文章列表
1.问题背景
kafka是以高吞吐量著称的,但日前解决一个实际问题中,发现使用不当仍会无法充分利用起吞吐量。我们的场景如下:
有两个kafka集群,需要从上游kafka读一个topic的消息,做一些自定义处理,再写到下游kafka的特定topic(有人说用flume,确实可以,不过自定义处理比较复杂的时候用flume就有点麻烦了)
这里集中在写这一端(读没有问题),开始使用最简单的方式,配一个Producer的bean,然后Producer.send()写下游。压测的时候发现写出去的流量很低,单进程出口流量大概只有1-2Mbps,低的难以接受
2.配置项
开始以为是配置有问题 ...
1.背景
spark streaming有状态计算(如UV)通常采用DStream.updateStateByKey(实际是PairDStreamFunctions增强到DStream的),具体实现网上讲的很多。spark streaming是持续计算,有状态时不能通过简单的DAG/lineage容错,所以必须设置checkpoint(否则Job启动会报错)
checkpoint会持久化当批次RDD的快照、未完成的Task状态等。SparkContext通过checkpoint可以重建DStream,即使Driver宕机,重启后仍可用SparkContext.getOrElse从chec ...
hadoop/spark关闭钩子研究
- 博客分类:
- spark
引子:在使用spark和hadoop的时候,遇到一些进程退出时的报错。因此顺便研究了一下jvm以及一些开源框架的关闭钩子的机制。这篇文章不涉及底层native实现,仅限Java层面
1.jvm关闭钩子
注册jvm关闭钩子通过Runtime.addShutdownHook(),实际调用ApplicationShutdownHooks.add()。后者维护了一个钩子集合IdentityHashMap<Thread, Thread> hooks
ApplicationShutdownHooks类初始化的时候,会注册一个线程到Shutdown类
static {
...
在做一些后台服务的时候,有时候需要一些轻量级的Http入口,以便通过浏览器就能实现便捷的后台功能,例如
1.监控服务运行状态,如服务存在性、版本、配置、性能等
2.手动触发一些功能入口(特别适合测试环境的冒烟测试)
3.支持一些紧急操作,例如手动清缓存,有时候排查问题有用
这些操作通常数量不多,也没什么并发,专门搭一套web框架(如tomcat+spring mvc)有点浪费,一点不封装又不方便。以下用netty+javassist实现一个简单的http服务框架,使得在使用上达到接近spring mvc的体验。这里还使用了spring-bean,但只是为了托管实例方便,如 ...
最近在集群上跑spark时发现有些reduceByKey操作结果不符合预期,大致伪代码如下(公司统一用java,就没写成scala,用了scala的简写节省字数)。就是类似WordCount的简单计算,DimType是一个枚举类
JavaPairRDD<DimType, Long> rawRdd=...;
JavaPairRDD<DimType, Long> reducedRdd = entryPairRDD
.reduceByKey(_+_);
List<Tuple2& ...
spark源码梳理(1)-Action提交2
- 博客分类:
- spark
续上篇
Step 5-TaskSchedulerImpl
override def submitTasks(taskSet: TaskSet) {
val tasks = taskSet.tasks
logInfo("Adding task set " + taskSet.id + " with " + tasks.length + " tasks")
this.synchronized {
// 创建TaskSetManager
val manager = createTaskSet ...
1.概述
Action算子是触发Spark计算的入口,属于Spark核心逻辑。本文梳理Action触发、计算、返回的整个数据流
本文涉及代码主体位于org.apache.spark.scheduler/rdd/executor几个模块。核心类:RDD、SparkContext、DAGScheduler、TaskSchedulerImpl、C ...
本系列文章为对Spark主要逻辑源码学习整理。主要参考《Spark技术内幕》一书(简称《内幕》)。《内幕》主要以源码模块为主线进行横向解析。本文则致力于由“事件”触发的纵向逻辑为主线,例如Action算子、Transform算子、集群启动等,这个角度基本Spark运行时的调用栈。各主线直接没有必然的先后联系
如无特别说明,本文基于Spark 2.10版本源码,并且仅讨论Standalone部署模式
文章内黄底部分表示重要调用栈逻辑,绿底部分表示比较重要但属其他模块逻辑,当前文章不做展开
除源码外,主要内容在注释中说明。包括对源码注释的翻译以及个人说明
例如
// ...
再接上篇,HashMap的最后一部分源码
主要是TreeNode逻辑实现,其中包含红黑树增删的相关算法(具体可以参考红黑树的相关介绍)
/**
* TreeNode的Entry类
*
* TreeNode维持为红黑树,保证树的高度为O(logN),并按hashC ...
本文是上一篇的继续,补全HashMap剩余部分源码
主要是KeySet实现以及一些java8特性方法签名(实现省略了)
/**
* 返回键值集合的一个视图
*
* <pre>
* 实际是实现key集合的一个引用迭代子,HashMap本身的变更可以在keySet中直接反映出来
*
* 如果HashMap在keySet在遍历过程中发生改变(keySet本身的remove除外),则遍历会失败(fast-fail)
*
* 注意keySet不是一个全功能的java.util.S ...
HashMap是最常用的Map实现
因为源码很长,先列举一些关键点。这些信息在常规使用中可能不容易被了解到
1.HashMap中的元素按照hash值分为不同的“桶”(bin),如果散列特性好,元素在桶中分布会比较均匀
2.实际存储用的has ...
Ehcache支持方法注解方式管理缓存,使代码的侵入性很小。最常用的Ehcache注解是@Cacheable、@CacheEvict、@CachePut
本文通过分析源码整理了这几个注解的实现逻辑和关系,并指出一些组合使用时的限制
1注解类源码
1.1@Cacheable
/**
...
本分类是对Java一些基础类源码的学习记录
很多平时用惯的类和方法,细看源码的话还是有不少细节和优化的(虽然用的时候很多时候不需要想这么多)。作为一个语言的基础代码,需要考虑非常全面;同时一些细小的优化可能带来很大的不同(因为使用的地方特别多),所以很多方面还是值得学习的,对于自己开发基础服务/基础模块是很有帮助的
文章内容主要是以对源码注释文档的翻译为主,也包含一些自己的理解