自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

书忆江南的IT博客

保持积累和远见。

  • 博客(72)
  • 资源 (2)
  • 收藏
  • 关注

原创 如何排查Trino常见报错问题

Trino权威指南》第12章及周边涉及知识,基于392版本的使用层面入门书,引擎创始人亲自编写:中文翻译版《》第12章及周边,基于330版本。(1)编译原理基础(SQL语法解析token、生成AST抽象语法树、将AST生成执行计划并优化覆盖的过程,如《ANTLR4权威指南》)、《数据库系统内幕》等计算机专业通用底层课程;(2)《Presto技术内幕》等深入底层原理的Trino源码级书籍或博客。(3)《》等大数据平台全貌入门书。

2023-07-03 21:01:15 1700

原创 使用Benchto框架对Trino进行SQL性能对比测试

有时需要对魔改源码前后的不同版本Trino引擎进行性能对比测试,提前发现改造前后是否有性能变差或变好的现象,避免影响数据业务的日常查询任务性能。而Trino社区正好提供了一个性能测试对比框架:因此使用它可以较大程度上减少一通魔改后,看起来代码量很大且功能很牛,但是实际上线性能拉垮,改了个寂寞的现象。

2023-02-15 22:05:21 2322 1

原创 Trino源码Gitlab CICD单测环境搭建

在中大型公司,由于对Trino源码的定制魔改量越来越大,会随着时间推移而增大出现冷门bug的概率,所以建立一套自动测试机制,在魔改源码合入主分支时可以自动触发test case,通过特定单测的执行失败,来更清晰的判断是否过去的魔改涉及到了不符合社区源码原本假设的部分,并对魔改后的情况不一致进行修正。Gitlab Runner正好可以提供这样的机制,提升更早发现源码改动问题的效率。

2022-11-21 17:19:49 2619

原创 Presto和Spark语法差异

Presto返回2,Spark返回2.5。Spark会返回结果12,Presto会返回空,除非写select substr('123', 1, 2);Spark会返回1,而Presto会报错。该查询中tag列中包含特殊空格制表符,如下图所示:在Presto中,末尾处的正则表达式应该用解决方法:使用element_at(map(K, V), key)获取值,不要用map[key]写法。参考:Presto与众不同的那些坑_while(True):的博客-CSDN博客_presto unnest。

2022-10-31 22:04:45 3778

原创 Hive与SparkSQL语法差异

解决方案:(1)修改UDF代码,把static相关变量去掉换成非static的变量(2)把SimpleDateFormat设置成ThreadLocal的:(3)使用 joda-time来转换日期时间。

2022-10-31 21:45:35 4185

原创 Hive DDL操作出现卡住现象源码分析与解决方法

最近遇到对Hive进行alter table时卡住无后续响应的问题,如下图所示:即使重启Hive Metastore也依然无法解决这个问题,但是,经过排查后基本知道了原因所在,以及可以解决的办法。

2022-09-21 12:49:35 3669

原创 Lyft Presto Gateway源码机制分析

Presto Gateway支持多个后端Trino集群的激活与停用、增加与删除、负载均衡等,在客户端第一次http请求时可以根据负载均衡选择一个Trino Backend,后续的多个同一查询请求都能找到第一次时发往的那个Trino Backend。............

2022-08-30 16:33:47 2427

原创 Hive Metastore源码新增Thrift API方法

如果工作中使用了m1芯片Mac,则protobuf等底层通信和序列化相关的老版本jar包没有提供osx_aarch64版本(例如hive3依赖的2.5.0版本),本地编译无法通过,需要利用到Linux上的thrift命令行来对hive源码进行编译和自动代码生成。同时还有.cpp、.php等其他语言文件的改动和生成,如果不需要实现其他语言的接口,可以把除.java以外的文件改动都撤回(例如使用。从rpc通信的client和server端角度,目前完善的是server端的代码,如果。...

2022-08-02 17:40:31 2656 1

翻译 深入理解ORC文件结构

ORC文件的总体结构如下:orc文件结构对数据的查找和索引本质上是三层过滤:文件级、Stripe级、Row Group级。这样可以把最终实际要扫描读取的数据减少到部分Stripe的部分RowGroup,不用全扫整个文件。也就是先从文件末尾往前读文件元数据,再跳着读Stripe元数据,最终读需要的Stripe中的部分数据。一、文件级为了在SQL查询时更快跳过where等过滤条件中不需要的文件,在文件级别首先通过file tail来记录文件级别的元数据信息。file tail自底向上主要由这三部

2022-02-14 20:09:40 6871 2

原创 Trino Worker端执行task与读ORC文件源码链路流程

下述Worker源码调用链路基于Trino(原PrestoSQL)330版本:// 生产流程TaskResource.createOrUpdateTask ->SqlTaskManager.updateTask ->SqlTask.updateTask ->SqlTaskExecution.addSource ->updateSources ->schedulePartitionedSource

2022-01-19 15:37:38 2039

原创 Hive表数据量统计原理和源码分析

在Hive explain获得执行计划时,经常会看到如下图所示的表数据量统计:那么这个数据量,Hive是如何统计出来的呢?一、Data size统计1.1、Hive源码在Hive通过Antlr语法解析器获取到SQL的抽象语法树(AST)并生成校验过元数据的逻辑执行计划后,在优化阶段会使用Statistics统计的规则(rule),如下图所示:在AnnotateWithStatistics这个类中,在对执行计划进行转化(transform)时会调用TableScanStatsRul

2021-07-21 15:32:53 3484

原创 JVM基本原理笔记

一、Java代码如何运行1. Java的执行方式都离不开JRE,也就是Java运行时环境。实际上JRE仅包含运行Java程序的必需组件,包括JVM以及Java核心类库等。JDK同样包含了JRE,并且还附带了一系列开发、诊断工具。然而运行C++代码无需额外的运行时,往往把这些代码直接编译成CPU所能理解的代码格式,也就是机器码。比如下面的中间列,就是用C语言写的Helloworld程序的编译结果。可以看到C程序编译而成的机器码就是一个个字节,它们是给机器读的。为了让开发人员也能够理解,可以用反汇编器将其转

2021-01-16 19:32:27 1864

原创 Spark CallerContext源码分析与远程debug

最近为了治理集群中部分Spark任务造成的小文件过多,从而导致机器IO数和使用率过高的现象,看到社区中的issue:SPARK-16757,提到了Spark在yarn模式下启动Client、ApplicationMaster、Task等时,会通过反射调用注册Hadoop那边的CallerContext,从而在rm-audit.log中额外打印提交的Spark Client信息;并在hdfs-audit.log中除操作类型和涉及HDFS目录外,额外打印Spark类型、application号、stage号、t

2021-01-14 21:41:25 2877

原创 Git rebase合并多条commit记录

在定制Spark源码内部功能的过程中,和其他Git托管项目一样,都会产生对同一个功能不断改进、多次远程提交生成commit记录的情况,为了保证一个功能点只有一条提交记录利于后续维护,需要利用git rebase命令对属于同一功能点的多条commit记录进行合并。一、确定此次合并基于的base记录在开发中提交与改进了共四次,生成了四条commit记录,用git log命令可以看到,蓝色高亮的“Support”那一行代表某功能点的第一次提交记录,如下图所示:既然要合并“Support”那一条与它

2020-11-27 16:39:31 18198

原创 如何查看Spark日志与排查报错问题

一、各界面说明1.1、查看YARN页面的driver日志可以在右侧搜索框中填对应application号找到任务,然后点击对应的application号链接,如下图所示:这样会进入该application的信息界面,“FinalStatus”显示了该application的最后状态,点击下方的“logs”按钮也会进入到driver日志界面,如下图所示:对于driver日志而言,代码中的println()和show()等函数的输出,一般都在stdout里,大部分重要的报错信息都在s

2020-10-29 17:27:12 17583 12

原创 编译型语言后端原理笔记

一、编译器的后端技术1. 编译器的前端技术,重点是让编译器能够读懂程序,无结构的代码文本经过前端的处理以后,就变成了Token、AST和语义属性、符号表等结构化的信息,基于这些信息,可以实现简单的脚本解释器。但很多情况下,需要继续把程序编译成机器能读懂的代码,并高效运行。这时就面临了三个问题:(1)必须了解计算机运行一个程序的原理(也就是运行期机制),只有这样才知道如何生成这样的程序。(2)要能利用前端生成的AST和属性信息,将其正确翻译成目标代码。(3)需要对程序做尽可能多的优化,比如让程

2020-10-17 21:06:32 3007 2

原创 Jenkins自动化构建项目

一、创建项目并配置登录到Jenkins主页后,可以用view标签上的“+”号新建分类标签,在对应view里建立新的Project,或者点击左上角的“New Item”建立,如下图所示:这里以Spark项目的构建配置为例,建立一个Freestyle project,如下图所示:在对应view标签下建立的Project,可以下方打勾加入到对应view中,接着就会进入项目配置界面,如下图所示:(1)首先是General部分,可以填该项目的描述、保留多长时间和几个的历史编译目录,与bui

2020-09-25 20:01:18 1922

原创 脚本语言编译前端算法笔记

一、NFA和DFA:正则表达式处理1. 在词法分析阶段,可以手工构造有限自动机(FSA,或 FSM)实现词法解析,过程比较简单。现在不需要再手工构造词法分析器,而是直接用正则表达式解析词法:(1)首先,把正则表达式翻译成非确定的有限自动机(Nondeterministic Finite Automaton,NFA)。(2)其次,基于NFA处理字符串,看看它有什么特点。(3)然后,把非确定的有限自动机转换成确定的有限自动机(Deterministic Finite Automaton,DFA)

2020-08-12 22:46:49 1858

原创 脚本语言编译前端原理笔记

一、编译器的前端技术1. 编译原理中的“前端(Front End)”指的是编译器对程序代码的分析和理解过程。它通常只跟语言的语法有关,跟目标机器无关。而与之对应的“后端(Back End)”则是生成目标代码的过程,跟目标机器有关。编译过程如下所示:可以看到,编译器的“前端”技术分为词法分析、语法分析和语义分析三个部分。通常,编译器的第一项工作叫做词法分析(Lexical Analysis)。就像阅读文章一样,文章是由一个个单词组成的,程序处理也一样,只不过这里不叫单词而是叫做“词法记号”即Tok

2020-07-17 23:29:27 2194 1

原创 大数据算法基础笔记

一、分类算法:对数据分类和预测1. KNN算法即K近邻(K Nearest Neighbour)算法,是一种基本的分类算法,其主要原理是:对于一个需要分类的数据,将其和一组已经分类标注好的样本集合进行比较,得到距离最近的K个样本,K个样本最多归属的类别,就是这个需要分类数据的类别。下面是KNN算法的原理图:上图中,红蓝绿三种颜色的点为样本数据,分属三种类别ω1​、ω2​和ω3。对于待分类点Xu,计算和它距离最近的5个点即K为5,这5个点最多归属的类别为ω1(4个点归属ω1,1个点归属ω3​),那

2020-06-01 10:53:34 2710

原创 网络通信协议综述笔记

一、网络协议与网络分层1. 当想要买一个商品,常规的做法就是打开浏览器,输入购物网站的地址。浏览器就会显示一个页面,它之所以能够显示这个页面,是因为它收到了一段来自HTTP协议的响应。拿考拉海购来举例,格式就像下面这样:HTTP/1.1 200 OKDate: Tue, 27 Mar 2018 16:50:26 GMTContent-Type: text/html;charset=UTF-8Content-Language: zh-CN<!DOCTYPE html><

2020-05-31 23:07:40 1533

原创 Linux容器化原理笔记

一、容器1. 从一台物理机虚拟化出很多虚拟机这种方式,一定程度上实现了资源创建的灵活性。但是同时会发现,虚拟化的方式还是非常复杂的, CPU、内存、网络、硬盘全部需要虚拟化,还有性能损失。那有没有一种更加灵活的方式,既可以隔离出一部分资源,专门用于某个进程,又不需要费劲周折的虚拟化这么多的硬件呢?毕竟最终只想跑一个程序,而不是要一整个Linux系统。在Linux操作系统中,有一项新的技术称...

2020-05-04 20:54:37 3112

原创 Spark常见报错与问题解决方法

1.org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow原因:kryo序列化缓存空间不足。解决方法:增加参数,--confspark.kryoserializer.buffer.max=2047m。2.org.elasticsearch.hadoop.rest.EsHadoopNoN...

2020-04-21 14:52:29 40987 5

原创 Spark高级分析与机器学习笔记

一、高级分析和机器学习概览1. 高级分析是指各种旨在发现数据规律,或根据数据做出预测和推荐等核心问题的技术。机器学习最佳的模型结构要根据要执行的任务制定,最常见的任务包括:(1)监督学习,包括分类和回归,其目标是根据数据项的各种特征预测每个数据项的标签。(2)推荐系统,根据行为向用户推荐产品。(3)无监督学习,包括聚类,异常检测,以及主题建模,其目的是发现数据中的结构。(4)图...

2020-04-20 10:45:40 4776 2

原创 Linux虚拟化原理笔记

一、虚拟机1. 操作系统上的程序分为两种,一种是用户态的程序例如Word、Excel等,一种是内核态的程序例如内核代码、驱动程序等。为了区分内核态和用户态,CPU专门设置四个特权等级0、1、2、3。在虚拟化技术出现以前,内核态运行在第0等级,用户态运行在第3等级,占了两头中间的还没用。如果用户态程序做事情,就切换到第3等级,一旦要申请使用更多的资源,就需要到内核态第0等级,内核才能在高权限访问...

2020-04-09 07:38:51 3138

原创 Spark Structured Streaming笔记

一、流处理基础1. 流处理是连续处理新到来的数据以更新计算结果的行为。在流处理中输入数据是无边界的,没有预定的开始或结束。它是一系列到达流处理系统的事件(例如信用卡交易、点击网站动作,或从物联网IoT传感器读取的数据),用户应用程序对此事件流可以执行各种查询操作(例如跟踪每种事件类型的发生次数,或将这些事件按照某时间窗口聚合)。应用程序在运行时将输出多个版本的结果,或者在某外部系统(如HBas...

2020-03-31 17:39:36 1442

原创 Linux网络系统原理笔记

一、Socket网络协议基本原理1. 假设这里就涉及三台机器。Linux服务器A和B处于不同的网段,通过中间的Linux服务器作为路由器进行转发,如下图所示:说到网络协议,还需要简要介绍一下两种网络协议模型,一种是OSI标准七层模型,一种是业界标准的TCP/IP模型,它们的对应关系如下图所示:为什么网络要分层呢?因为网络环境过于复杂,不是一个能够集中控制的体系。全球数以亿记的服...

2020-03-29 15:07:39 1856 4

原创 Spark应用与调优笔记

一、Spark是如何在集群上运行的1. Spark的driver和executor并不是孤立存在的,cluster manager会将它们联系起来,集群管理器负责维护一组运行Spark application的机器。集群管理器也拥有自己的“driver”(即master节点,在yarn中是Resource Manager)和worker的抽象,核心区别在于集群管理器管理的是物理机器,而不是进程...

2020-03-24 19:27:20 1069

原创 Spark低级API笔记

一、RDD1. 在绝大部分场景下,用户都应该尽量使用DataFrame等结构化API,只有当这类高级API无法解决遇到的业务或工程问题的时候,才需要使用Spark的低级API,例如弹性分布式数据集(RDD)、SparkContext和分布式共享变量(例如累加器和广播变量)。下列三种场景,通常需使用到低级API:(1)当在高级API中找不到所需的功能时,例如要对集群中数据的物理放置进行非常严...

2020-03-20 10:07:29 551

原创 Linux进程间通信原理笔记

一、进程间通信1. 在讲进程间通信之前,先来讲讲管道模式。记得最初学Linux命令的时候,有下面这样一行命令:ps -ef | grep 关键字 | awk '{print $2}' | xargs kill -9这里面的竖线“|”就是一个管道。它会将前一个命令的输出,作为后一个命令的输入。从管道的这个名称可以看出,管道是一种单向传输数据的机制,它其实是一段缓存,里面的数据只能从一端...

2020-03-16 22:05:19 1196

原创 Spark结构化API—DataFrame,SQL和Dataset

一、结构化API概述1. 结构化API是处理各种数据类型的工具,可处理非结构化的日志文件、半结构化的CSV文件以及高度结构化的Parquet文件。结构化API指以下三种核心分布式集合类型的API:Dataset类型、DataFrame类型、SQL表和视图。大多数结构化API均适用于批处理和流处理,这意味着使用结构化API编写代码时,几乎不用改动代码就可以从批处理程序转换为流处理程序(反之亦...

2020-03-12 21:08:09 2565 2

原创 Linux输入输出系统原理笔记

一、输入与输出1. 对于操作系统来讲,控制各种输入输出设备是一件复杂的事情,因为这么多设备,形状、用法、功能都不一样。因此,CPU并不直接和设备打交道,它们中间有一个叫作设备控制器(Device Control Unit)的组件,例如硬盘有磁盘控制器、USB有USB控制器、显示器有视频控制器等。这些控制器就像代理商一样,它们知道如何应对硬盘、鼠标、键盘、显示器的行为。控制器其实有点像一台小...

2020-03-05 22:19:30 1377

原创 Spark概览笔记

一、Spark浅析1. Spark应用程序由一个driver进程和多个executor进程组成,driver进程运行main()函数,位于集群的一个节点上,它负责三件事:(1)维护Spark应用程序的相关信息;(2)回应用户的程序或输入,分析任务并分发给若干executor处理,它在整个应用程序生命周期中扮演着维护所有相关信息和聚合结果的作用。executor负责执行driver分...

2020-02-27 17:25:59 710

原创 Linux文件系统原理笔记

一、文件系统1. 在文件系统中,每个文件都有一个名字,文件名就是一个普通的文本。当然文件名会经常冲突,不同用户取相同名字的情况还是会经常出现的。要想把很多的文件有序地组织起来,就需要让它们成为目录或者文件夹。这样,一个文件夹里可以包含文件夹,也可以包含文件,这样就形成了一种树形结构,可以将不同的用户放在不同的用户目录下,就可以一定程度上避免了命名的冲突问题。如下图所示:不同用户的文件放...

2020-02-19 21:27:08 1463

原创 Linux内存管理原理笔记

一、内存管理1. 每个进程应该有自己的内存空间。内存空间都是独立的、相互隔离的。对于每个进程来讲,看起来应该都是独占的。进程不能直接访问物理内存地址,因为假如三个程序同时访问或写入同一个物理内存地址,就会产生冲突或数据安全问题。为了解决该问题,操作系统会给进程分配一个虚拟地址。所有进程看到的这个地址都是一样的,里面的内存都是从0开始编号。在程序里面,指令写入的地址是虚拟地址。操作系统会提供...

2020-02-16 21:09:42 2673

原创 Linux进程管理原理笔记

一、程序从编译(编译汇编、链接、装载到内存)到运行为进程1. 在Linux上写程序和编译程序,也需要一系列的开发套件,运行下面的命令,就可以在centOS 7操作系统上安装开发套件:yum -y groupinstall "Development Tools"接下来就可以开始写程序了。在Windows上写的程序,都会被保存成.h或者.c文件,容易让人感觉这是某种有特殊格式的文件,但其...

2020-02-09 22:18:23 840

原创 Linux系统初始化基础原理笔记

一、x86架构1. x86架构奠定了当今计算机开放平台的标准和基础,其中最经典的一款处理器是8086处理器。虽然它已经很老了,但是现在操作系统中的很多特性都和它有关,并且一直保持兼容。它的结构示意图如下所示:8086处理器内部有8个16位的通用寄存器,也就是CPU内部的数据单元,分别是AX、BX、CX、DX、SP、BP、SI、DI,这些寄存器主要用于在计算过程中暂存数据。这些寄存器比较...

2020-01-30 18:48:08 703 1

原创 Linux操作系统基础综述笔记

一、Linux内核基础白话1. 在操作系统中,输入设备驱动其实就像客户对接员。有时候新插上一个鼠标的时候,会弹出一个通知安装驱动,这就是操作系统这家外包公司在配备对接人员。当客户告诉对接员需求的时候,对于操作系统来说,输入设备会发送一个中断。这个概念很好理解,客户肯定希望外包公司把正在做的事情都停下来服务它。所以,这个时候客户发送的需求就被称为中断事件(Interrupt Event)。显...

2020-01-28 15:03:07 641

原创 Scala 2.13 par()、XML.loadString()等语法无法解析

Scala 2.13之后,并行集合模块变成了外部库,直接像2.12那样写如下的代码,IDE会报“Cannot resolve symbol par”:cities => (cities.par map getWeatherData).toList这个时候,需要在maven项目的pom.xml中手动导入如下依赖:<dependency> &l...

2019-12-09 18:08:12 930

原创 计算机组成原理现实应用笔记

一、大型DMP系统设计思路1. DMP系统的全称叫作数据管理平台(Data Management Platform),目前广泛应用在互联网的广告定向(Ad Targeting)、个性化推荐(Recommendation)等领域。通常来说DMP系统会通过处理海量的互联网访问数据以及机器学习算法,给一个用户标注上各种各样的标签。然后在做个性化推荐和广告投放的时候,再利用这些这些标签去做实际的广告排...

2019-11-16 10:03:23 1001

WiFiredX安装包,适用于Mac

Mac电脑无线网速慢时的解决办法,通过每次开机时自动关闭airdrop来解决网络信号干扰不稳定的问题,该问题属于MacOS bug,已存在多年和多个大版本

2022-10-31

MySQL必知必会

MySQL初级教程,通俗易懂,使用命令行进行学习与开发。

2018-03-09

C++ primer中文第五版

c++基础教程,用于学习C++基础以及作为工具书进行查找语句

2018-03-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除