Java
文章平均质量分 83
泰山不老生
耿嘉安,15年IT经验。《深入理解Spark》与《Spark内核设计的艺术》两书的作者。Apache Spark Contributor和MongoDB Contributor。曾就职于阿里巴巴,基于ODPS构建大数据商业解决方案——御膳房。曾负责艺龙大数据平台的架构工作。现在负责360对于Spark的运维、调优、扩展、开发等工作。在大量的工作实践中,对J2EE、JVM、Tomcat、Spring、Hadoop、Spark、MySQL、Redis、Zookeeper都有深入研究。早期从事J2EE企业级应用开发,对Java相关技术有独到见解。业余喜欢研究中国古代历史,古诗词,旅游,足球等。
展开
-
Spark常见故障诊断(一)
本人维护的Spark主要运行在三个Hadoop集群上,此外还有其他一些小集群或者隐私集群。这些机器加起来有三万台左右。目前运维的Spark主要有Spark2.3和Spark1.6两个版本。用户在使用的过程中难免会发生各种各样的问题,为了对经验进行沉淀,也为了给Spark用户提供一些借鉴,这里将对各类问题如何处理进行介绍。由于故障种类繁多,所以我会开多个博客逐一进行介绍。本文介绍一些Spark1...原创 2019-04-01 09:29:18 · 12263 阅读 · 9 评论 -
Spark2.1.0之运行环境准备
学习一个工具的最好途径,就是使用它。这就好比《极品飞车》玩得好的同学,未必真的会开车,要学习车的驾驶技能,就必须用手触摸方向盘、用脚感受刹车与油门的力道。在IT领域,在深入了解一个系统的原理、实现细节之前,应当先准备好它的运行环境或者源码阅读环境。如果能在实际环境下安装和运行Spark,显然能够提升读者对于Spark的一些感受,对系统能有个大体的印象,有经验的工程师甚至能够猜出一些S...原创 2018-05-04 10:15:12 · 2058 阅读 · 0 评论 -
Spark1.6.0功能扩展——为HiveThriftServer2增加HA
前言 HiveThriftServer2是Spark基于HiveServer2实现的多Session管理的Thrift服务,提供对Hive的集中式管理服务。HiveThriftServer2作为Yarn上的Application,目前只支持yarn-client模式——即Driver运行在本地,ApplicationMaster运行在NodeManager所管理的Container中。yarn-c...原创 2018-04-16 10:10:36 · 2850 阅读 · 0 评论 -
Spark2.1.0之初识Spark
随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题;社交圈子从现实搬到了Facebook、Twitter、微信等社交平台上;女孩子们现在少了逛街,多了在各大电商平台上的购买;喜欢棋牌的人能够在对战平台上找到世界各地的玩家对弈。在国内随着网民数量的持续增加,造成互联网公司的数据在体量、产生速度、多样性等方面呈现出巨大的变化。 互联网产生的...原创 2018-04-09 09:48:51 · 4762 阅读 · 12 评论 -
附录G Netty与NettyUtils
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录G的内容都在本文呈现。 Netty是一个NIO客户端服务器框架,使得开发高性能、高可靠性的网络服务器和客户端程序变得快速且容易。它极大地简化化了网络编程,如TCP和UDP套接字服务器。 “快速和容易”并不意味着应用程序会有难维护和性能低的问题。Netty是一个精心设计的框架,...原创 2018-02-07 09:39:31 · 2869 阅读 · 0 评论 -
Hadoop2.6.0运行mapreduce之推断(speculative)执行(上)
前言当一个应用向YARN集群提交作业后,此作业的多个任务由于负载不均衡、资源分布不均等原因都会导致各个任务运行完成的时间不一致,甚至会出现一个任务明显慢于同一作业的其它任务的情况。如果对这种情况不加优化,最慢的任务最终会拖慢整个作业的整体执行进度。好在mapreduce框架提供了任务推断执行机制,当有必要时就启动一个备份任务。最终会采用备份任务和原任务中率先执行完的结果作为最终结果。由于具体分析推原创 2016-05-12 14:39:44 · 23882 阅读 · 0 评论 -
Hadoop2.6.0运行mapreduce之推断(speculative)执行(下)
前言在《Hadoop2.6.0运行mapreduce之推断(speculative)执行(上)》一文中对推断执行技术的背景进行了介绍,并且在Hadoop集群上做了一些测试以验证mapreduce框架的推断执行。最后还从源码分析的角度解读了DefaultSpeculator的初始化和启动过程,其中涉及DefaultSpeculator的实例化、LegacyTaskRuntimeEstimator的实原创 2016-05-19 10:00:07 · 11350 阅读 · 0 评论 -
附录C Jetty与JettyUtils
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录C的内容都在本文呈现。Jetty简介 Jetty是一个开源的,以Java作为开发语言的servlet容器。它的API以一组JAR包的形式发布。Jetty容器可以实例化成一个对象,因而迅速为一些独立运行的Java应用提供网络和web服务。要为Jetty创建servlet,就涉及S...原创 2018-02-04 18:28:35 · 2806 阅读 · 0 评论 -
附录D Metrics简介
注:本文是为了配合《Spark内核设计的艺术——架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录D的内容都在本文呈现。 Metrics是codahale提供的第三方度量仓库。Metrics作为一款监控指标的度量类库,可以为第三方库提供辅助统计信息,还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。 Metrics也采用了监听器模式,提...原创 2018-02-04 18:26:51 · 2682 阅读 · 2 评论 -
使用Akka持久化——持久化与快照
前言 对于java web而言,一个用户的HTTP请求最终会转换为一条java线程处理。HTTP本身是无状态的,具体的请求逻辑一般也是无状态的。如果进程奔溃或者系统宕机,用户会发觉当前网页不可用之类的错误。虽然会影响一些用户体验,但是只要服务重启了,用户依然可以完成他的请求并满足其需要。但是有些情况下则势必会造成混乱甚至恐慌,例如跨行转账。用户从自己A银行的账户转账1万元至自己在B银行的账户,如果原创 2017-01-19 11:25:38 · 6951 阅读 · 6 评论 -
附录B Akka简介
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录B的内容都在本文呈现。 Akka是一款提供了用于构建高并发的、分布式的、可伸缩的、基于Java虚拟机的消息驱动应用的工具集和运行时环境。从下面Akka官网提供的一段代码示例,可以看出Akka并发编程的简约。case class Greeting(who: String)cl...原创 2018-02-01 21:10:31 · 1184 阅读 · 2 评论 -
附录A Spark2.1核心工具类Utils
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录A的内容都在本文呈现。 Utils是Spark最常用的工具类之一,Spark Core大量使用了此类提供的基础功能。即使不关心其实现也不会对理解本书对Spark源码的分析有太多影响。下面将逐个介绍Utils提供的方法。getSystemProperties功能描述:获取系统属...原创 2018-01-25 09:46:46 · 3535 阅读 · 13 评论 -
Spark1.6.0——HiveThriftServer2的生命周期管理
前言几年前,我在刚刚进入大数据领域的时候,很快就了解到Hive所提供的一种另类的SQL。最初使用Hive的命令行提交任务,后来便用上了HiveServer和HiveServer2。半年前第一次注意到Spark的Thrift服务,当时心中就笃定它肯定与HiveServer2有着某种联系,直到在工作中真正使用它。在使用HiveThriftServer2的过程中,通过故障排查、源码分析和功能优化...原创 2018-03-09 11:43:03 · 4038 阅读 · 0 评论 -
Spark2.1.0之代码结构及载入Ecplise方法
一、项目结构 在大型项目中,往往涉及非常多的功能模块,此时借助于Maven进行项目、子项目(模块)的管理,能够节省很多开发和沟通成本。整个Spark项目就是一个大的Maven项目,包含着多个子项目。无论是Spark父项目还是子项目,本身都可以作为独立的Maven项目来管理。core是Spark最为核心的功能模块,提供了RPC框架、度量系统、Spark UI、存储体系、调度系统、计算引...原创 2018-05-17 10:01:58 · 1491 阅读 · 0 评论 -
Spark2.1.0之基础知识
在阅读本文之前,读者最好已经阅读了《Spark2.1.0之初识Spark》一文,本文将对Spark的基础知识进行介绍。但在此之前,读者先跟随本人来一次简单的时光穿梭,最后还将对Java与Scala在语言上进行比较。版本变迁 经过5年多的发展,Spark目前的版本是2.3.0。Spark主要版本的发展过程如下:Spark诞生于UCBerkeley的AMP实验室(2009)。Spar...原创 2018-05-24 09:49:08 · 3461 阅读 · 0 评论 -
Spark2.1.0——SparkContext概述
Spark应用程序的提交离不开Spark Driver,后者是驱动应用程序在Spark集群上执行的原动力。了解Spark Driver的初始化,有助于读者理解Spark应用程序与Spark Driver的关系。Spark Driver的初始化始终围绕着SparkContext的初始化。SparkContext可以算得上是Spark应用程序的发动机引擎,轿车要想跑起来,发动机首先要启动。Spar...原创 2018-11-12 10:07:23 · 2804 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC客户端TransportClient详解
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》 《...原创 2018-08-28 10:48:46 · 2379 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC服务端引导程序TransportServerBootstrap
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》 《...原创 2018-08-20 10:56:59 · 2620 阅读 · 4 评论 -
spark2.1.0之源码分析——服务端RPC处理器RpcHandler详解
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》...原创 2018-08-13 10:21:13 · 3180 阅读 · 2 评论 -
spark2.1.0之源码分析——RPC传输管道处理器详解
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》 ...原创 2018-08-01 10:55:17 · 1166 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC管道初始化
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》在《spark2.1.0之源码分析——RPC客户端工厂Tran...原创 2018-07-25 10:32:57 · 2507 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC服务器TransportServer
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 TransportServer是RPC框架的服务端,可提供高效的、低级别的流服务。在说明《Spark2.1.0之内置RPC框架》一文...原创 2018-07-17 10:32:36 · 1310 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory
提示:阅读本文前最好先阅读《Spark2.1.0之内置RPC框架》和《spark2.1.0之源码分析——RPC配置TransportConf》。 TransportClientFactory是创建传输客户端(TransportClient)的工厂类。在说明《Spark2.1.0之内置RPC框架》文中的图1中的记号①时提到过TransportContext的createClientFact...原创 2018-07-10 10:16:52 · 2248 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC配置TransportConf
在《Spark2.1.0之内置RPC框架》提到TransportContext中的TransportConf给Spark的RPC框架提供配置信息,它有两个成员属性——配置提供者conf和配置的模块名称module。这两个属性的定义如下: private final ConfigProvider conf; private final String module;其中conf...原创 2018-07-02 18:31:02 · 1410 阅读 · 0 评论 -
Spark2.1.0之内置RPC框架
在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通、用户文件与Jar包的上传、节点间的Shuffle过程、Block数据的复制与备份等。在Spark 0.x.x与Spark 1.x.x版本中,组件间的消息通信主要借助于Akka[1],使用Akka可以轻松的构建强有力的高并发与分布式应用。但是Akka在Spark 2.0.0版本中被移除了,Spark官网文档对此...原创 2018-06-27 09:27:34 · 9365 阅读 · 3 评论 -
Spark2.1.0之模型设计与基本架构
Spark编程模型 正如Hadoop在介绍MapReduce编程模型时选择word count的例子,并且使用图形来说明一样,笔者对于Spark编程模型也选择用图形展现。 Spark 应用程序从编写到提交、执行、输出的整个过程如图2-5所示。图2-5 代码执行过程图2-5中描述了Spark编程模型的关键环节的步骤如下:用户使用SparkContext提供的API(常用的有t...原创 2018-06-12 09:41:32 · 2269 阅读 · 6 评论 -
附录E Hadoop的word count例子
注:本文是为了配合《Spark内核设计的艺术——架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录E的内容都在本文呈现。 这里主要演示Hadoop1.0版本中的word count例子,用于和Spark中的实现对比。package org.apache.hadoop.examples;import java.io.IOException;import java.ut...原创 2018-03-04 16:54:09 · 758 阅读 · 0 评论 -
Tomcat7.0源码分析——Session管理分析(下)
在《Tomcat7.0源码分析——Session管理分析(上)》一文中我介绍了Session、Session管理器,还以StandardManager为例介绍了Session管理器的初始化与启动,本文将接着介绍Session管理的其它内容。原创 2016-09-30 10:48:47 · 7144 阅读 · 5 评论 -
Tomcat7.0源码分析——请求原理分析(中)
在《TOMCAT7.0源码分析——请求原理分析(上)》一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握《TOMCAT7.0源码分析——请求原理分析(上)》一文中的相关知识以及HTTP协议和TCP协议的一些内容。本文重点讲解Tomcat7.0在准备好接受请求后,请求过程的原理分析。原创 2016-07-07 13:33:15 · 19030 阅读 · 18 评论 -
Tomcat7.0源码分析——server.xml文件的加载与解析
作为Java程序员,对于tomcat的server.xml想必都不陌生。本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析进行分析。原创 2016-04-01 13:05:00 · 13023 阅读 · 9 评论 -
Quartz与Spring集成——启动调度器
在《Quartz与Spring集成——创建调度器》一文中介绍了调度器的创建过程,本文将分析其调度器的启动过程。原创 2016-09-08 10:08:51 · 14571 阅读 · 4 评论 -
Quartz与Spring集成—— SchedulerFactoryBean的初始化分析
Quartz是一个开源的定时调度框架,支持集群部署。我们可以通过其Java API来使用它,或者通过Spring来配置与管理,也可以结合使用两种方式。本文重点分析Quartz与Spring集成时的初始化过程。原创 2016-07-25 15:29:44 · 72215 阅读 · 9 评论 -
Quartz与Spring集成——创建调度器
在《Quartz与Spring集成—— SchedulerFactoryBean的初始化分析》一文中介绍过,Spring集成Quartz时的初始化过程。创建调度器也是初始化过程中的一步,本文将着重介绍Quartz初始化时是如何创建调度器的。原创 2016-09-01 10:41:24 · 15144 阅读 · 7 评论 -
记Hadoop2.5.0线上mapreduce任务执行map任务划分的一次问题解决
近日在线上发现有些mapreduce作业的执行时间很长,我们需要解决这个问题。输入文件的大小是5G,采用了lzo压缩,整个集群的默认block大小是128M。本文将详细描述这次线上问题的排查过程。原创 2016-07-14 13:31:59 · 14063 阅读 · 2 评论 -
Hadoop旧mapreduce的map任务切分原理
最近在工作过程中接触一些Hive数据仓库中的表,这些表实际是从关系型数据库通过Sqoop抽到Hive的。在开发过程中对map任务的划分进行性能调优,发现mapreduce中关于FileInputFormat的参数调整都不起作用,最后发现这些老任务都是用旧版的mapreduce开发的,于是顺便研究下旧版mapreduce的任务划分策略。原创 2016-06-16 09:47:35 · 11469 阅读 · 4 评论 -
Hadoop2.6.0配置参数查看小工具
使用Hadoop进行离线分析或者数据挖掘的工程师,经常会需要对Hadoop集群或者mapreduce作业进行性能调优。性能调优的前提是需要能准确知道目前针对Hadoop集群或者mapreduce作业配置的参数。本文将针对这一需求,基于Hadoop开发一个简单实用的工具查询查看各种参数。原创 2016-04-21 15:31:50 · 17629 阅读 · 0 评论 -
Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍
学习Hadoop的同学们,一定知道如果运行Hadoop自带的各种例子。hadoop-mapreduce-examples项目中还提供了这些例子,本文就其中例子的执行方式进行分析。看看它能否让我们学习mapreduce编程变得更加容易。原创 2016-04-18 11:41:44 · 19127 阅读 · 0 评论 -
Hadoop2.6.0的事件分类与实现
说实在的,在阅读Hadoop YARN的源码之前,我对于java枚举的使用相形见绌。YARN中实现的事件在可读性、可维护性、可扩展性方面的工作都值得借鉴。原创 2016-04-26 10:45:05 · 13239 阅读 · 2 评论 -
JAVA泛型的基本使用
Java1.5版本推出了泛型,虽然这层语法糖给开发人员带来了代码复用性方面的提升,但是这不过是编译器所做的一层语法糖,在真正生成的字节码中,这类信息却被擦除了。笔者发现很多几年开发经验的程序员,依然不善于使用Java泛型,本文将从Java泛型的基本使用入手,在今后的多篇博文里,对泛型的使用做个总结。本文不会深入Java泛型的实现原理,只会介绍Java泛型的使用。实验准备 首先需要创建一个原创 2016-02-29 10:40:01 · 3978 阅读 · 0 评论 -
Java泛型的协变
在上篇《Java泛型的基本使用》这篇文章中遗留以下问题,即将子类型也能添加到父类型的泛型中,要实现这种功能必须借助于协变。实验准备 现在在上篇文章展示的Decorator类型的基础上,增加一些代码,如代码清单1所示。代码清单1 /** * * 描 述:Exp2使用br/> * 作 者:jiaan.gja * 历 史: (版原创 2016-03-15 10:12:45 · 5069 阅读 · 2 评论