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

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的参数作为"$@"进行传递:

# 在用spark-submit提交程序jar及相应参数时,调用该脚本程序  "$@"为执行脚本的参数,将其传递给spark-class.sh
exec "${SPARK_HOME}"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"

spark-class.sh中会将参数传递给org.apache.spark.launcher.Main用于启动程序:

ReadMore »

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

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

内存区域划分

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

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

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

3)本地方法栈(Native Method Stack)用于调用其它语言的方法(如C++),声明周期也与线程绑定;

ReadMore »

使用kubernetes构建微服务

kubernetes

Build distributed services with kubernetes

Kubernetes (commonly stylized as k8s) is an open-source container-orchestration system for automating application deployment, scaling, and management. It aims to provide a “platform for automating deployment, scaling, and operations of application containers across clusters of hosts”.

一、在elementory OS服务器搭建kubernetes环境

elementary OS是基于ubuntu精心打磨美化的桌面 linux 发行版的一款软件,号称 “最美的 linux”, 最早是 ubuntu 的一个美化主题项目,现在成了独立的发行版。”快速、开源、注重隐私的 windows / macOS 替代品”。

1)在elementary OS系统上安装docker环境,具体可以参考 https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/

# 1.更新ubuntu的apt源索引
sam@elementoryos:~$ sudo apt-get update
# 2.安装以下包以使apt可以通过HTTPS使用存储库repository
sam@elementoryos:~$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 3.添加Docker官方GPG key
sam@elementoryos:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 4.设置Docker稳定版仓库
sam@elementoryos:~$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 5.再更新下apt源索引,然后通过docker version显示器版本信息
sam@elementoryos:~$ apt-get update
sam@elementoryos:~$ sudo docker version
Client:
 Version:           18.09.7
Server:
 Engine:
  Version:          18.09.7
# 6.从镜像中心拉取hello-world镜像并进行运行
sam@elementoryos:~$ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

ReadMore »

深入理解kafka消息中间件

kafka-message-system

Kafka分布式消息中间件使用:

Kafka是为了解决LinkedIn数据管道问题应用而生的,它的设计目的是提供一个高性能的消息系统,可以处理多种数据类型,并能够实时提供纯净且结构化的用户活动数据和系统度量指标。

数据为我们所做的每一件事都提供了动力。—— Jeff Weiner, LinkedIn CEO

一、基础环境搭建:

Kafka依赖于Zookeeper的分布式节点选举功能,安装Kafka需安装JdkZookeeperScala组件。

Apache官网中心下载Zookeeper组件,然后安装Zookeeper环境:

# 创建zookeeper的数据目录data
> mdkir /usr/local/zookeeper/data
# 修改zookeeper配置文件zoo.cfg中的参数信息(指定数据目录、zookeeper暴露端口号)
tickTime=2000
dataDir=/usr/local/zookeeper/data
clientPort=2181
# 启动zookeeper服务,其会加载zoo.cfg作为其配置文件
> /usr/local/zookeeper/bin/zkServer.sh start

在安装好JavaZookper之后就可以进行安装Kafka消息中间件,可以从Apache Kafka官网下载kafka消息中间件,然后进行配置安装。

ReadMore »