Kudu 启动性能优化--slurp metadata file into memory
背景 Kudu 启动慢是长期以来饱受诟病的一个问题,部分数据量大的集群,单节点重启极端耗时需要 30 分钟以上,同时其部分参数并不能进行运行时调优,需要重启才能生效,这困扰着运维人员,影响升级和变更流程。 社区以及一些组织实现了一些优化方案,具体可以见 此文 tserver启动加速 一节,一些具体的 patch 包括: KUDU-2977 Sharding block map of …
[笔记] Kudu 存储引擎 | Kudu 文件系统
Block 抽象接口 操作系统把磁盘抽象成文件,Kudu 则在文件之上再加了一层抽象——Block。在 Kudu 中,一列数据、一个 BloomFilter、一份主键索引,最终都变成一个或多个 Block 写入磁盘。Block 是 Kudu 存储引擎与本地文件系统之间的分界线:上层组件只需面对 Block 接口的 Append / Read,不必关心底层是一个独立文 …
[笔记] Kudu 存储引擎 | memrowset 实现详解
数据结构 MemRowSet 是 Kudu tablet 中用来暂存新写入数据的内存结构。它的底层存储是一棵并发 B-tree(CBTree),每个叶节点条目存放一个 key-value 对:key 是主键的编码形式(字典序 = 主键逻辑序),value 是一个 MRSRow。 为了支持快照一致性,MemRowSet 从不原地更新已插入的行数据——所有后续变更都以 Mutation 节点的形式挂在 …
Linux 网络 —— 数据包的发送
背景 Linux 网络–数据包的接收 一文中分析了 Linux 是如何接收一个数据包的,那么 Linux 在发送数据包的时候又是什么样的呢?本文聚焦于 Linux 数据包的发送,结合内核源码分析数据包的发送过程。 关于 Linux 网络数据包的接收可以阅读前文: Linux 网络 —— 数据包的接收 日期: 2024-08-24 标签: #Linux #net 背景 最初学习计算机网络的时 …
Linux 网络 —— 数据包的接收
背景 最初学习计算机网络的时候,通常都是从 TCP/IP 网络分层模型入手,学习各种协议,如 TCP、IP等,以及相关的原理,并未过多关注整个协议栈具体是如何实现的。在开发的过程中,通过高级语言往往只需要几行就能实现一个简单的网络程序,并从网络接收数据。然而数据具体是如何从网卡达到我们的进程中的呢?在这个过程中网卡和内核到底又做了些什么呢?数据在这个过程中是如何流转、复制的呢?带着这些问题,笔者最 …
Kudu Tablet Server 非事务写入流程分析
序 本文记录 kudu 源码阅读笔记,记录了 kudu tserver 端非事务写入的完整流程。 写入流程总览 Kudu 的一次“非事务”写(普通单/批行 Insert/Upsert/Update/Delete,不带 txn_id)在 tserver 侧需要经历以下阶段: Client 组装 WriteRequestPB 并通过 RPC 发送 (tserver_service.proto: …
Kudu 概览
为什么需要 Kudu 在 Hadoop 生态中结构化的数据通常使用两种方式进行存储:一是通过 Apache Parquet 等二进制数据格式,将静态数据集存储在 HDFS 上,二是将可变数据以半结构化的方式存储在 HBase 中。这里面临的问题是存储在 HDFS 上的数据无法提供单个记录的随机访问,HBase 中存储的数据尽管允许低延迟的读取和写入,但是基于 SQL 分析的应用中顺序读取的吞吐方面 …
Python 中的元类
元类(metaclass)是 Python 中一个高级概念,它控制了类的创建过程。在 Python 的开源框架中,可以看到很多元类的相关身影,学习并理解元类也可以帮助理解 Python 中的类的创建过程。 一切皆对象 在 Python 中一切皆对象,类也不例外,类也是一个对象,可以像普通对象一样进行赋值、拷贝以及作为函数的参数使用。我们知道每个对象都有一个类型,在 Python …
Kubernetes 整体架构与核心组件
Kubernetes 整体架构 从整体来看 Kubernetes (k8s) 主要由两种节点组成,分别是 Master 节点和 Node 节点,其整体结构如图1 所示。Master 节点由三个紧密协作的独立组件组合而成,分别是:kube-apiserver、kube-scheduler 以及 kube-controller-manager;Node 节点上最核心的是名为 kubelet …
[译]阅读的重要性
原文:The Need To Read 在我小的时候阅读的科幻小说中,阅读常常被一些更高效获取知识的方式所取代。神秘的“磁带”会将知识加载到一个人的大脑中,就像将程序加载到计算机中一样。 这种情况很可能不会很快发生。不仅因为构建阅读的替代品很困难,而且即使存在一个替代品,也是不够的。阅读关于 x 的内容不仅教给你关于 x 的知识,还教给你如何写作1。 那又怎样?如果我们替代了阅读,还需要有人擅长 …
rsync 用法
在不同的机器和服务器之间进行数据同步是一个常见的场景,也有不同的命令工具(如 scp、FTP 等),甚至是不同的图形界面软件(如 Termius 等)可供我们选择操作。本文记录的 rsync (remote sync)也是用于文件同步的工具之一,其最大的特点是会检查发送方和接收已有的文件,并仅传输有变动的部分。rsync 不仅可以在本地不同的目录之间使用,同时也支持本地主机与远程服务器之间进行数据 …
Linux 60秒性能分析
原文:Linux Performance Analysis in 60,000 Milliseconds 当你登陆到一台性能出现问题的 Linux 服务器:你在第一分钟会检查什么? 在 Netflix,我们拥有一个庞大的 EC2 Linux 云和大量的性能分析工具,用于监控和调查其性能。其中包括 Atlas 用于云范围的监控和 Vector 用于按需实例分析。虽然这些工具帮助我们解决了大多数问 …
Git 常用命令总结
配置 1 2 3 4 5 6 git config --list # 查看配置 git config -e [--global] # 编辑配置文件 # 设置提交代码时的用户信息 git config [--global] user.name "[name]" git config [--global] user.email "[email address]" 版本管理 版本回退 git reset …
Hugo Shortcodes 示例
大多数的静态博客会使用 Markdown 进行写作,因为它的格式简单,但是 Markdown 也有它的不足之处。当我们想要将图片或者视频等加入到文章内容中时,Markdown 本身并不能提供很好的支持,因此不得不将一些 HTML 片段加入到 Markdown 内容中。尽管在一些简单的场景中这样做能够解决问题,但是却破坏了 Markdown 文件的简洁性质。另外如果想对一些内容进行装饰也变得非常麻 …
Channel原理与实现
数据结构 channel内部的数据结构表示如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 type hchan struct { qcount uint // channel中元素的个数 dataqsiz uint // channel中循环队列的长度 buf unsafe.Pointer // channel缓冲数据指针 elemsize uint16 // 收发的元素 …
个人博客技术选型与实践
技术选型与可替代方案 在搭建博客的过程中涉及到很多的选择,例如我们会考虑博客的类型,是使用静态博客还是动态博客。之后又涉及到博客框架的选择,当前有很多的框架可供我们选择,如果所有的选择都不满意甚至可以考虑自己从头设计一个或者基于一个框架或者主题等进行个性化的修改。我们的博客最终是需要通过互联网可访问的,这又涉及到我们将其部署在哪里,采用何种方式进行部署。下表展示了本站的技术选型以及其他一些可替代的 …
职业的乐趣与苦恼
摘自 FrederickP.Brooks.Jr 的《人月神话》第一章 焦油坑 职业的乐趣 编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐? 首先是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到愉快一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种呈现在每片独特、崭新的树叶和雪花上的喜悦。 其次,快乐来自于开发对其他人有用的东西。内心深处,我们期望其他人 …