scala

Kafka消费组(consumer group)

前提是你 提交于 2020-08-15 07:33:02
一直以来都想写一点关于kafka consumer的东西,特别是关于新版consumer的中文资料很少。最近Kafka社区邮件组已经在讨论是否应该正式使用新版本consumer替换老版本,笔者也觉得时机成熟了,于是写下这篇文章讨论并总结一下新版本consumer的些许设计理念,希望能把consumer这点事说清楚,从而对广大使用者有所帮助。 在开始之前,我想花一点时间先来明确一些概念和术语,这会极大地方便我们下面的讨论。另外请原谅这文章有点长,毕竟要讨论的东西很多,虽然已然删除了很多太过细节的东西。 一、 误区澄清与概念明确 1 Kafka的版本 很多人在Kafka中国社区(替群主做个宣传,QQ号:162272557)提问时的开头经常是这样的:“我使用的kafka版本是2.10/2.11, 现在碰到一个奇怪的问题。。。。” 无意冒犯,但这里的2.10/2.11不是kafka的版本,而是编译kafka的Scala版本。Kafka的server端代码是由Scala语言编写的,目前Scala主流的3个版本分别是2.10、2.11和2.12。实际上Kafka现在每个PULL request都已经自动增加了这三个版本的检查。下图是我的一个PULL request,可以看到这个fix会同时使用3个scala版本做编译检查: 目前广泛使用kafka的版本应该是这三个大版本:0.8.x, 0.9

Actor 模型应用实例-Actor 间通讯

蓝咒 提交于 2020-08-15 05:37:18
两个 Actor 的通讯机制原理图 目录结构: 代码: AActor.scala package com.akka.actors import akka.actor.{Actor, ActorRef} class AActor(actorRef: ActorRef) extends Actor { val bActorRef: ActorRef = actorRef override def receive: Receive = { case "start" => { println("AActor 出招了 , start ok") self ! "我打" //发给自己 } case "我打" => { //给 BActor 发出消息 //这里需要持有 BActor 的引用(BActorRef) println("AActor(黄飞鸿) 厉害 看我佛山无影脚") Thread.sleep(1000) bActorRef ! "我打" //给 BActor 发出消息 } } } BActor.scala package com.akka.actors import akka.actor.Actor class BActor extends Actor { override def receive: Receive = { case "我打" => { println("BActor

关于Java8的精心总结

半世苍凉 提交于 2020-08-14 22:33:49
前言 ​ 最近公司里比较新的项目里面,看到了很多关于java8新特性的用法,由于之前自己对java8的新特性不是很了解也没有去做深入研究,所以最近就系统的去学习了一下,然后总结了一篇文章第一时间和大家分享一下。 ​ ​ 在了解一项新技术之前,我们需要了解我们为什么要去学习它以及它的优点,以下是我总结的: Java8(又称jdk1.8)是java语言开发的一个主要版本,Java8是oracal公司于2014年3月发布,可以看成是自java5以来最具有革命性的版本。 **新特性的优点:**速度更快、代码更少、便于并行、最大化减少空指针异常 函数式编程提供了一种更高层次的抽象化 排序: List<RoleEntity> rolesListSort = rolesList.stream().sorted(Comparator.comparing(RoleEntity::getCreateDate)).collect(Collectors.toList()); Consumer是一个函数式接口 参数是Consumer类型的,Consumer里面的泛型表示泛型的类型要么是Integer,要么是Integer的父类,super表示它及它上面的,也就是父类。 下面这段代码是在Iterable接口里面的默认方法,jdk8之后的新方法,默认方法(默认方法的引入很大程度上是为了保证向后兼容)

Lambda表达式用法大比较: Scala和Java 8

怎甘沉沦 提交于 2020-08-14 20:12:56
最近几年Lambda表达式风靡于编程界. 很多现代编程语言都把它作为函数式编程的基本组成部分. 基于JVM的编程语言如Scala,Groovy还有Clojure把它们作为关键部分集成在语言中.现在Java8也加入了它们的行列. 有趣的是,对于JVM来说,Lambda表达式是完全不可见的,并没有匿名函数和Lamada表达式的概念,它只知道字节码是严格面向对象规范的.它取决于语言的作者和它的编译器在规范限制内创造出更新,更高级的语言元素. 我们第一次接触它是在我们要给Takipi添加Scala支持的时候, 我们不得不深入研究Scala的编译器.伴随着JAVA8的来临,我认为探究Scala和java编译器是如何实现Lambda表达式是非常有趣的事情.结果也是相当出人意料. 接下来,我展示一个简单的Lambda表达式,用于将字符串集合转化成字符串自身长度的集合。 Java的写法 – 1List names = Arrays.asList("1", "2", "3"); 2Stream lengths = names.stream().map(name -> name.length()); Scala的写法 – 1.val names = List("1", "2", "3") 2.val lengths = names.map(name =>name.length) 表面上看起来非常简单

Apache Spark 3.0 中的向量化执行

橙三吉。 提交于 2020-08-14 09:20:41
R 是数据科学中最流行的计算机语言之一,专门用于统计分析和一些扩展,如用于数据处理和机器学习任务的 RStudio addins 和其他 R 包。此外,它使数据科学家能够轻松地可视化他们的数据集。 通过在 Apache Spark 中使用 Spark R,可以很容易地扩展 R 代码。要交互式地运行作业,可以通过运行 R shell 轻松地在分布式集群中运行 R 的作业。 当 Spark R 不需要与 R 进程交互时,其性能实际上与 Scala、Java 和 Python 等其他语言 API 相同。但是,当 SparkR 作业与本机 R 函数或数据类型交互时,会性能显著下降。 如果在 Spark 和 R 之间使用 Apache Arrow 来进行数据交换,其性能会有很大的提升。这篇博客文章概述了 SparkR 中 Spark 和 R 的交互,并对比了没有向量化执行和有向量化执行的性能差异。 文章目录 1 Spark 和 R 交互 2 原始实现(Native implementation) 3 向量化执行(Vectorized implementation) 4 基准测试结果 Spark 和 R 交互 SparkR 不仅支持丰富的 ML 和类似 SQL 的 API 集合,而且还支持用于直接与 R 代码进行交互的一组 API。例如,Spark DataFrame 和 R

spark RDD pipe 调用外部脚本

旧巷老猫 提交于 2020-08-14 04:08:59
pipe(command, [envVars]) 对于每个分区,都执行一个perl或者shell脚本,返回输出的RDD 1 2 3 4 5 6 7 8 9 10 11 scala> val rdd = sc.makeRDD(List( "wangguo", "yangxiu", "xiaozhou", "kangkang"),3) rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[9] at makeRDD at <console>:24 scala> rdd.pipe( "/opt/test/spark/pipe.sh").collect res4: Array[String] = Array(wangcen, wangguohehe, wangcen, yangxiuhehe, wangcen, xiaozhouhehe, kangkanghehe) scala> val rdd = sc.makeRDD(List( "wangguo", "yangxiu", "xiaozhou", "kangkang"),4) rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[11] at makeRDD at <console>:24

如何在本地调试你的 Spark Job

给你一囗甜甜゛ 提交于 2020-08-14 03:52:54
生产环境的 Spark Job 都是跑在集群上的,毕竟 Spark 为大数据而生,海量的数据处理必须依靠集群。但是在开发Spark的的时候,不可避免我们要在本地进行一些开发和测试工作,所以如何在本地用好Spark也十分重要,下面给大家分享一些经验。 首先你需要在本机上安装好了Java,Scala和Spark,并配置好了环境变量。详情请参考官方文档或其他教程。 spark-shell 本地运行Spark最直接的方式就是在命令行里面运行spark-shell,成功后你将看到如下信息: 首先可以仔细阅读一下命令行的提示信息, Picked up _JAVA_OPTIONS: -Xmx512M -Xms512M // _JAVA_OPTIONS是我在系统环境变量里面设置的值 Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties // 告诉你log4j使用配置 Setting default log level to "WARN". // log级别 To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). // 如何调整log级别 Spark context

Java中你必须知道的基础知识点

两盒软妹~` 提交于 2020-08-14 03:25:53
本篇博客主要记录Java中面向对象的概念知识和一些基础Java类的使用。属于自己平时学习过程中知识点的“拼凑”,方便自己回顾总结。 1. 什么是面向对象 面向对象是一种优秀的软件设计思想,是相对于 面向过程、面向切面 等设计思想的一种软件设计理念。它的核心思想是运用更加贴近人类思维的方式去设计软件,将软件中的各个组件抽象成相应的类,再将这些类组装成我们所需的软件系统。这里举个例子,假如用面向对象的方式设计一个电脑,我们会设计CPU类、硬盘类、显示器类、内存类等等,然后将这些类组合在一起设计成Computer类。 面向过程的思想在解决问题时会将问题分解成一个个小的函数,然后按照某种顺序去执行这些方法,当这些方法执行完毕,问题也就解决了。 2. 三大基本特征和五项基本原则 面向对象的三个基本特征是: 封装、继承和多态 。正是基于这些特征,面向对象的开发语言才能拥有更好的可重用性、扩展性和维护性。 封装:将对象的实现细节隐藏起来,然后通过一些公共的方法向外部提供该对象的功能; 继承:继承是软件复用的一种重要手段,子类继承父类之后将直接获得父类的属性和方法; 多态:对象可以赋给父类对象和接口,但是运行时依然表现出子类或实现类的特征。 面向对象的 五大原则 如下: 单一职责原则(SRP):一个类专注于实现一个功能; 开闭原则(OCP):对象或实体应该对扩展开放,对修改封闭; 里氏替换原则

Scala 隐式(implicit)详解

老子叫甜甜 提交于 2020-08-13 18:46:54
参考文章: Scala 隐式(implicit)详解 文章正文 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码。 1、Spark 中的隐式思考 隐式转换是Scala的一大特性, 如果对其不是很了解, 在阅读Spark代码时候就会很迷糊,有人这样问过我? RDD这个类没有reduceByKey,groupByKey等函数啊,并且RDD的子类也没有这些函数,但是好像PairRDDFunctions这个类里面好像有这些函数 为什么我可以在RDD调用这些函数呢? 答案就是Scala的隐式转换; 如果需要在RDD上调用这些函数,有两个前置条件需要满足: 首先rdd必须是RDD[(K, V)], 即pairRDD类型 需要在使用这些函数的前面Import org.apache.spark.SparkContext._;否则就会报函数不存在的错误; 参考SparkContext Object, 我们发现其中有上10个xxToXx类型的函数: implicit def intToIntWritable(i: Int) = new IntWritable(i) implicit def longToLongWritable(l: Long) = new LongWritable

精心整理,kafka常见面试题,看这篇文章就够了(共17题,含详细解答)

試著忘記壹切 提交于 2020-08-13 17:46:40
【 Java架构师面试网 】收集整理了几乎整个架构师学习途中会遇到的面试题,希望大家都能早日圆自己的架构师梦~ 公众号: Java架构师面试网 ,关注回复“ 资料 ”即可领取精美整理的面试资料一份哦~ Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。 1.Kafka 的设计时什么样的呢? Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消费消息的程序成为 consumer. Kafka 以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个 broker. producers 通过网络将消息发送到 Kafka 集群,集群向消费者提供消息 2.数据传输的事物定义有哪三种? 数据传输的事务定义通常有以下三种级别: ( 1)最多一次: 消息不会被重复发送,最多被传输一次