Enda Lin

keep foolish, keep sharp


  • Home

  • Categories

  • About

  • Archives

  • Tags

Zoopkeeper学习笔记

Posted on 2019-10-02 |
Words count in article 1.3k | Reading time 5

Zoopkeeper 工作机制

Zoopkeeper 是一个给予观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,接受观察者的注册,一旦数据状态发生了变化,Zoopkeeper 就负责通知已经在Zoopkeeper 上注册的那些观察者做出相应的反应。

Zoopeeker = 文件系统 + 通知机制

Zoopkeeper 特点

  • Zoopkeeper集群,一个leader, 多个跟随着组成集群
  • 只要集群中半数以上节点存货,Zoopeekper 集群就能存活
  • 全局数据的一致性,集群中每一个节点的数据都是一致的
  • 集群对更新请求是顺序执行的,来自同一个client 的更新请求是按其发送顺序来顺序执行的
  • 数据更新的原子性:一次数据要么更新成功,要么更新失败
  • 实时性:在一定时间内,Client 总能读取到最新的数据
Read more »

Spark学习笔记②

Posted on 2019-09-26 |
Words count in article 318 | Reading time 1

Spark SQL

Spark SQL 是Spark中的一个模块,主要用于结构化数据的处理,同时还可以作为分布式的SQL 查询引擎。

DataFrame 是以列的形式组织的,分布式的数据集合,可以通过很多源来构建,包括结构化的数据文件、Hive 中的表、外部的关系型数据库以及RDD

#Spark Streaming

StreamingContext 详解

一个StreamingContext 定义之后,必须做一下几件事:

  • 通过创建输入DStream 来创建输入数据源
  • 通过对DStream 定义transformation 和output算子操作,来定义实时计算逻辑
  • 调用StreamingContext 的start() 方法,来等待应用程序的终止(可以使用CTRL+C手动停止,或者让它持续不断地运行计算)
  • 调用StreamingContext 的stop() 方法,来停止应用程序

需要注意几点:

  • 只要一个StreamingContext 启动之后,就不能再往其中添加任何计算逻辑了,例如在start() 方法之后,再给某个DStream 执行一个算子
  • 一个StreamingContext 不能重启,在stop 之后不能再Start
  • 一个JVM 同时只能有一个StreamContext启动
  • 调用stop 方法时,会同时停止内部的SparkContext,如果希望继续用SparkContext 创建其它类型的Context,则使用stop(false)

Spark学习笔记①

Posted on 2019-09-24 |
Words count in article 635 | Reading time 2

Spark

Spark 计算模式

Spark 支持两种RDD 操作:transformation 和action。transformation 操作会针对已有的RDD 创建一个新的RDD,而action 主要是对RDD 进行最后的操作,例如遍历、reduce、保存到文件等等,并可以将结果返回给Driver 程序。

transformation 具有lazy 特性,一个程序只有transformation 是不会执行的,只有触发了action 操作,才会触发所有的transformation 操作。

Spark 工作原理

分布式

客户端Client 在本地编写Spark 程序,然后在本地将Spark 程序提交到Spark 集群中运行,Spark 从HDFS 中读出来的数据,会分布式存放在不同的Spark 节点上分布式处理。处理后的数据可能会被移动到别的Spark 节点中进行二次处理

所欲计算操作,都是针对多个计算节点上的数据,进行并行计算的

迭代式计算

Spark 计算模型可以分为n 个阶段(MapReduce 只有两个阶段:map、reduce)

RDD(弹性分布式数据集)

  • 分布式:RDD 有多个分区,多个分区散落在不同的Spark 节点上

  • 弹性:RDD 每个分区在Spark 存储时,默认都是在内存中的,如果内存放不下,会放部分数据到磁盘中,这些对用户都是透明的

  • 容错性:当Spark 发现RDD 的某个分区的数据丢失后,会重新获取数据,重新计算

Read more »

Spark-sample

Posted on 2019-09-23 |
Words count in article 448 | Reading time 2

Maven

1
2
3
4
5
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.1</version>
</dependency>

Start Point

Spark 2.x : 创建一个SparkSession

1
2
3
4
5
6
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
//.config("spark.some.config.option", "some-value")
.master("local")
.getOrCreate();

Create DataFrames from an existing RDD

record.json

1
{"key":1,"value":"enda"}

Application

1
2
3
4
5
6
7
8
9
10
Dataset<Row> dataset = spark.read().json("./record.json");

dataset.show();

// show
// +---+-----+
// |key|value|
// +---+-----+
// | 1| enda|
// +---+-----+

快速生成可执行Jar 包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<!--运行jar包时运行的主类,要求类全名-->
<mainClass>com.dgut.App</mainClass>
<!-- 是否指定项目classpath下的依赖 -->
<addClasspath>true</addClasspath>
<!-- 指定依赖的时候声明前缀 -->
<classpathPrefix>./lib/</classpathPrefix>
<!--依赖是否使用带有时间戳的唯一版本号,如:xxx-1.3.0-20121225.012733.jar-->
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<!--把当前项目所有的依赖打包到target目录下的lib文件夹下-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!--已存在的Release版本不重复copy-->
<overWriteReleases>false</overWriteReleases>
<!--已存在的SnapShot版本不重复copy-->
<overWriteSnapshots>false</overWriteSnapshots>
<!--不存在或者有更新版本的依赖才copy-->
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

官方文档

Spark SQL

Spring in action 读书笔记①

Posted on 2019-09-20 |
Words count in article 312 | Reading time 1

bean

Spring 应用上下文

Spring 自带了多种类型的应用上下文:

  • AnnotationConfigApplicationContext: 从一个或者多个基于Java 的配置类中加载Spring 应用上下文。
  • AnnotationConfigWebApplicationContext:从一个或者多个基于Java 的配置类中加载Spring Web 应用上下文。
  • ClassPathXmlApplicationContext:从类路径下的一个或者多个XML 配置文件中加载上下文定义, 把应用上下文的定义文件作为类资源。
  • FileSystemXmlApplicationContext:从文件系统下的一个或者多个Xml 配置文件中加载上下文定义。
  • XmlWebApplicationContext:从Web应用下的一个或者多个Xml 文件中加载上下文定义。

Spring Boot 默认的类路径

1
2
3
4
5
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {  
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/" };

Read more »

同步调用、同步回调和异步回调

Posted on 2019-08-07 |
Words count in article 85 | Reading time 1

I/O

同步和异步说的是消息的通知机制,阻塞非阻塞说的是线程的状态

参考

  • 一个经典例子让你彻彻底底理解java回调机制
  • 同步调用、回调和异步调用区别
  • 十分钟看懂Java NIO原理
  • Java NIO 系列文章之 浅析Reactor模式

docker-Swarm

Posted on 2019-08-03 |
Words count in article 527 | Reading time 2

Docker Swarm

基本概念

Swarm 是Docker 引擎内置原生的集群管理和编排工具

节点

  • 节点分为管理节点 和工作节点

  • 管理节点: 用于Swarm 集群的管理, 一个集群中可以拥有多个管理节点, 但是只有一个管理节点可以成为leader, leader 通过raft 协议实现

  • 工作节点: 工作节点是任务执行节点,管理节点将服务下发到工作节点执行,管理节点也默认作为工作节点, 可以通过配置让服务只运行在管理节点

运行Docker 的主机可以主动初始化一个Swarm 集群或者加入一个已存在的Swarm 集群

img

Read more »

MySQL技术内幕与存储引擎①

Posted on 2019-07-24 |
Words count in article 2.8k | Reading time 9

基本概念

数据库: 文件的集合, 是依照某种数据模型组织起来并存放于二级存储器中的数据集合

数据库实例:程序, 位于用户与操作系统之间的一层数据管理软件, 用户对数据库的任何操作, 包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下运行的, 应用程序只有通过数据库实例才能和数据库打交道

image.png

Read more »

Netty学习笔记

Posted on 2019-07-18 |
Words count in article 1.5k | Reading time 5

Netty in action

Channel、 EventLoop和 ChannelFuture

  • Channel -> socket
  • EventLoop -> 控制流、多线程处理、并发
  • ChannelFuture -> 异步通知

Channel 接口

基本的I/O 操作:(bind()、 connect()、 read()、 和write())

在基于Java 的网络编程中, 其基本构造是class socket, Netty 的Channel 接口提供的API, 大大降低了直接使用socket 的难度。 此外, Channel 也是拥有许多预定义、 专门实现的广泛类层次结构的根

  • EmbeddedChannel
  • LocalServerChannel
  • NioDatagramChannel
  • NioSctpChannel
  • NioSocketChannel

Channel 的生命周期

  • ChannelUnRegistered:Channel 已被创建, 但是还没有注册到EventLoop 中
  • ChannelRegistered:Channel 已经被注册到EventLoop 中
  • ChannelActive:Channel 处于活动状态, 已经连接到远程节点, 可以接收或者发送数据
  • ChannelInActive:Channel 没有连接到远程节点
Read more »

MySQL必知必会

Posted on 2019-07-15 |
Words count in article 186 | Reading time 1

MySQL 必知必会

  • MySQL 线程池的最佳连接数 = (CPU 核心数 * 2) + 有效磁盘数
  • 比较运算符能用 = 就不用 <>, 增加索引的利用率
  • 如果只有一条查询结果, 请使用 “LIMIT 1”
  • 为列选择合适的数据类型, 能用SMALLINT 就不用INT, 磁盘和内存消耗越小越好。
  • 将大的DELETE、 UPDATE or INSERT 查询拆成多个小的查询
  • 如果结果集允许重复, 则使用UNION ALL 代替 UNION
  • 为了充分利用查询缓存, 请保持SQL 语句查询条件的一致性
  • 尽量避免使用select *
  • where、 Join and Order by 语句的的列尽量被索引
  • 使用LIMIT 实现分页逻辑, 减少不必要的传输
123…8
Enda Lin

Enda Lin

所有的伟大都是从零开始

79 posts
35 tags
GitHub E-Mail
© 2019 Enda Lin
您是博主的第 位小伙伴 总访问量 次