Lanyon 记录下日常工作与学习哈~,还有技术分享哦。。🎉

kafka client客户端实践及原理剖析

主要描述kafka java client的一些实践,以及对client操作数据的一些原理进行剖析。

kafka对集群部署环境的一些考虑,kafkaScala 语言和 Java 语言编写而成,编译之后的源代码就是普通的“.class”文件。本来部署到哪个操作系统应该都是一样的,但是不同操作系统的差异还是给 Kafka 集群带来了相当大的影响。

主流的操作系统有3种:windowslinuxmacOS,考虑到操作系统与kafka的适配性,linux系统显然要比其它两个更加合适部署kafka,主要在I/O模式的使用、数据网络传输效率、社区支持度三个方面支持比较好。

linux中的系统调用select函数属于I/O多路复用模型,大名鼎鼎的epoll系统调用则介于I/O 多路复用、信号驱动I/O模型。因此在这一点上将kafka 部署在Linux 上是有优势的,因为能够获得更高效的 I/O性能。零拷贝(Zero Copy)技术,就是当数据在磁盘和网络进行传输时避免昂贵的内核态数据拷贝从而实现快速的数据传输,Linux 平台实现了这样的零拷贝机制。

ReadMore »

分析spark在yarn-client和yarn-cluster模式下启动

文章分析sparkyarn-clientyarn-cluster模式下启动的流程,yarnapache开源的一个资源管理的组件。JobTrackeryarn中大致分为了三块:一部分是ResourceManager,负责SchedulerApplicationsManager;一部分是ApplicationMaster,负责job生命周期的管理;最后一部分是JobHistoryServer,负责日志的展示;

先看一个spark官网上通过yarn提交用户应用程序的spark-submit脚本,从该脚本开始分析在yarn环境下执行的流程。

./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master yarn \
  --deploy-mode cluster \  # can be client for client mode
  --executor-memory 20G \
  --num-executors 50 \
  /path/to/examples.jar \
  1000

在分析源码前需要在父pom.xml中引入yarn资源代码模块,使得其class文件加载到classpath中。

ReadMore »

spark standalone模式启动源码分析

spark目前支持以standalone、Mesos、YARN、Kubernetes等方式部署,本文主要分析apache spark在standalone模式下资源的初始化、用户application的提交,在spark-submit脚本提交应用时,如何将–extraClassPath等参数传递给Driver等相关流程。

spark-submit.sh提交用户app开始进行分析,--classjar包中的main类,/path/to/examples.jar为用户自定义的jar包、1000为运行SparkPi所需要的参数(基于spark 2.4.5分析)。

# Run on a Spark standalone cluster in client deploy mode
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://207.184.161.138:7077 \
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/examples.jar \
  1000

sparkbin目录下的spark-submit.sh脚本中存在调用spark-class.sh,同时会将spark-submit的参数作为"$@"进行传递:

ReadMore »

jvm常见垃圾回收算法及双亲委派模型

java相对于C++优势在于自动的垃圾回收,提供对象的构造函数后,不需要再提供析构函数(销毁对象,释放之前申请的内存),更易避免了内存泄露的问题。主要归功于虚拟机进行垃圾回收,虚拟机版本有Sun公司的HotSopt VMBEAJRockit、微软的JVMIBMJ9 VM

内存区域划分

Java虚拟机在执行程序时会把管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间。

1)程序计数器(Program Counter Register)占用一块较小的内存空间,可看作是当前线程执行字节码的行号指示器(与操作系统中的PC的概念相同,指定下一条指令的位置)。在执行分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。每个线程都有一个独立的程序计数器;

2)Java虚拟机栈也是线程私有的,声明周期与线程相同。描述Java方法执行的内存模型,每个方法执行会创建一个栈帧 用于存储局部变量表、操作数栈、动态链接、方法出口等信息。递归方法调用超过最大深度时 将跑出StackOverflowError的异常;

ReadMore »

使用kubernetes构建微服务

kubernetes

ReadMore »