【深入浅出 Yarn 架构与实现】2-1 Yarn 基础库概述
了解 Yarn 基础库是后面阅读 Yarn 源码的基础,本节对 Yarn 基础库做总体的介绍。
并对其中使用的第三方库 Protocol Buffers 和 Avro 是什么、怎么用做简要的介绍。
一、主要使用的库
- Protocol Buffers:是 Google 开源的序列化库,具有平台无关、高性能、兼容性好等优点。YARN 将其用到了 RPC 通信中,默认情况 下,YARN RPC 中所有参数采用 Protocol Buffers 进行序列化 / 反序列化。
- Apache Avro:是 Hadoop 生态系统中的 RPC 框架,具有平台无关、支持动态模式(无需编译)等优点,Avro 的最初设计动机是解决 YARN RPC 兼容性和扩展性 差等问题。
- RPC 库:YARN 仍采用了 MRv1 中的 RPC 库,但其中采用的默认序列化方法被替换成了 Protocol Buffers。
- 服务库和事件库 :YARN 将所有的对象服务化,以便统一管理(比创建、销毁等), 而服务之间则采用事件机制进行通信,不再使用类似 MRv1 中基于函数调用的方式。
- 状态机库:YARN 采用有限状态机描述一些对象的状态以及状态之间的转移。引入状态机模型后,相比 MRv1, YARN 的代码结构更加清晰易懂。
二、第三方开源库介绍
一)Protocol Buffers
1、简要介绍
Protocol Buffers 是 Google 开源的一个语言无关、平台无关的通信协议,其小巧、高效和友好的兼容性设计,使其被广泛使用。
【可以类比 java 自带的 Serializable 库,功能上是一样的。】
Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.
核心特点:
- 语言、平台无关
- 简洁
- 高性能
- 兼容性好
2、安装环境
以 mac 为例(其他平台方式请自查)
# 1) brew安装
brew install protobuf
# 查看安装目录
$ which protoc
/opt/homebrew/bin/protoc
# 2) 配置环境变量
vim ~/.zshrc
# protoc (for hadoop)
export PROTOC="/opt/homebrew/bin/protoc"
source ~/.zshrc
# 3) 查看protobuf版本
$ protoc --version
libprotoc 3.19.1
3、写个 demo
1)创建个 maven 工程,添加依赖
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.19.1</version> <!--版本号务必和安装的protoc版本一致-->
</dependency>
</dependencies>
2)根目录新建 protobuf 的消息定义文件 student.proto
proto 数据类型语法定义可以参考:ProtoBuf 入门教程
syntax = "proto3"; // 声明为protobuf 3定义文件
package tutorial;
option java_package = "com.shuofxz.learning.student"; // 生成文件的包名
option java_outer_classname = "StudentProtos"; // 类名
message Student { // 待描述的结构化数据
string name = 1;
int32 id = 2;
optional string email = 3; //optional 表示该字段可以为空
message PhoneNumber { // 嵌套结构
string number = 1;
optional int32 type = 2;
}
repeated PhoneNumber phone = 4; // 重复字段
}
3)使用 protoc 工具生成消息对应的Java类(在 proto 文件目录执行)
protoc -I=. --java_out=src/main/java student.proto
可以在对应的文件夹下找到 StudentProtos.java 类,里面写了序列化、反序列化等方法。
public class StudentExample {
static public void main(String[] argv) {
StudentProtos.Student Student1 = StudentProtos.Student.newBuilder()
.setName("San Zhang")
.setEmail("zhangsan@yahoo.com")
.setId(11111)
.addPhone(StudentProtos.Student.PhoneNumber.newBuilder()
.setNumber("13911231231")
.setType(0))
.addPhone(StudentProtos.Student.PhoneNumber.newBuilder()
.setNumber("01082345678")
.setType(1)).build();
// 写出到文件
try {
FileOutputStream output = new FileOutputStream("example.txt");
Student1.writeTo(output);
output.close();
} catch(Exception e) {
System.out.println("Write Error ! ");
}
// 从文件读取
try {
FileInputStream input = new FileInputStream("example.txt");
StudentProtos.Student Student2 = StudentProtos.Student.parseFrom(input);
System.out.println("Student2:" + Student2);
} catch(Exception e) {
System.out.println("Read Error!");
}
}
}
以上就是一个 protocol buffers 使用的完整流程了。没什么难的,就是调用了一个第三方的序列化库,将对象序列化到文件,再反序列化读出来。
只不过需要先在 proto 文件中定义好数据结构,并生成对应的工具类。
4、在 Yarn 中应用
在 YARN 中,所有 RPC 函数的参数均采用 Protocol Buffers 定义的。RPC 仍使用 MRv1 中的 RPC。
二)Apache Avro
1、简要介绍
Apache Avro 是 Hadoop 下的一个子项目。它本身既是一个序列化框架,同时也实现 了 RPC 的功能。
但由于 Yarn 项目初期,Avro 还不成熟,Avro 则作为日志序列化库使用,所有事件的序列化均采用 Avro 完成。
特点:
- 丰富的数据结构类型;
- 快速可压缩的二进制数据形式;
- 存储持久数据的文件容器;
- 提供远程过程调用 RPC;
- 简单的动态语言结合功能。
相比于 Apache Thrift 和 Google 的 Protocol Buffers,Apache Avro 具有以下特点:
- 支持动态模式。Avro 不需要生成代码,这有利于搭建通用的数据处理系统,同时避免了代码入侵。
- 数据无须加标签。读取数据前,Avro 能够获取模式定义,这使得 Avro 在数据编码时只需要保留更少的类型信息,有利于减少序列化后的数据大小。
- 无须手工分配的域标识。Thrift 和 Protocol Buffers 使用一个用户添加的整型域唯一性定义一个字段,而 Avro 则直接使用域名,该方法更加直观、更加易扩展。
2、安装环境 & demo
参考:Avro学习入门
3、在 Yarn 中应用
Apache Avro 最初是为 Hadoop 量身打造的 RPC 框架,考虑到稳定性,YARN 暂时采用 Protocol Buffers 作为序列化库,RPC 仍使用 MRv1 中的 RPC,而 Avro 则作为日志序列化库使用。在 YARN MapReduce 中,所有事件的序列化 / 反序列化均采用 Avro 完成,相关定义在 Events.avpr 文件中。
三、总结
本节简要介绍了 Yarn 中五个重要的基础库,了解这些库会帮助了解 Yarn 代码逻辑和数据传递方式。
对其中两个第三方开源库进行了介绍。Protocol Buffers 用作 RPC 函数参数的序列化和反序列化;Avro 在日志和事件部分的序列化库使用。
【深入浅出 Yarn 架构与实现】2-1 Yarn 基础库概述的更多相关文章
- 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC
RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑, ...
- 【深入浅出 Yarn 架构与实现】3-1 Yarn Application 流程与编写方法
本篇学习 Yarn Application 编写方法,将带你更清楚的了解一个任务是如何提交到 Yarn ,在运行中的交互和任务停止的过程.通过了解整个任务的运行流程,帮你更好的理解 Yarn 运作方式 ...
- 【深入浅出 Yarn 架构与实现】2-3 Yarn 基础库 - 服务库与事件库
一个庞大的分布式系统,各个组件间是如何协调工作的?组件是如何解耦的?线程运行如何更高效,减少阻塞带来的低效问题?本节将对 Yarn 的服务库和事件库进行介绍,看看 Yarn 是如何解决这些问题的. 一 ...
- 【深入浅出 Yarn 架构与实现】2-4 Yarn 基础库 - 状态机库
当一个服务拥有太多处理逻辑时,会导致代码结构异常的混乱,很难分辨一段逻辑是在哪个阶段发挥作用的. 这时就可以引入状态机模型,帮助代码结构变得清晰. 一.状态机库概述 一)简介 状态机由一组状态组成: ...
- YARN底层基础库
YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...
- 【深入浅出 Yarn 架构与实现】1-1 设计理念与基本架构
一.Yarn 产生的背景 Hadoop2 之前是由 HDFS 和 MR 组成的,HDFS 负责存储,MR 负责计算. 一)MRv1 的问题 耦合度高:MR 中的 jobTracker 同时负责资源管理 ...
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
本文将介绍如何使用 idea 搭建 Hadoop 源码阅读环境.(默认已安装好 Java.Maven 环境) 一.搭建源码阅读环境 一)idea 导入 hadoop 工程 从 github 上拉取代码 ...
- Spark on Yarn 架构解析
. 一.Hadoop Yarn组件介绍: 我们都知道yarn重构根本的思想,是将原有的JobTracker的两个主要功能资源管理器 和 任务调度监控 分离成单独的组件.新的架构使用全局管理所有应用程序 ...
- Yarn集群的搭建、Yarn的架构和WordCount程序在集群提交方式
一.Yarn集群概述及搭建 1.Mapreduce程序运行在多台机器的集群上,而且在运行是要使用很多maptask和reducertask,这个过程中需要一个自动化任务调度平台来调度任务,分配资源,这 ...
随机推荐
- Little Girl and Problem on Trees
题意 给定一棵无边权的树,最多只有一个点度数超过2,有两种操作 1)(0 u x d)将距离u节点d距离之内的节点的值加上x 2)(1 u)询问u节点的值 n<=100000,q<=100 ...
- 【java】学习路线8-cmd带命令编译包
/*java类包(package)package XX.XX.XX; 包名命名规则:(以域名开头,都是小写) com.remooo.xx 编译:javac -d . ...
- spark 写入数据到Geomesa(Hbase)
package com.grady.geomesa import org.apache.spark.sql.jts.PointUDT import org.apache.spark.sql.types ...
- springboot 集成 docsify 实现随身文档
需求分析 文档可以和项目一起进行版本管理 文档可以在线访问 文档可以与springboot项目集成,不需要分开部署 MarkDown支持 文档跟随,打包jar也可以访问 技术选型 对于网上已有的方案, ...
- Jmeter处理响应报文中文乱码
Jmeter在访问发送请求的时候,响应内容如果有中文可能会显示乱码,原因应该是响应页面没有做编码处理,jmeter默认按照ISO-8859-1编码格式进行解析.而我们的响应报文却是utf-8的格式,所 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:6、微服务间的调用方式:Rpc.StartTaskAsync。
系统目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- 安装vm,在vm中安装windows10操作系统。
步骤:双击打开虚拟机文件 根据向导安装 下一步 然后等待安装 安装好了后点击许可证 ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2U ...
- 获取客户端访问真实 IP
转载自:https://www.qikqiak.com/post/get-client-realip/ 通常,当集群内的客户端连接到服务的时候,是支持服务的 Pod 可以获取到客户端的 IP 地址的, ...
- 使用scrapy爬取长安有妖气小说
目标网站:https://www.snwx3.com/txt/434282.html 第一章地址:https://www.snwx3.com/book/434/434282/92792998.html ...
- css语言
css:样式表.级联样式表.层叠样式表 css写在style标签里面,放在head标签中:大括号中写键值对语法 color:文字颜色 Font-family:字体 Font-size:字号 text- ...