Observer观察者设计模式是行为模式的一种,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。如下用代码的形式来展现被观察者(新闻出版社)和观察者(与之关联的订户观察者对象)是如何保持信息同步的。
1 被观察者-新闻出版社
/**
* NewsPublisher: 新闻出版社
*/
class NewsPublisher extends Observable {
public void publishNews(String newsTitle, String newsBody) {
News news = new News(newsTitle, newsBody);
setChanged(); //通过setChanged()方法标明对象的状态已发生变化
this.notifyObservers(news); //通知各Observer,并发送一个名为news对象的消息
// ... ...
}
}
2 观察者-订户观察者
/**
* 订户观察者。
* Created by myuser on 2014/11/29.
*/
public class SubscriberObserver implements Observer {
// 新闻出版社调用notifyObservers(news)方法,自动调用如下方法以保持信息同步。
public void update(Observable observee, Object param) {
if (param instanceof News) {
mail2Subscriber((News)param);
}
}
private void mail2Subscriber(News news) {
System.out.println("Mail to subscriber. A news published with title:" + news.getTitle());
}
}
3 构造者
被观察者调用notifyObservers()方法后,为什么观察者就能接收到呢?那是因为有构造者这个角色,它将观察者添加到被观察者的依赖对象里面,代码如下:
public class Client {
/**
* Test Observer Pattern
*/
public static void main(String[] args) {
NewsPublisher publisher = new NewsPublisher();
// 添加订户观察者依赖对象
publisher.addObserver(new SubscriberObserver());
//发布新闻,触发通知事件
publisher.publishNews("Hello news", "news body");
}
}
上面是一个简单的Observer观察者设计模式的实例。接下来看看大数据框架hadoop是如何应用该设计模式的。
应用场景如下:JobTracker收到作业后,并不会马上对其初始化,而是交给调度器,由它按照一定的策略对作业进行初始化。
4 被观察者-JobTracker
JobTracker进行作业添加(执行addJob()方法)时,会同步该消息到对应的观察者(JobInProgressListener )那里,代码如下:
publicclass JobTracker {
privatefinal List<JobInProgressListener> jobInProgressListeners =
new CopyOnWriteArrayList<JobInProgressListener>();
private synchronized JobStatus addJob(JobID jobId, JobInProgress
job) {
... ...
for (JobInProgressListener listener : jobInProgressListeners) {
listener.jobAdded(job); //通知各Observer,并发送job消息
}
... ...
}
}
5 观察者-JobQueueJobInProgressListener
class JobQueueJobInProgressListener extends JobInProgressListener {
private Map<JobSchedulingInfo, JobInProgress> jobQueue;
@Override
publicvoid jobAdded(JobInProgress job) {
// 将作业添加到作业队列里。
jobQueue.put(new JobSchedulingInfo(job.getStatus()), job);
}
}
6 构造者
接下来看一下JobTracker和JobQueueJobInProgressListener的依赖关系是如何建立起来的。
先看一下JobTracker类的一些信息,代码如下所示:
publicclass JobTracker implements MRConstants, InterTrackerProtocol,
JobSubmissionProtocol, TaskTrackerManager, RefreshUserMappingsProtocol,
RefreshAuthorizationPolicyProtocol, AdminOperationsProtocol,
JobTrackerMXBean {
// 该类实例化的时候,会从配置文件的属性mapred.jobtracker.taskScheduler获取调度器的类名,然后实例化一个调度器作为JobTracker的一个属性。代码如下所示:
JobTracker(final JobConf conf, String identifier, Clock clock, QueueManager qm) {
... ...
Class<? extends TaskScheduler> schedulerClass
= conf.getClass("mapred.jobtracker.taskScheduler",
JobQueueTaskScheduler.class, TaskScheduler.class);
taskScheduler = (TaskScheduler) ReflectionUtils.newInstance(schedulerClass, conf);
... ...
}
// JobTracker类被运行的时候会去调用startTracker()静态方法和offerService(),代码如下所示:
publicstaticvoid main(String argv[]
) throws IOException, InterruptedException {
... ...
JobTracker tracker = startTracker(new JobConf());
tracker.offerService();
... ...
}
// startTracker()静态方法首先实例一个JobTracker类,然后将当前实例赋给调度器的taskTrackerManager属性。
publicstatic JobTracker startTracker(JobConf conf, String identifier)
throws IOException, InterruptedException {
... ...
result = new JobTracker(conf, identifier);
result.taskScheduler.setTaskTrackerManager(result);
... ...
returnresult;
}
// offerService()方法调用调度器的start()方法。
publicvoid offerService() throws InterruptedException, IOException {
... ...
taskScheduler.start();
... ...
}
}
// 如下是调度器的start()方法,该方法将JobQueueJobInProgressListener类添加到JobTracker的依赖属性里,也即构造了JobTracker和JobQueueJobInProgressListener的被观察者与观察者关系。
class JobQueueTaskScheduler extends TaskScheduler {
public JobQueueTaskScheduler() {
this.jobQueueJobInProgressListener=new JobQueueJobInProgressListener();
}
publicsynchronizedvoid start() throws IOException {
... ...
taskTrackerManager.addJobInProgressListener(jobQueueJobInProgressListener);
... ...
}
}
相关推荐
总的来说,这个课程设计涵盖了从数据采集、预处理到分布式存储和处理的全过程,旨在培养学生的实战技能,使他们能够应对复杂的大数据应用场景。通过Python爬虫和Hadoop的学习,不仅能够掌握数据获取的技巧,还能掌握...
大数据之Hadoop学习教程+笔记合计_超详细完整.zip
本系统利用大数据技术,合理的为用户做出推荐,推荐的结果可靠程度很高,这就是我的优势所在,因为它和一般的推荐系统的推荐算法不太一样,我的推荐算法是利用Hadoop技术写的,我们可以利用Hadoop集群的高吞吐量,一...
#一文读#一文11读懂大数据-Hadoop-大数据技术和相关应用.docx大数据_Hadoop_大数据技术和相关应用.docx#一文读懂大数据_Hadoop_大数据技术和相关应用.docx
大数据之Hadoop伪分布模式启动 Hadoop伪分布模式是一种特殊的Hadoop集群模式,在这种模式下,所有Hadoop服务都运行在同一个节点上,模拟一个完整的Hadoop集群环境。这种模式非常适合开发、测试和学习Hadoop。 格式...
(2)修改 module、software 文件夹的所有者 (1)查询是否安装 java 软件: (2)如果安装的版本低于 1.7,卸载该 jdk: (1)先获
Linux运维-运维课程MP4频-06-大数据之Hadoop部署-25yarn应用及测试.mp4
04_Hadoop_概论_大数据的应用场景.mp4 06_Hadoop_概论_未来工作内容.mp4 07_Hadoop_入门_课程介绍.mp4 11_Hadoop_入门_Hadoop优势.mp4 13_Hadoop_入门_HDFS概述.mp4 14_Hadoop_入门_YARN概述.mp4 16_Hadoop_入门_...
该文档简要介绍了大数据与Hadoop的概念及相关大数据框架,对于在大数据的初学者来说有一定的帮助,可以指导如何学习,以及学习各个框架的步骤
Hadoop是Apache基金会开源的一个分布式计算框架,其设计目标是处理和存储海量数据。Hadoop的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce。HDFS是一种高容错性的分布式文件系统,它能够将大规模...
HBase与HDFS紧密集成,能够处理PB级别的数据,是大数据应用中的实时数据访问层。 Sqoop是一款用于在Hadoop和传统数据库之间导入导出数据的工具。它简化了批量数据迁移过程,允许用户在关系型数据库和Hadoop之间进行...
1.大数据框架hadoop; 2.根据表名,获取全部数据,支持翻页; 3.获取数据总条数; 4.根据表名、上次查询最后一条记录的rowkey,获取下一页数据; 5.数据支持jsonarray/list等;
大数据之hadoop,spart全套全技术栈视频课程,包含spark,hadoop,storm,kafka,mllib等组件的安装,编程等,依次从基础,进阶直到实际实践。
【大数据应用场景】 - **物流仓储**(图2-6):通过分析订单、库存和运输数据优化供应链管理,提高效率。 - **零售**(图2-7):利用顾客购买行为、浏览历史等数据进行个性化推荐,提升销售业绩。 - **旅游**(图2-8...
技术领域:大数据领域Hadoop技能学习 技术关键词:大数据、Hadoop 内容:大数据小白晋升之路学习必备 用途:学习
根据给定文件的内容部分,我们可以提炼出以下几个知识点: 1. 大数据业务处理基本流程与关键技术 ...在实际的Hadoop学习和应用中,这些知识点是非常重要的基础,有助于理解和操作Hadoop集群以及处理大数据问题。
大数据云计算技术 Hadoop应用浅析(共16页).pptx 大数据云计算技术 Hadoop运维杂记(共21页).pptx 大数据云计算技术 暴风集团基于hadoop的数据平台总体架构简介(共18页).ppt 大数据云计算技术 淘宝网Hadoop与...
【尚硅谷大数据技术之Hadoop】是一门深入探讨大数据处理技术的课程,主要聚焦于开源框架Hadoop。Hadoop是Apache软件基金会开发的一个分布式计算项目,它为大规模数据集(大于1TB)提供了高容错性的分布式存储和计算...