自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(200)
  • 资源 (1)
  • 收藏
  • 关注

转载 Scala 系列(八)—— 类和对象

一、初识类和对象Scala 的类与 Java 的类具有非常多的相似性,示例如下:// 1. 在 scala 中,类不需要用 public 声明,所有的类都具有公共的可见性class Person { // 2. 声明私有变量,用 var 修饰的变量默认拥有 getter/setter 属性 private var age = 0 // 3.如果声明的变量不需要进行初始赋值,此时 Scala 就无法进行类型推断,所以需要显式指明类型 private var name: Stri

2020-10-31 23:52:24 173

转载 Scala 系列(七)—— 常用集合类型之 Map & Tuple

一、映射(Map)1.1 构造Map// 初始化一个空 mapval scores01 = new HashMap[String, Int]// 从指定的值初始化 Map(方式一)val scores02 = Map("hadoop" -> 10, "spark" -> 20, "storm" -> 30)// 从指定的值初始化 Map(方式二)val scores03 = Map(("hadoop", 10), ("spark", 20), ("storm", 3

2020-10-31 23:45:49 277

转载 Scala 系列(六)—— 常用集合类型之 List & Set

一、List字面量List 是 Scala 中非常重要的一个数据结构,其与 Array(数组) 非常类似,但是 List 是不可变的,和 Java 中的 List 一样,其底层实现是链表。scala> val list = List("hadoop", "spark", "storm")list: List[String] = List(hadoop, spark, storm)// List 是不可变scala> list(1) = "hive"<console&g

2020-10-31 23:38:44 315

转载 Scala 系列(五)—— 集合类型综述

一、集合简介Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改。即可以更改,添加,删除集合中的元素; 不可变集合类:不能被修改。对集合执行更改,添加或删除操作都会返回一个新的集合,而不是修改原来的集合。 二、集合结构Scala 中的大部分集合类都存在三类变体,分别位于scala.collection,scala.collection.immutable,scala.collection.mutable包中。还有部分集合类位于sc...

2020-10-31 23:00:43 142 1

转载 Scala 系列(四)—— 数组Array

一、定长数组在 Scala 中,如果你需要一个长度不变的数组,可以使用 Array。但需要注意以下两点:在 Scala 中使用(index)而不是[index]来访问数组中的元素,因为访问元素,对于 Scala 来说是方法调用,(index)相当于执行了.apply(index)方法。 Scala 中的数组与 Java 中的是等价的,Array[Int]()在虚拟机层面就等价于 Java 的int[]。// 10 个整数的数组,所有元素初始化为 0scala> val...

2020-10-31 22:57:07 560

转载 Scala 系列(三)—— 流程控制语句

一、条件表达式ifScala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的。object ScalaApp extends App { val x = "scala" val result = if (x.length == 5) "true" else "false" print(result) }在 Java 中,每行语句都需要使用;表示结束,但是在 Scala 中并不需要。除非你在单行语句中写了多行..

2020-10-31 22:53:36 141

转载 Scala 系列(二)—— 基本数据类型和运算符

一、数据类型1.1 类型支持Scala 拥有下表所示的数据类型,其中 Byte、Short、Int、Long 和 Char 类型统称为整数类型,整数类型加上 Float 和 Double 统称为数值类型。Scala 数值类型的取值范围和 Java 对应类型的取值范围相同。数据类型 描述 Byte 8 位有符号补码整数。数值区间为 -128 到 127 Short 16 位有符号补码整数。数值区间为 -32768 到 32767 Int 32 位有符号补码整数。

2020-10-31 22:48:25 316

转载 Scala 系列(一)—— Scala简介及开发环境配置

一、Scala简介1.1 概念Scala 全称为 Scalable Language,即“可伸缩的语言”,之所以这样命名,是因为它的设计目标是希望伴随着用户的需求一起成长。Scala 是一门综合了面向对象和函数式编程概念的静态类型的编程语言,它运行在标准的 Java 平台上,可以与所有的 Java 类库无缝协作。1.2 特点1. Scala是面向对象的Scala 是一种面向对象的语言,每个值都是对象,每个方法都是调用。举例来说,如果你执行1+2,则对于 Scala 而言,实际是在调用 .

2020-10-31 22:40:12 2321 1

原创 Tomcat 7 中 NIO 处理分析

Tomcat 的 Connector 有三种运行模式 bio、nio、apr ,先了解一下这三种的区别。bio(blocking I/O),顾名思义即阻塞式 I/O 操作,表示 Tomcat 使用的是传统的 Java I/O 操作(即java.io包及其子包)。Tomcat 在默认情况下,就是以 bio 模式运行的。一般而言 bio 模式是三种运行模式中性能最低的一种。 nio(new I/O),是 Java SE 1.4 及后续版本提供的一种新的 I/O 操作方式(即java.nio包及其子包)。J

2020-10-31 22:37:23 487

转载 Hive on Spark

简介本文主要记录如何安装配置Hive on Spark,在执行以下步骤之前,请先确保已经安装Hadoop集群,Hive,MySQL,JDK,Scala,具体安装步骤不再赘述。背景Hive默认使用MapReduce作为执行引擎,即Hive on mr。实际上,Hive还可以使用Tez和Spark作为其执行引擎,分别为Hive on Tez和Hive on Spark。由于MapReduce中间计算均需要写入磁盘,而Spark是放在内存中,所以总体来讲Spark比MapReduce快很多。因此,Hi

2020-10-29 00:36:11 1513

原创 Tomcat 7 中的 JMX 使用(二)Dynamic MBean

如上一篇文章所见 Standard MBean 在 Tomcat 源码中的例子并不多,在 jconsole 中所看到的大量 MBean(如 Catalina 下的 Connector、Engine、Server、Service 等),实际上是动态 MBean(Dynamic MBean)。本文主要讲述 Tomcat 7 中如何通过动态 MBean 的方式构造 MBean 的。接触过动态 MBean 的朋友一定知道,它的实例肯定要实现一个接口,即javax.management.DynamicMBean。

2020-10-28 00:02:18 285

原创 Tomcat 7 中的 JMX 使用(一)Standard MBean

做过 Java 平台下的应用服务器监控的对 JMX 应该不会陌生,简单说 JMX 就是提供了一个标准的管理方案的框架。这里所说的管理的含义包括监控平台运行状况、应用级别配置资源、收集应用统计数据、调试、监视服务器性能,JMX 允许你将所有的资源(硬件和软件)打包成 java 对象,然后将他们暴露在分布式环境中,并且 JMX 提供了一个机制,可以很简单的将既存的管理协议,如 SNMP ,映射到 JMX 自己的管理结构中。本文重点不是介绍 JMX ,而是分析 Tomcat 7 中是如何用 JMX 来提供管理

2020-10-27 22:10:45 354

原创 Tomcat 7 自动加载类及检测文件变动原理

在一般的 web 应用开发里通常会使用开发工具(如 Eclipse、IntelJ )集成 tomcat ,这样可以将 web 工程项目直接发布到 tomcat 中,然后一键启动。经常遇到的一种情况是直接修改一个类的源文件,此时开发工具会直接将编译后的 class 文件发布到 tomcat 的 web 工程里,但如果 tomcat 没有配置应用的自动加载功能的话,当前 JVM 中运行的 class 还是源文件修改之前编译好的 class 文件。可以重启 tomcat 来加载新的 class 文件,但这样做需要

2020-10-27 22:08:17 238

原创 Tomcat 7 中 web 应用加载原理(三)Listener、Filter、Servlet 的加载和调用

分析到了org.apache.catalina.deploy.WebXml类的 configureContext 方法,可以看到在这个方法中通过各种 setXXX、addXXX 方法的调用,使得每个应用中的 web.xml 文件的解析后将应用内部的表示 Servlet、Listener、Filter 的配置信息与表示一个 web 应用的 Context 对象关联起来。这里列出 configureContext 方法中与 Servlet、Listener、Filter 的配置信息设置相关的调用代码:

2020-10-27 21:58:01 302

原创 Tomcat 7 中 web 应用加载原理(二)web.xml 解析

讲了org.apache.catalina.startup.HostConfig的 lifecycleEvent 方法中所做的事情。最后看到在 Tomcat 启动时或启动后(后台线程定时扫描)会调用 HostConfig 类的 deployApps 方法:可以看到这里部署应用有三种方式:XML 文件描述符、WAR 包、文件目录。三种方式部署的总体流程很相似,都是一个 web 应用分配一个线程来处理,这里统一放到与 Host 内部的线程池对象中( startStopExecutor ),所以有时会看到

2020-10-27 21:53:56 422

原创 Tomcat 7 中 web 应用加载原理(一)Context 构建

为什么关心 Tomcat 中一个 web 应用的加载过程?在前面的文章中看过多次 Tomcat 的组件结构图,这里再贴出来回顾一下:之前的Tomcat 7 启动分析系列文章中看到 Tomcat 启动的时候将会解析 server.xml,根据里面所配置的各个节点信息逐一初始化和启动相应组件(即分别调用它们的 init 和 start 方法),但浏览一下 Tomcat 7 源码中的 server.xml 的内容,里面对应上图中的已经默认配置的各级组件包括 Server、Service、Engin

2020-10-27 21:49:18 226

原创 Redis 高可用架构最佳实践

1 、题记Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求。Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的。在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库。考虑高性能的同时,高可用也是很重要的考虑因素。互联网 7x2

2020-10-27 14:45:56 168 1

原创 Tomcat 7 的一次请求分析(四)Tomcat 7 阀机制原理

通过这一系列的前三部分看到了一次客户端连接在 Tomcat 内部被转换成了请求对象(org.apache.catalina.connector.Request类的实例),并在该请求对象内部将与本次请求相关的 Host、Context、Wrapper 对象的引用。本文主要分析该请求对象在容器内部流转的经过。再来看一下 Tomcat 7 内部的组件结构图:其实这张图已经给出了答案,在 Connector 接收到一次连接并转化成请求( Request )后,会将请求传递到 Engine 的管道( Pi

2020-10-27 00:36:28 344

原创 Tomcat 7 的一次请求分析(三)请求与容器中具体组件的匹配

上文分析到了org.apache.coyote.http11.AbstractHttp11Processor类 process 方法,以解析请求头的 getInputBuffer().parseRequestLine 方法调用为例,看到如何从 Socket 的 IO 流中取出字节流数据,根据 Http 协议将字节流组装到 Tomcat 内部的org.apache.coyote.Request对象的相关属性中。接下来将会解释构造好的 Tomcat 的内部请求对象从 Connector 到 Engine 到

2020-10-27 00:29:21 753

原创 Tomcat 7 的一次请求分析(二)Socket 转换成内部请求对象

先抛开之前所看到的 Tomcat 源码不谈,Tomcat 作为一个用 Java 实现的 Web 服务器,如果让你来实现,那么从何入手?这里首先需要厘清的是 Web 服务器的概念,谷歌了一下,发现这条解释还算靠谱点,【在网络环境下可以向发出请求的浏览器提供文档的程序】。重点有两条:1.网络环境下,2.能够给出响应。用 Java 写过网络通信程序的都知道,这里必然会用到 Socket 编程。我们自己要实现的服务器程序作为 Socket 编程里的服务端,浏览器作为 Socket 编程里的客户端。要理解 T

2020-10-27 00:22:44 168

原创 Tomcat 7 的一次请求分析(一)处理线程的产生

在默认的配置下Tomcat启动好之后会看到后台上总共有6个线程在运行。其中1个用户线程,剩下5个为守护线程(如下图所示)。如果你对用户线程、守护线程等概念不熟悉,请参看前一篇文章——Tomcat 7 服务器关闭原理。 这里重点关注以 http-bio-8080 开头的两个守护线程(即 http-bio-8080-Acceptor-0 和 http-bio-8080-AsyncTimeout ),因为这是我们在 Tomcat 的默认配置下发布 web 应用时实际处理请求的线程。先看下这两个线程

2020-10-27 00:15:47 420

原创 Tomcat 7 服务器关闭原理

在默认的配置下启动完之后会看到后台实际上总共有 6 个线程在运行。即 1 个用户线程,剩下 5 个为守护线程(下图中的 Daemon Thread )。如果对什么叫守护线程的概念比较陌生,这里再重复一下:所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程。这种线程并不属于程序中不可或缺的部分,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。用户线程和守护线程两者几乎没有区别,唯一的不

2020-10-26 23:59:22 339

原创 Tomcat 7 启动分析(五)Lifecycle 机制和实现原理

看到有一个 setStateInternal 方法的调用,在查看 LifecycleBase 类及其它各组件的源码时会在多处看到这个方法的调用,这篇文章就来说说这方法,以及与这个方法相关的 Tomcat 的 Lifecycle 机制和实现原理。接上文里谈到了 Tomcat 7 的各组件的父类 LifecycleBase 类,该类实现了接口 org.apache.catalina.Lifecycle,下面是这个接口里定义的常量和方法:细心的读者会发现,上篇文章里提到的 init 和 start 方

2020-10-26 23:58:43 303

原创 Tomcat 7 启动分析(四)各组件 init、start 方法调用

在正常启动 Tomcat 7 的情况下,上篇文章分析到了执行 org.apache.catalina.core.StandardServer 的 init 和 start 方法这儿,那么就来看看这两个方法里面到底干了些什么。但是在 StandardServer 类里面并没有发现这两个方法:由此推知这两方法必定是在该类的父类中已实现了,在 StandardServer 类的父类 LifecycleMBeanBase 类的父类 LifecycleBase 类里面终于找到了这两个方法的实现,下面先来看

2020-10-26 23:57:02 702

原创 Tomcat 7 启动分析(三)Digester 的使用

前一篇文章里最后看到 Bootstrap 的 main 方法最后会调用 org.apache.catalina.startup.Catalina 对象的 load 和 start 两个方法,那么就来看看这两个方法里面到底做了些什么。load 方法: 1 /** 2 * Start a new server instance. 3 */ 4 public void load() { 5 6 long t1 = System.n

2020-10-26 23:52:44 410

原创 Tomcat 7 启动分析(二)Bootstrap 类中的 main 方法

之前分析了 Tomcat 的启动脚本,如果从 startup.bat 开始启动 Tomcat 的话会发现最后会调用 org.apache.catalina.startup.Bootstrap 里的 main 方法,并且传过来的最后一个命令行参数是 start,接下来的启动代码分析就从这里开始。先看下这个 main 方法的代码:1 /** 2 * Main method and entry point when starting Tomcat via the provided 3

2020-10-26 23:49:25 374 1

原创 Tomcat 7 启动分析(一)启动脚本

前面通过直接运行 BootStarp 的 main 函数来启动的,只是加了一个 catalina.home 的系统属性。而正常情况下启动 Tomcat 是通过运行脚本的方式,这个就涉及到建立工程时拷贝过来的 script 目录下的一堆脚本文件了。以我的 windows 系统举例,实际上最终是执行 startup.bat 这个批处理文件来启动 tomcat 的。 那么启动分析就冲这个文件开始吧:一、分析 startup.bat 文件startup.bat :1 @echo off 2

2020-10-26 23:46:24 471

原创 Tomcat 源代码运行环境搭建

源码分析的环境搭建吧,用的是 eclipse Juno Service Release 1,然后在 tomcat官网下了tomcat7.0.42的源码,这两样准备好之后便是搭建能够运行源码的调试环境了。在 eclipse 中新建一个 java 项目,项目取名 tc7.0.42JRE 选择 1.6 的其他设置默认\2. 将下载的 tomcat 源码包解压开,并拷贝到 Eclipse 里新建的项目根目录下注意,我这里将源码解压开后的 bin 目录重命名成 script 之后才拷贝的,因为新..

2020-10-26 23:41:42 170

原创 贝壳找房基于Flink的实时平台建设

2020-10-26 23:19:19 182

原创 基于Kafka+Flink+Redis的电商大屏实时计算案例

前言阿里的双11销量大屏可以说是一道特殊的风景线。实时大屏(real-time dashboard)正在被越来越多的企业采用,用来及时呈现关键的数据指标。并且在实际操作中,肯定也不会仅仅计算一两个维度。由于Flink的“真·流式计算”这一特点,它比Spark Streaming要更适合大屏应用。本文从笔者的实际工作经验抽象出简单的模型,并简要叙述计算流程(当然大部分都是源码)。数据格式与接入简化的子订单消息体如下。{ "userId": 234567, "ord..

2020-10-25 21:51:02 333

原创 如何使用 Flink 每天实时处理百亿条日志?

Sherlock.IO 是 eBay 现有的监控平台,每天要处理上百亿条日志、事件和指标。Flink Streaming job 实时处理系统用于处理其中的日志和事件。本文将结合监控系统 Flink 的现状,具体讲述 Flink 在监控系统上的实践和应用,希望给同业人员一些借鉴和启发。监控系统 Flink 的现状eBay 的监控平台 Sherlock.IO 每天处理着上百亿条日志(log),事件(event)和指标(metric)。通过构建 Flink Streaming job 实时处理系

2020-10-25 21:50:51 1114

原创 滴滴实时计算发展之路及平台架构实践

滴滴的核心业务是一个实时在线服务,因此具有丰富的实时数据和实时计算场景。本文将介绍滴滴实时计算发展之路以及平台架构实践。实时计算演进随着滴滴业务的发展,滴滴的实时计算架构也在快速演变。到目前为止大概经历了三个阶段: 业务方自建小集群阶段; 集中式大集群、平台化阶段; SQL化阶段。 下图标识了其中重要的里程碑,稍后会给出详细阐述:在2017年以前,滴滴并没有统一的实时计算平台,而是各个业务方自建小集群。其中用到的引擎有Storm、JStorm、Spark Str

2020-10-25 01:18:31 328

原创 基于 Flink 构建关联分析引擎的挑战和实践

随着云计算、大数据等新一代IT技术在各行业的深入应用,政企机构IT规模和复杂程度不断提高,网络流量、日志等各类数据规模大幅提升。与此同时,网络攻防日益激烈,网络安全威胁逐渐凸显出来,这对于SOC/SIEM产品的性能提出了一个很大的挑战。因此,奇安信独立研发了国内首款流式分布式关联分析引擎Sabre,搭载于公司旗下态势感知与安全运营平台(下文简称NGSOC),从而大幅提升NGSOC的数据分析能力和网络安全检测能力。本文将从技术研发的角度,全面阐述Sabre的由来。1.Sabre是什么?Sabre是

2020-10-25 01:18:18 1180 1

原创 58 同城基于 Flink 的千亿级实时计算平台架构实践

58 同城作为覆盖生活全领域的服务平台,业务覆盖招聘、房产、汽车、金融、二手及本地服务等各个方面。丰富的业务线和庞大的用户数每天产生海量用户数据需要实时化的计算分析,实时计算平台定位于为集团海量数据提供高效、稳定、分布式实时计算的基础服务。本文主要介绍 58 同城基于 Flink 打造的一站式实时计算平台 Wstream。实时计算场景和很多互联网公司一样,实时计算在 58 拥有丰富的场景需求,主要包括以下几类:实时数据 ETL:实时消费 Kafka 数据进行清洗、转换、结构化处理用于下游计算处理

2020-10-25 01:18:03 271 1

原创 如何基于Flink+TensorFlow打造实时智能异常检测平台

1.前言随着互联网的迅速发展,各个公司都建立了自己的监控体系,用于提前发现问题降低损失,携程亦是如此。然而携程的监控体系存在以下三个问题: 监控系统繁多 监控告警配置复杂 没有统一规范 首先携程目前光公司级别的监控系统就有三套,各个 BU 为了满足自己的业务监控需求也陆续开发了许多自己的监控系统。其次这些监控系统都是基于规则来判断是否存在异常,比如当满足同环比连续几个点上升或下降到用户配置的阈值时触发告警。最后是没有统一的规范,这里指的是两个规范,第一,没有统一的规则告警配

2020-10-25 01:17:46 641 1

原创 HBase系统架构及数据结构

一、基本概念一个典型的 Hbase Table 表如下:1.1 Row Key (行键)Row Key是用来检索记录的主键。想要访问 HBase Table 中的数据,只有以下三种方式: 通过指定的Row Key进行访问; 通过 Row Key 的 range 进行访问,即访问指定范围内的行; 进行全表扫描。 Row Key可以是任意字符串,存储时数据按照Row Key的字典序进行排序。这里需要注意以下两点: 因为字典序对 Int 排序的结果是...

2020-10-25 01:07:08 224 2

原创 HBase容灾与备份

一、前言本文主要介绍 Hbase 常用的三种简单的容灾备份方案,即CopyTable、Export/Import、Snapshot。分别介绍如下:二、CopyTable2.1 简介CopyTable可以将现有表的数据复制到新表中,具有以下特点:支持时间区间 、row 区间 、改变表名称 、改变列族名称 、以及是否 Copy 已被删除的数据等功能; 执行命令前,需先创建与原表结构相同的新表; CopyTable的操作是基于 HBase Client API 进行的,即采用scan...

2020-10-25 01:06:59 270

原创 HBase —— 集群环境搭建

一、集群规划这里搭建一个 3 节点的 HBase 集群,其中三台主机上均为Regin Server。同时为了保证高可用,除了在 hadoop001 上部署主Master服务外,还在 hadoop002 上部署备用的Master服务。Master 服务由 Zookeeper 集群进行协调管理,如果主Master不可用,则备用Master会成为新的主Master。二、前置条件HBase 的运行需要依赖 Hadoop 和 JDK(HBase 2.0+对应JDK 1.8+) ...

2020-10-25 01:06:48 170

原创 HBase —— 单机环境搭建

一、安装前置条件说明1.1 JDK版本说明HBase 需要依赖 JDK 环境,同时 HBase 2.0+ 以上版本不再支持 JDK 1.7 ,需要安装 JDK 1.8+ 。JDK 安装方式见本仓库:Linux 环境下 JDK 安装1.2 Standalone模式和伪集群模式的区别在Standalone模式下,所有守护进程都运行在一个jvm进程/实例中; 在伪分布模式下,HBase 仍然在单个主机上运行,但是每个守护进程 (HMaster,HRegionServer 和 Zo...

2020-10-25 01:06:26 224

原创 Flink 踩坑经验:如何大幅降低 HDFS 压力?

众所周知,Flink 是当前最为广泛使用的计算引擎之一,它使用 Checkpoint 机制进行容错处理 [1],Checkpoint 会将状态快照备份到分布式存储系统,供后续恢复使用。在 Alibaba 内部,我们使用的存储主要是 HDFS,当同一个集群的 Job 到达一定数量后,会对 HDFS 造成非常大的压力,本文将介绍一种大幅度降低 HDFS 压力的方法——小文件合并。背景不管使用 FsStateBackend、RocksDBStateBackend 还是 NiagaraStateBacken

2020-10-24 00:05:39 1061

linux实用命令集.txt

自己在工作中的一些总结,包括了使用工具,Java技术,数据库安装

2019-07-16

空空如也

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

TA关注的人

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