0%

spark敲门砖之WordCount

首先要确定好scala和spark的版本,可以去看一下maven中的对应关系(我原本用的是scala2.13版本的,由于spark没有与之对应的版本,降回到2.12了)

maven版本对应

maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 添加scala的依赖 -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<!-- 这里注意scala的版本和spark的版本,不然会出现问题 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.1.1</version>
</dependency>
阅读全文 »

spark与hadoop对比

spark就相当于是Hadoop的升级版本,对于MapReduce进行了再一次的优化

Hadoop

  • Hadoop 是由 java 语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架
  • 作为 Hadoop 分布式文件系统,HDFS 处于 Hadoop 生态圈的最下层,存储着所有的数据 ,支持着 Hadoop的所有服务。理论基础源于Google的TheGoogleFileSystem这篇论文,是GFS的开源实现
  • MapReduce是一种编程模型,Hadoop根据Google的MapReduce论文将其实现,作为Hadoop的分布式计算模型,是 Hadoop的核心。基于这个框架,分布式并行程序的编写变得异常简单。综合了 HDFS 的分布式存储和MapReduce 的分布式计算,Hadoop在处理海量数据时,性能横向扩展变得非常容易

Spark

  • Spark 是一种由 Scala 语言开发的快速、通用、可扩展的大数据分析引擎
  • Spark Core 中提供了 Spark 最基础与最核心的功能
  • Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据
  • Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的处理数据流的 API

根本区别在于:Spark多个作业之间数据通信是基于内存,而Hadoop是基于磁盘,由于Spark是基于内存的,有时候会由于内存资源不足导致Job执行失败,所以Spark并不能完全的替代MapReduce

Eureka简介

关于Eureka

Eureka是springCloud在一开始的时候推荐使用的注册中心,是Netflix开源的服务发现组件

Eureka包含两个组件:Eureka Server和Eureka Client

Eureka Server提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到

EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)。Eureka Client会缓存服务注册表中的信息,这种方式可以使得微服务不需要每次请求都查询Eureka Server,从而降低了Eureka Server的压力,如果Eureka Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者完成调用

eureka的高可用性,不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功,当数据出现不一致时,虽然A,B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息如果请求A查不到,但请求B就能查到

多个Eureka Server实例之间,互相之间通过复制的方式,来实现服务注册表中数据的同步

服务提供者

服务提供者是作为EurekaClient存在的,其主要工作是

  • 向服务器注册服务
  • 发送心跳给服务器
  • 向服务器获取注册列表

服务调用者

服务调用者也是作为客户端存在的,其主要职责就是发现与调用服务

Eureka Server注册中心配置

依赖

1
2
3
4
5
<!--eureka-server服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

如果是F版及以上的话,需要使用该依赖

1
2
3
4
5
<!--新版本的eureka-server服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
阅读全文 »

Eureka服务下线

默认情况下,如果Eureka Server在90s内没有收到Eureka客户端的续约,会将实例从注册表中删除,这样就会导致有时候客户端已经停止了运行,但是依然在注册中心列表中,导致访问该客户端报错

手动下线

可以向Eureka注册中心发送delete请求来删除服务 /eureka/apps/{application.name}/

客户端通知注册中心下线

也可以在客户端显式的通知注册中心下线

1
DiscoveryManager.getInstance().shutdownComponent();

Bean的实例化过程

Spring既然可以创建并管理Bean,那Spring也要知道它需要创建的bean是什么,所以就需要程序员来告诉它需要创建的bean有哪些,所以就需要使用xml配置文件或者注解的方式来告诉Spring,Spring通过BeanDefinationReader将配置元信息加载到内存生成相应的BeanDefination之后,就将其注册到BeanDefinationRegistry中,BeanDefinationRegistry就是一个存放BeanDefination的大篮子,也是一种键值对的形式,通过特定的Bean定义的id,映射到相应的BeanDefination。

然后使用BeanFactoryPostProcessor来完成对bean的增强,BeanFactoryPostProcessor是一个接口,有很多的实现类

如PropertySourcesPlaceholderConfigurer来完成配置中的${…}的替换