自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Deegue

和果子

  • 博客(105)
  • 收藏
  • 关注

原创 深入理解sun.misc.Unsafe原理

前言Unsafe类在JDK源码中被广泛使用,在Spark使用off-heap memory时也会使用到,该类功能很强大,涉及到类加载机制(深入理解ClassLoader工作机制),其实例一般情况是获取不到的,源码中的设计是采用单例模式,不是系统加载初始化就会抛出SecurityException异常。这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率。但是,它是一把双刃剑:正如...

2019-05-06 20:01:08 33600 17

原创 Spark执行计划分析与研究

在学习、使用和研究spark的过程中,逐渐会发现:单纯看官方文档对spark参数调优只能解决一小部分的问题,要想进一步的学习spark,进一步调优甚至在spark源码的基础上二次开发,我觉得收益最高的应该是学习执行计划了。因此在研究spark源码之前,学习执行计划 可以对整个spark执行过程、架构设计都有一个初步的认识。然而国内网站各大博客,都没有找到一个相关入门教程,笔者打算利用空余时...

2018-09-18 11:24:30 20364 5

原创 Spark参数调优详解目录

Spark参数调优需要对各个参数充分理解,没有一套可以借鉴的参数,因为每个集群规模都不一样,只有理解了参数的用途,调试出符合自己业务场景集群环境,并且能在扩大集群、业务的情况下,能够跟着修改参数才算是正确的参数调优。本系列文章仅为个人理解与观点,如果任何地方有疑问与错误,欢迎评论指正!(上次更新时间---2018-09-0515:07)1、背景Spark2.2.1版本(现升级到了...

2018-07-12 10:30:30 15438 1

原创 Intel AVX入门&实践

文章目录前言背景一、AVX二、demo1. 正常相加:2. _mm256_add_pd三、结论前言计算引擎像Spark、Presto这种,想要进一步提升算子性能,可以从算子实现方式着手。本文简单介绍一下SIMD代表指令集 - AVX极其简单使用demo。背景先贴一些基础:SIMD:参考 https://zhuanlan.zhihu.com/p/31271788内存对齐:参考 https://zhuanlan.zhihu.com/p/30007037一、AVX一般参考官方文档来做开发:I

2022-03-15 22:28:17 3877 1

原创 Linux - 深入理解/proc及一些使用场景

文章目录前言背景一、二、使用场景1.文件恢复① 文件被删除时,有进程在访问2.文件被删除时,没有进程在访问总结前言本文主要关于Linux下/proc目录的理解及一些用法。背景在做YARN改造优化时,需要自动判断NM是否部署在docker上,采用的方法是读/proc/1/cgroup文件,发现在/proc下有很多对NM改造有用的信息如meminfo, cpuinfo,并且即使是root用户也是无法手动修改这些内容。一、示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任

2021-03-10 16:14:01 1600 1

原创 YARN : FairScheduler深入解析(NodeUpdate、assignContainer)

一、概要首先,YARN FairScheduler主要做的事情:① 处理NM心跳NodeUpdate,分配container。② 树状维护队列和任务,定时计算fair share等信息,并进行排序。本文重点分析①二、代码1、流程框架① FairScheduler接收心跳 public void handle(SchedulerEvent event) { switch (event.getType()) { .... case NODE_UPDATE:

2020-12-08 21:40:38 674 3

原创 YARN : FairScheduler深入解析(队列维护,demand、fair share计算)

一、概要首先,YARN FairScheduler主要做的事情:① 处理NM心跳NodeUpdate,分配container。② 树状维护队列和任务,定时计算fair share等信息,并进行排序。二、代码1、初始化FairScheduler在RM启动时会初始化FairScheduler, private void initScheduler(Configuration conf) throws IOException { synchronized (this) { th

2020-12-03 16:47:41 1318

原创 Spark用HiveUDF get_json_object内存泄漏问题

1、问题背景首先我们支持Spark使用HiveUDF的实现,在某个任务中,executor GC时间普遍非常长,而Hive同样逻辑就没有问题。选取GC过长的一个executor,dump下内存,发现UDFJson对象非常大:于是推测其中存在内存泄漏。2、问题排查本文代码为社区Spark master分支a834dba120在解析SQL时我们可以看到注册UDF函数入口Analyzer.scala:发现函数注册提供qualifiedName以及不覆盖已注册的函数SessionCatalog

2020-11-17 16:53:20 785 1

原创 Hadoop: Fair Scheduler

介绍Fair Scheduler是公平分配YARN资源的方法之一。默认情况下,Fair Scheduler只基于内存来保证公平分配,通过配置yarn.scheduler.fair.cpu-scheduling-enabled为true,可以基于内存+CPU来分配资源。当只有一个application在运行时,它可以使用整个集群资源。当其他app提交后,资源会被释放并分配给新来的app,这样就能保证大家拥有大致相同的资源。Fair Scheduler还可以根据每个app的权重、优先级来确定分配资源的比例。

2020-10-10 12:09:56 27233 1

原创 Hive2.3.6升级至Hive3.1.3踩坑

1、coalesce报错FAILED: SemanticException [Error 10014]: Line 197:4 Wrong arguments ''10'': Unsafe compares BETWEEN different types are disabled for safety reasons. If you know what you are doing, please SET hive.strict.checks.type.safety t

2020-07-28 10:02:36 5644 3

原创 Hadoop 2.6.0升级至Hadoop 3.2.1及回滚

1、背景计划升级Hadoop版本从2.6.0-cdh5.16.1升级至开源3.2.1。Hive版本为2.3.6,与Hadoop3.2.1不兼容,于是测试Hive3.1.3。2、问题① 启动报错Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V at org.

2020-07-20 14:21:13 2722

原创 Hive server2慢启动问题排查与解决

1、问题描述在Hive升级到2.3.6版本后,启动Hive server2需要花费15分钟左右的时间,这对于平时调试和紧急重启影响很大。因此查看启动log,发现两处疑点:发现主要耗时就在这两处,第一次6分多钟第二次刚好5分钟。2、问题排查不多不少的5分钟让我想到了配置metastore连接的超时时间(hive.metastore.client.socket.timeout)刚好也是300s,于是去看这部分代码,并增加了些日志来排查。org/apache/hadoop/hive/metastore

2020-06-17 17:19:09 5571

原创 Hadoop 3.2.1源码编译踩坑

编译环境和步骤可以参考这篇文章,这边主要记录一些遇到的坑。1、protobu只能用2.5.0版本2、jdk1.8,CMake3.1及以上3、用CentOS系统编译,不支持MacOS,会卡在CMake上。4、为了支持Snappy,需要去Github上下载,我用的是这个版本snappy-1.1.4.tar.gz执行./configure --prefix=/usr/local/libmake && make install随后下载hadoop-snappy支持源码并编译:gi

2020-06-09 16:25:45 554

原创 Spark 3.0 - AQE浅析 (Adaptive Query Execution)

1、前言近些年来,在对Spark SQL优化上,CBO是最成功的一个特性之一。CBO会计算一些和业务数据相关的统计数据,来优化查询,例如行数、去重后的行数、空值、最大最小值等。Spark根据这些数据,自动选择BHJ或者SMJ,对于多Join场景下的Cost-based Join Reorder(可以参考之前写的这篇文章),来达到优化执行计划的目的。但是,由于这些统计数据是需要预先处理的,会过时,所以我们在用过时的数据进行判断,在某些情况下反而会变成负面效果,拉低了SQL执行效率。AQE在执行过程中

2020-06-03 16:32:55 12085

原创 Flume采集HDFS audit log日志至HDFS

1、背景HDFS的audit log产生数据量很大,速度也很快,在机器系统盘上必须立即持久化到HDFS,否则数据会被覆盖或者磁盘会打满。用于数据治理-HDFS废弃文件、Hive废弃表检测与清理。2、实现① Apache Flume官网下载最新版本的Flume。② 配置audit_log_hdfs.conf# 一个channel一个source 配置3个sinka1.sources = r1a1.sinks = k1 k2 k3a1.channels = c1# 数据来源,给c1配置s

2020-05-19 18:04:05 1693

原创 数据治理-HDFS废弃文件、Hive废弃表检测与清理

1、背景废弃下线的业务,直接在调度系统下线了相应的调度任务,而大量历史数据仍然残留,需要清除。去年集群迁移,导致很多表有HDFS数据但Hive上没有元数据,需要清除。2、思路① 扫描HDFS目录,到分区深度(比如/user/hive/warehouse/test.db/hdfs_audit/pt=20200416,深度为6)② 采集HDFS audit log(注意过滤扫描HDFS目录时产生的脏日志)③ 给audit log和HDFS目录建外部表,互相关联去重,获得HDFS近期未访问的文件列表。

2020-05-19 18:01:04 20025

原创 HDFS目录扫描

1、背景为了分析HDFS文件生命周期,需要获取一定深度的HDFS目录。2、实现 static final String hdfsBaseDir = "hdfs://nameservice1:8020"; static final int depth = 6; static FileSystem fs = null; static BufferedWriter out

2020-05-17 17:33:48 505

原创 Spark Codegen原理分析

1、背景Spark Codegen是在CBO&RBO后,将算子的底层逻辑用代码来实现的一种优化。具体包括Expression级别和WholeStage级别的Codegen。2、举例说明① Expression级别:摘一个网上的例子:x + (1 + 2)用scala代码表示:Add(Attribute(x), Add(Literal(1), Literal(2)))语法树如...

2020-04-22 19:13:01 1811

原创 Hive权限认证模块详解

1、前言前段时间,在升级Hive版本(从Hive1.1.0升级至Hive2.3.6)的过程中,遇到了权限兼容问题。(升级相关请移步Hive1.1.0升级至2.3.6 踩坑记录)Hive1.1.0使用的是AuthorizerV1而Hive2.3.6默认是AuthorizerV2,两者相差极大。其中AuthorizerV2的权限验证极为严格,如果曾经使用V1鉴权想要使用V2的,需要修改部分代码...

2020-03-13 20:00:08 3046

原创 Hadoop ViewFs 官方文档解读

官方文档地址:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/ViewFs.html1、简介ViewFs是用来管理多个Hadoop namespace的一种方案。具体思路和一些Linux/Unix系统的挂载表十分相似。ViewFs可以生成某个namespace的视图,或者说某个集群的文件视图。简...

2020-02-27 16:58:46 2035

原创 Presto JDBC连接官方指南与坑点记录

1、添加依赖<dependency> <groupId>io.prestosql</groupId> <artifactId>presto-jdbc</artifactId> <version>312</version></dependency>Driver为io.pre...

2020-02-21 15:20:03 15169

原创 Hive SQL执行全过程源码解析(Hive3.1)

Hive任务提交源码解析

2019-12-23 17:05:11 7605 4

原创 Hive1.1.0升级至2.3.6 踩坑记录

1、union all 左右字段类型不匹配Hive尝试跨Hive类型组执行隐式转换。隐式转换支持类型如下表:例:hive> select 1 as c2, 2 as c2 > union all > select 1.0 as c1, "2" as c1;FAILED: SemanticException Schema of both sides ...

2019-12-20 14:46:36 3964 2

原创 MapReduce框架源码解析

MapReduce框架源码解析

2019-11-11 11:08:14 21483

原创 MapReduce框架以及Hive任务提交详解

起因在切Hive任务到Spark的时候,发现Spark在处理只有Hive元数据而HDFS文件块丢失的任务时,会抛HDFS的异常InvalidInputException,而Hive在这种情况下不受影响。因此,就去找Hive在处理只有元数据的空表时做的优化。发现Hive会在读表前,setInputPaths时做一次判断,如果HDFS不存在对应的文件,则会生成一个DummyTable/DummyP...

2019-11-11 11:06:47 4696

原创 G1日志详解

为什么要看GC日志?因为JVM的GC状态能在很大程度上衡量一个Java应用是否健康,在相同条件下能否持续稳定运行。G1和CMS在日志上会有些许的区别,由于平时用G1为主,这边就不提CMS了。G1日志详解本文参考了RedHat Blog的Collecting and reading G1 garbage collector logs,并结合了现实场景和自己的理解来分析。其中的GC日志例子为线...

2019-09-26 20:17:09 2442

原创 记一次多线程并发问题的排查

背景最近在做离线batch任务执行的中间件,目标将线上所有的批任务都接过来,以便Hive向Spark迁移,对任务整个链路追踪(从开始预执行,到执行引擎选择,到执行日志收集,到执行完成后结果分析 是否倾斜等等)。在做自适应选择执行引擎的时候,定义了一个proposer,里面写了一些规则,来决定使用Spark还是Hive。现象在大量并发提交任务时,会出先proposer不生效的情况,应该用H...

2019-08-27 17:06:09 870

原创 Spark Skew Join Optimization

数据倾斜在分布式计算中是一个很常见的问题,Spark提供了一种比较便捷的方法来处理一些简单的数据倾斜场景。Spark中定位数据倾斜1、找到耗时长的stage并确定为shuffle stage。2、给所有的task按照shuffle records排序,找到最多数据的task。3、比较其他的task确定是否发生了倾斜。4、根据业务逻辑,Spark执行计划,找到倾斜的key。单表skew...

2019-08-01 16:23:22 816 2

原创 Spark Dynamic Allocation 源码解析

为什么研究Dynamic Allocation的源码?在线上任务执行的过程中,有些任务占用着Yarn资源却并行度极低,比如申请了100核cpu(现象持续时间超过了executor idle time),但那个stage只有9个running task。最关键的是,在Spark-SQL中,Dynamic Allocation可以说是必用功能之一。因此知晓其原理才能更好的理解Spark动态资源调度...

2019-07-22 20:36:24 586

原创 记一次Spark ThriftServer Bug排查

问题描述我们在用Spark ThriftServer(以下简称STS)用在查询平台时,遇到了以下报错:ERROR SparkExecuteStatementOperation: Error executing query, currentState RUNNING,org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.q...

2019-07-01 15:22:08 2445

原创 记一次Spark SQL问题排查的经历

起因分析师A:哇 你们这个数据查询平台查Spark ,同样的SQL结果每次都不同,这能用?我:???第一反应是你八成是在查一张,别人在更新数据的表吧。。(同个SQL也会去跑两遍 小声bb)排查过程过了一会儿,分析师A:看了半天了没人动数据啊,你这个Spark有问题吧?一脸蒙逼,开始排查问题。首先把SQL copy执行了下,果然每次都不一样,查了下源表 也没人在变更。SQL如下:se...

2019-06-19 17:50:33 1146

转载 使用Relational Cache加速Spark数据分析

本文转自云栖社区,作者:李呈祥(司麟)文中的Spark为阿里云EMR产品的Spark,博主之前也考虑过类似的问题,受到了一些启发,所以转载分享一下。背景Cache被广泛应用于数据处理的各个领域和方向上,在目前,计算速度远远大于IO访问速度依然是计算设备上最突出的矛盾,计算设备上的存储从HDD -> SSD -> NVMe -> Mem -> L3-L2-L1 Cach...

2019-06-03 19:43:58 805

原创 LockSupport详解

前言LockSupport是concurrent包中一个工具类,不支持构造,提供了一堆static方法,比如park(),unpark()等。LockSupport中的主要成员及其加载时的初始化:不难发现,他们在初始化的时候都是通过Unsafe去获得他们的内存地址,这里也可以理解为C中的指针。UnsafeUnsafe类可以参考我之前写的文章:深入理解sun.misc.Unsafe原理...

2019-05-18 14:32:19 16445 3

原创 ThreadPoolExecutor详解及线程池优化

前言ThreadPoolExecutor在concurrent包下,是我们最常用的类之一。无论是做大数据的,还是写业务开发,对其透彻的理解以及如何发挥更好的性能,成为了我们在更好的coding道路上必不可少的基础。为什么用线程池?如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。这就是线程池的目的了。线程池为线程生命周期的开销和资...

2019-05-17 19:33:43 12794

原创 java 标签跳转用法解析

前言在看jdk源码ThreadPoolExecutor中的addWorker方法的时候(ThreadPoolExecutor详解),发现如下代码:首先这个retry不是java里面的关键字,所以那个retry可以用任何合法的变量名替换,例如hello:等等,下面我们再来看一下这个到底有什么用。用用看首先,下面代码会打印出1~10增加条件后的结果:如果使用retry:结论:br...

2019-05-17 16:21:53 2864

原创 CyclicBarrier和CountDownLatch的用法与区别

前言CyclicBarrier和CountDownLatch这两个工具都是在java.util.concurrent包下,并且平时很多场景都会使用到。本文将会对两者进行分析,记录他们的用法和区别。CountDownLatchCountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownL...

2019-05-15 18:02:49 10176 3

原创 ThreadLocal详解

ThreadLocal是什么ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。内部结构从上面的结构图,我们已经窥见ThreadLocal的核心机制:每个Thread线程内部都有一个Map。Map里面存储线程本地对象(k...

2019-05-14 19:35:02 2120

原创 深入理解ClassLoader工作机制

前言ClassLoader类加载器可以说是Java中必学内容之一,无论是想要去研究Concurrent包、Unsafe,还是深入学习Spark等分布式计算框架,都必须对此有一定的理解。笔者在写之前也只了解了皮毛,想通过这篇文章,结合一些书籍和博客,加深对ClassLoader的理解,并分享一下。什么是class文件?xxx.class想必不陌生,JVM不会理解我们写的Java源文件, 我们必...

2019-05-05 20:30:50 8365 2

原创 初探JVM原理与结构

前言这篇文章是JVM的扫盲篇,通俗易懂,对不清楚ClassLoader、Garbage Collection的可以有个大致的了解。HelloWorld在还是小白阶段的时候,我们都会写一个HelloWorld.java,然后执行javac 获得HelloWorld.classpublic class HelloWorld { public static void main(String...

2019-05-05 16:26:30 3256 3

原创 阿里云分布式调度系统-伏羲

最近在做一个类似的东西,看了一篇讲FuxiSort的paper,就去详细学习了下。paper链接:链接: https://pan.baidu.com/s/1H9GdDd7lgcgWkw0tkC95Jw 提取码: gix8下文作者:陶阳宇,花名举水,阿里云高级技术专家,飞天分布式系统早期核心开发人员,开发和优化过伏羲系统中多个功能模块,参加了飞天5K、世界排序大赛等多个技术攻坚项目。在分布式...

2019-05-04 18:19:38 7034

空空如也

空空如也

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

TA关注的人

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