Ambari深入学习(III)-开源使用及其改进思考

Ambari采用的不是一个新的思想和架构,也不是完成了软件的新的革命,而是充分利用了一些已有的优秀开源软件,巧妙地把它们结合起来,使其在分布式环境中做到了集群式服务管理能力、监控能力、展示能力。这些优秀开源软件有:

  1. 在agent端,采用了puppet管理节点;
  2. 在Web端,采用了ember.js作为前端的MVC构架和NodeJS相关工具,用handlebars.js作为页面渲染引擎,在CSS/HTML方面还用了Bootstrap 框架;
  3. 在Server端,采用了Jetty, Spring,Jetty,JAX-RS等;
  4. 同时利用了Ganglia,Nagios的分布式监控能力。

一、Puppet

在Agent节点上,它所有的状态更改操作,都是通过Puppet来完成。Agent相关软件包的安装部署是由python完成,Agent端的包升级操作由Python和Puppet组合完成。例如,如果在页面上进行启动HDFS服务,那么最终在某个Ambari-Agent端会执行类似如下命令:

Shell代码  

  1. /usr/lib/ambari-agent/lib/puppet-2.7.9/bin/puppet apply --confdir=/var/lib/ambari-agent/puppet --detailed-exitcodes /var/lib/ambari-agent/data/site-83.pp

其中site-83.pp 是manifestGenerator.generateManifest方法产生的puppet脚本文件,这个文件里主要完成一x些xxx-site.xml文件的配置工作,最后几行是完成puppet启动namenode的执行逻辑。

Puppet代码  

  1. #04.09.2013 15:52:26
  2. import ‘/var/lib/ambari-agent/puppet/modules/hdp/manifests/*.pp‘
  3. # 省略一堆import...
  4. # 省略一堆xxx-site.xml里面的参数配置项...
  5. $hadoop_pid_dir_prefix = ‘/var/run/hadoop‘
  6. $zookeeper_sessiontimeout = ‘60000‘
  7. $dfs_include = ‘dfs.include‘
  8. #执行节点 默认
  9. node /default/ {
  10. # 共分两步
  11. stage{1 :} -> stage{2 :}
  12. #第一步是 准备启动阶段,进行一系列的检查 和配置更新
  13. class {‘hdp‘: stage => 1}
  14. # 第二步是 执行namenode的启动工作。
  15. class {‘hdp-hadoop::namenode‘: stage => 2, service_state => running}
  16. }

二、Ember.JS

自从Node.JS出来之后, JavaScript就变得更加神奇了。在前端可以控制页面展示,在后台可以当作服务器。尤其在前端的迅猛发展,不断散发出其无穷无尽的魅力,难怪有人说不懂点JS就不是纯正的攻城师。

Ember.JS是在浏览器前端构建的JS MVC框架,简单易用。它需要你创建一个Ember.Application实例,这个实例里有许多动态对象,MVC的功能就是通过这些动态对象之间相互交互来完成。

Js代码  

  1. // Creates an application instance.
  2. App = Ember.Application.create({
  3. LOG_TRANSITIONS: true
  4. });

具体如何使用,请下载本文附件

三、Nagios & Ganglia的使用

如果要观看漂亮的监控图,它就需要依赖nagios和ganglia了,一旦安装成功,ambari-server就直接用http请求的方式向nagios和ganglia请求数据。

ganglia有直接的请求json数据的地址,格式如下:

http://localhost/ganglia//graph.php?g=load_report&json=true

nagios没有直接请求数据的功能,因此ambari实现了一段php代码用来读取服务的json数据,请求地址如下:

http://localhost/ambarinagios/nagios/nagios_alerts.php?q1=alerts&alert_type=all

四、Ambari-Server中的伪“插件”机制

Ambari-Server提供了多种类型的操作和服务,不同的操作对应不同的BaseProvider实现类和Definition实现类。如果要添加新的操作,就要依次实现对应Provider和Definition。这些操作类会统一加载进来。详情可以查看相关类的代码,例如:org.apache.ambari.server.controller.internal.AbstractControllerResourceProvider和org.apache.ambari.server.api.resources.ResourceInstanceFactoryImpl。这种实现机制在Ambari-Server这一层有点类似把服务当作插件来完成,但是也没有完全做到插件那么灵活,只需要实现某些类,配置某些参数就可以实现一个服务或操作。

五、改进思考

熟悉完Ambari的架构,运行逻辑和一些开源软件后,让我想到Hadoop的使用习惯选择,及其Hadoop 1.x 和Hadoop 2.x+的差别。

5.1. “Yarn”化?

Hadoop为了解决计算模型多样化的问题,能够在同一存储系统上实现多种计算模型,Hadoop 2.x+添加了Yarn框架。准确地说,Yarn框架是那些计算模型的共性部分(控制管理部分)抽象出来,产生出一个新的通用的计算管理控制器。在Hadoop 1.x 中只有MapReduce框架,现在常称之为MapReduce V1。Hadoop 2.x+把计算模型的计算部分和控制部分分离开来,把控制部分交给Yarn,把计算部分交给各个计算模型实现(MapReduce模型实现就成为了MapReduce V2)。同时可以在Yarn上实现其它计算模型,例如:实时计算模型Storm,图计算模型BSP。

想一想Ambari现在只能管理着Hadoop及其生态系统,如果需要其管理监控Storm集群,显然现在无法达到。对于不同服务,例如无论是hadoop服务还是storm服务,都有着其共性部分,把其共性部分单独抽取出来,形成一个组件,然后运维人员只需要实现其具体操作。这样一来Ambari又是一款真正伟大的产品。

5.2. 做到简单的手动安装升级?

有人会说,Ambari现在都强大到能做到自动部署升级,那么就很容易做到手动部署升级的?还有人说,既然都已经自动部署了,为什么还要手动部署呢?

5.3. 做到用自己已经装好的hadoop集群?

现在ambari只能从头开始,安装自己的hadoop版本。如果现在已经有了hadoop集群,那么ambari就很难支持了。如果把ambari的多种功能进行分解,形成一组互相衔接的模块,那就更容易自定义hadoop集群。对于系统工程师来说,添加一点麻烦是能够接受的。

原文地址:https://www.cnblogs.com/felixzh/p/10899599.html

时间: 2024-10-10 12:55:09

Ambari深入学习(III)-开源使用及其改进思考的相关文章

强烈推荐 GitHub 上值得前端学习的开源实战项目

强烈推荐 GitHub 上值得前端学习的开源实战项目. Vue.js vue-element-admin 是一个后台前端解决方案,它基于和 element-ui 实现 基于 iView 的 Vue 2.0 管理系统模板 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用 基于 vue + element-ui 的后台管理系统 基于Vue.js + Element UI 的后台管理系统解决方案 基于 Vue(2.5) + vuex + vue-router + vue-axi

学习欧拉phi函数的思考

其正确性思考写在了代码片上 忘记一件事:欧拉phi函数的作用是用来求1~n中与n互素的数的个数 #include<cstdio> #include<cstring> #include<cmath> int phi[5000000]; ///考虑到若所计算的数字是6,当i=2和i=3时都将会进入内层循环, ///一旦进入内层循环就会在该素数的基础上进行欧拉公式的运算 ///插入:欧拉公式:phi(n)=n*(1-1/p1)*(1-1/p2)*...(1-1/pn) ///

go语言值得学习的开源项目推荐

谷歌官方维护了一个基于go语言的开源项目列表: https://github.com/golang/go/wiki/Projects 其中有非常多的优秀项目值得学习,有几百行代码适合新手阅读的项目,也有大型如nsq.docker等的项目. 下面推荐几款适合学习的项目: 1.cache2go https://github.com/muesli/cache2go 比较简单的一个缓存库,代码量很少,适合新手学习,可以学习到锁.goroutines等. 2.groupcache https://gith

学习Coding-iOS开源项目日志(一)

前言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了新的什么东西?本人愚拙,而且码龄不多,也就三年左右,水平不高,如有挫解,还望指正.本人乐爱学习,乐于分享,广结良缘,愿意交流.当然,高手可以飘过. Coding-iOS项目网址:https://github.com/Coding/Coding-iOS 读者感兴趣的可以自己去下载,当然项目很多第三方框

Deep Q-Network 学习笔记(三)—— 改进①:nature dqn

由于 Q 值与 next Q 使用同一个网络时,是在一边更新一边学习,会不稳定. 所以,这个算法其实就是将神经网络拆分成 2 个,一个 Q 网络,用于同步更新 Q 值,另一个是 target 网络,用于计算目标 Q 值,并且每隔一段时间,自动将最新的 Q 网络的权值同步给 target 网络即可. 其实也就是在上一篇的基础上做以下修改即可: 1.增加一个 target 网络. 2.在记忆回放的时候,取 max Q 的值时将原本使用的 Q 网络修改成使用 target 网络. 3.在训练一定次数后

NodeJS几个值得学习的开源框架

1.Primus Primus,是Transformer的创造者,并且也被称为通用包装器实时框架.Primus里包含了大量的用于Node.js的实时框架,并 且它们都拥有各种不同的实时功能.此外,Primus还提供了通用的低级别接口用于各个实时框架之间进行通信.Primus开源,并且托管在Github上. 2.Geddy Geddy是一个非常简单的基于Node.js的结构化MVC框架.你可以使用它快速的构建Web应用和JSON API.如果你使用过Ruby on Rails或者PHP的codel

学习Coding-iOS开源项目日志(二)

前言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不 错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了新的什么东西?本人愚拙,而且码龄不多,也就三年左右,水平不高,如有挫解,还望指正. 本人乐爱学习,乐于分享,广结良缘,愿意交流.当然,高手可以飘过. Coding-iOS项目网址:https://github.com/Coding/Coding-iOS 读者感兴趣的可以自己去下载,当然项目很多第三

学习Coding-iOS开源项目日志(四)

Hello,大家好,好久没写博客了,今天再次来研究研究Coding源码,久违了. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不 错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了新的什么东西?本人愚拙,而且码龄不多,也就三年左右,水平不高,如有挫解,还望指正. 本人乐爱学习,乐于分享,广结良缘,愿意交流.当然,高手可以飘过. Coding-iOS项目网址:https://github.co

如何更有效学习php开源项目的源码

一.先把源代码安装起来,结合它的文档和手册,熟悉其功能和它的应用方式. 二.浏览源代码的目录结构,了解各个目录的功能. 三.经过以上两步后相信你对这个开源的产品有了一个初步的了解了,那现在就开始分析它的源码吧.这一步我们开始分析源代码框架.例如入口方式是单入口还是多入口,页面之间的调用规则,能根据规则找出某个功能用到的页面. 四.熟悉源代码的代码写作风格,例如缩进方式,排版格式等. 五.熟悉一下源代码用到的数据库和表,可以参考它的技术支持文档. 六.经过以上几步相信大家已经对这份源代码有了更深刻