scala

kafka实现无消息丢失与精确一次语义(exactly once)处理

北城余情 提交于 2020-11-17 07:21:54
在很多的流处理框架的介绍中,都会说kafka是一个可靠的数据源,并且推荐使用Kafka当作数据源来进行使用。这是因为与其他消息引擎系统相比,kafka提供了可靠的数据保存及备份机制。并且通过消费者位移这一概念,可以让消费者在因某些原因宕机而重启后,可以轻易得回到宕机前的位置。 但其实kafka的可靠性也只能说是相对的,在整条数据链条中,总有可以让数据出现丢失的情况,今天就来讨论如何避免kafka数据丢失,以及实现精确一致处理的语义。 kafka无消息丢失处理 在讨论如何实现kafka无消息丢失的时候,首先要先清楚大部分情况下消息丢失是在什么情况下发生的。为什么是大部分,因为总有一些非常特殊的情况会被人忽略,而我们只需要关注普遍的情况就足够了。接下来我们来讨论如何较为普遍的数据丢失情况。 1.1 生产者丢失 前面介绍Kafka分区和副本的时候,有提到过一个producer客户端有一个acks的配置,这个配置为0的时候,producer是发送之后不管的,这个时候就很有可能因为网络等原因造成数据丢失,所以应该尽量避免。但是将ack设置为1就没问题了吗,那也不一定,因为有可能在leader副本接收到数据,但还没同步给其他副本的时候就挂掉了,这时候数据也是丢失了。并且这种时候是客户端以为消息发送成功,但kafka丢失了数据。 要达到最严格的无消息丢失配置,应该是要将acks的参数设置为-1

Scala之Scala基础

雨燕双飞 提交于 2020-11-17 05:50:41
1. 声明变量 使用 var 或者 val 声明变量。 注意: (1) val 修饰的变量是不可变的,注意不可变的不是内容,而是引用; (2) var 修饰的变量,内容和引用都可变; (3) 使用 lazy 定义变量后,只有在调用该变量时才会实例化这个变量的值。而且惰性变量只能是不可变变量; (4) 只有 val 修饰的变量才能被 lazy 修饰; (5) Scala 语言是弱类型语言。 //变量定义方式 var a:Int = 1 var aa = 1 val aaa:Int = 3 val aaaa = 4 lazy val aaaaa = 4 2. 常用类型 Scala 和 Java 一样,有7种数值类型 Byte、Char、Short、Int、Long、Float、Double 和一个 Boolean 类型,和 Java 不同的是 ,Scala 没有基本类型与包装类型之分,这些类型都是类,有自己的属性和方法。 1.toString() 1.to (10) scala类型层级关系: scala 类型转换: 3. 操作符 Scala 中没有操作符,只是以操作符的格式去进行方法调用。 //数学运算符 +、-、* 、/、% //关系操作符 > < >= <= ! //位操作符 | & ^ ~ //比较对象是否相等 == != 注意: (1) a + b 等价于 a.+(b) (2)

过滤Spark数据集的四种方法

泄露秘密 提交于 2020-11-17 03:48:36
在实际工作中,根据某个字段,对一个Spark数据集进行过滤,是一个很常见的场景,举个例子: 一个存储公司员工信息的数据集A,有以下三个字段: id: Integer name: String age: Integer 现在要过滤出某些员工的id,这些id在B集合(B可能是哈希表,也可能是Spark数据集)中,过滤逻辑为: C = A.filter(A.id in B) 有四种方法可以实现,分别为: Filter Map MapPartition Inner Join 下面是详细介绍。 Filter Spark的Filter变换,可以根据条件表达式、返回布尔值的过滤函数、条件字符串,对数据集进行过滤,使用方法如下: // 1. 条件表达式 A1 = A .filter( Column condition) // 2. 自定义过滤函数 A1 = A .filter( FilterFunction < T > func) // 3. 条件字符串 A1 = A .filter( String condition) Filter 变换比较简单,逐条处理记录不论数据集大小,效率都很高,但需要能够将用来过滤的数据集B广播到所有的executor上。 Map Map变换,对数据集中每条记录调用一个函数,返回值可以是null,也可以是相同类型或不同类型的新记录,使用方法如下: //

scala 滑动

回眸只為那壹抹淺笑 提交于 2020-11-17 02:56:49
val str = Seq(1, 2, 3, 4) val stream: Seq[Seq[Int]] = str.sliding(2).toSeq println(stream) // Stream(List(1, 2), ?) val l= str.sliding(2).toList println(l) // List(List(1, 2), List(2, 3), List(3, 4)) 来源: oschina 链接: https://my.oschina.net/lemos/blog/4720479