参考图书:KafkaStreams in Action 因为项目涉及到分布式流数据处理,随便在书店买了了一本看着
Kafka 是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统。
参考:https://baijiahao.baidu.com/s?id=1651919282506404758&wfr=spider&for=pc
KafkaStreams是一个依赖于Kafka的Java库(lib) ,不是处理框架(framework)
常见处理框架有:Storm,Spark等。
框架是给定好的规则,开发基于某个框架就是按照框架的结构和使用规则来进行。
库是个API的集合,可以灵活调用或者自己创建。
库更轻量更灵活
批处理 处理大容量静态数据集,可基于时间分批,也可基于某一条件分批。例如每5s进行一次处理【时间】;或数据量达到1M进行处理【条件】框架Hadoop
流处理 实时处理每个事件。尽管每个新的数据都是单独处理的,但许多流处理系统也支持“窗口”操作,这些操作允许处理也引用在当前数据到达之前和/或之后在指定时间间隔内到达的数据【根据窗口内数据处理最中央的数据】。框架Storm,Samza
微批处理 分批的时间间隔更短,但不是像流处理那样基于事件,而是将批分为更小的单元,框架spark
lambda expression JDK8新特性,允许把函数作为方法的参数
格式:
(parameters) -> expression
或
(parameters) ->{ statements; }
例如:
() -> 5 //无接收值,但返回5
散列码 https://blog.csdn.net/qq_21430549/article/details/52225801
P6下方数据分组的理解
将数据分区的时候,假如我要分3(1,2,3)个区,我有(a, b, c, d, e, f ) 6个数据,那么可以做的是把每个数据加上一个tag,比如a-3, b-1, c-2, d-2, e-1, f-3。这个结构很像键值对结构,但注意1,2,3是键,而a,b,c是值。由于键值相同会覆盖,所以要做到的是键不同,但键不同了如何做到分区?用某种运算规则对键的值进行散列,然后相同的散列码分到一个分区中。下一页的公式就是将一个key取哈希值,然后对分区个数取余得到分区数。注意,其中hashCode函数可能根据你的键进行重写。而还有一种情况,就是我的数据是存在不同的Map结构中的,虽然每个map中键是唯一的,但他们的排列很可能是没有顺序的,那我在分区的时候如果依照键来分,查找效率就会很低。散列码的出现是为了提高速度,它将键经过散列运算得到散列码,相同的散列码走到一个分区中,就很快。注意,散列规则一般与分区个数有关。
深度优先 从初始点出发,不断向前走,如果碰到死路了,就往回走一步,尝试另一条路,直到发现了目标位置。这种不撞南墙不回头的方法,即使成功也不一定找到一条好路,但好处是需要记住的位置比较少。
广度优先 从初始点出发,把所有可能的路径都走一遍,如果里面没有目标位置,则尝试把所有两步能够到的位置都走一遍,看有没有目标位置;如果还不行,则尝试所有三步可以到的位置。这种方法,一定可以找到一条最短路径,但需要记忆的内容实在很多,要量力而行。
背压 一种流量控制机制。Flow Control
Backpressure,就是消费者需要多少,生产者就生产多少。这有点类似于TCP里的流量控制,接收方根据自己的接收窗口的情况来控制接收速率,并通过反向的ACK包来控制发送方的发送速率。这种方案只对于cold Observable有效。cold Observable是那些允许降低速率的发送源,比如两台机器传一个文件,速率可大可小,即使降低到每秒几个字节,只要时间足够长,还是能够完成的。相反的例子就是音视频直播,速率低于某个值整个功能就没法用了(这种类似于hot Observable)。【思考】对于时间相机产生的数据流,很显然不是cold Observable的,也就是说源产生的数据速率不受控制,那么backpressure机制在此场景中就不适用。
第一章用一个购买例子概述了KafkaStream工作的模式。读完一遍留在头脑中的记忆点是:源,处理器节点,映射器会在对流对象purchase处理时返回相应的KStream实例,这个实例就是处理器。
当完整的purchase对象从源经过每一个节点时,给我感觉都经历了一次信息筛选和过滤。这个节点只接收处理相关的数据,并且向下产生节点时不会处理被映射器滤掉的数据。也就是说从源出来的节点个数是依据功能方向实现的,不存在处理完这个功能处理别的功能,因为每个节点的流向都是单项且更“狭窄”的。
思考
但这里还有些疑惑的是这个KStream实例是由方法放回的吧,但是是哪个对象调用了这个方法呢?API显示是KStream调用了mapValues方法,然后返回了一个新的处理器对象。然后这个对象应该去处理purchase对象了,我觉得这个KStream应该调用了某个方法,这个方法的参数是purchase对象,然后返回一个处理过的purchase副本对象。不知道是不是自己理解的这回事,还是应该看看具体的代码实现。
还有就是映射器的原理,工作方式不清晰。