Ambari 二次开发
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ambari 二次开发相关的知识,希望对你有一定的参考价值。
参考技术A 先看两张图,下面有对应的说明Ambari server 启动之后的的资源目录
自定义service放在 /var/lib/ambari-server/resources/stacks/HDP/2.6/services目录下,这个目录下面有很多实例可以参考,还可以参考 公共service ,公共service的目录在/var/lib/ambari-server/resources/common-services
3.登录 ambari-server 界面,如图所示,添加service
4.选择 My Service test ,点击next,然后一路next 直到结束
5.添加自定义service 之后的效果
6.自定义service的配置分析
1 . 先看下目录结构
相对于一个service增加的是 widgets.json ,metrics.json两个文件,修改了 metainfo.xml,send.sh 脚本是发送数据使用的。
widget_type 可以配置的有三种类型:
1. GRAPH 时间序列图。
2. NUMBER 显示一个数值
3.GAUGE 显示百分比
service_name: 和前面的service要对应
3.metrics.json 解析
4.metainfo.xml 上添加 timelineAppid
5.重启 ambari-server 能看到对应的wedgit 已经添加成功。
重启:# ambari-server restart
添加成功的wedgit,但是此时的wegit 没有数据。
这里使用 send.sh脚本,对应的脚本内容
在 /var/lib/ambari-server/resources/stacks/HDP/2.6/services/HELLO_SERVICE
目录下,执行 ./send.sh master test1 myTLappid 。这个三个参数分别是,master:主机名,test1:mertrics 名,myTLappid :timeline的appid名称。然后能在widgets上看到有数据的图形。
注意:
1.添加config之后的目录结构
在service 目录下面增加了 configuration 目录,和配置文件ambari-server-env.xml
require-input="false" 可以取默认值,默认是true ,上面配置中 AMBARI_USER_PASSWORD 就是必须配置的,在service添加的时候,会有提醒,见下面安装service配置的效果图。
再次安装自定义服务的时候就需要输入相关的配置了。
服务启动之后可以看到 配置文件
1.在service 目录下面添加 dotheright@master:~/mylovelycodes/ambari/Alert_SAMPLE$ cat alerts.json
基于ambari2.4.0进行二次开发
前言:如果想安装到CentOS7,就一定要将源码在CentOS7上编译,然后安装,否则可能会出现各种问题
目录
wiki:https://cwiki.apache.org/confluence/display/AMBARI/Ambari
源码结构
为了方便了解结构树,使用了一个在线脑图来展示。
技术点
编译环境的搭建
软件版本(要严格参照这个要求)
注:上表中操作系统是CentOS7,不是CentOS6.5
1.安装samba
因为需要用到nodejs、python等编译环境,并且nodejs有些库文件是需要C++ 、ruby、python等一些语言进行编译,在windows上处理会比较复杂,所以选择在Linux上搭建编译环境,并使用samba协议共享Linux中的文件,在linux上运行测试,在windows下进行代码修改。
- 安装samba
#先检查是否已经安装 #rpm -qa | grep samba #未安装的话 执行安装命令 yum install samba
- 重启 SMB服务
service smb restart
- 在 Linux 上建立samba用户
useradd samba
- 创建 Smb 用户,此用户必须是 Linux 上已经建立的,输入密码,完成即可。
smbpasswd -a samba
- 关闭防火墙
- 确保setlinux关闭
setenforce 0
- 修改/etc/samba/smb.conf,在最后加入想要共享的文件夹:
[samba home] path = /home/samba writeable = yes guest ok = yes read only = no [MyShare] path=/home/samba/ambari browsable=yes writable=yes guest ok=yes read only=no
现在就可以在windows上访问共享的目录了 在文件资源管理器上输入 \\\\<samba_ip> 即可 。注意ip前面有两个反斜线
2.安装编译环境
注:如果只想简单的改改页面,然后自己使用的话,完全没必要整体编译,只需要编译ambari-web和ambari-admin,然后把编译结果替换到ambari安装后的某些目录即可。
下面安装的软件,无论是yum,还是tar包,都要选择指定版本。
- 安装JDK 版本1.7.0
yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel #默认安装路径: /usr/lib/jvm/java-1.7.0-openjdk #在 ~/.bash_profile 中修改JVM内存参数 export _JAVA_OPTIONS="-Xmx2048m -XX:MaxPermSize=512m -Djava.awt.headless=true"
- 安装maven 版本 3.0.5
yum -y install 3.0.5-17.el7 #注意版本
mvn -v #验证安装情况为了提升速度,最好修改maven源为国内源,如阿里的。执行命令 vim $MAVEN_HOME/conf/settings.xml
<mirrors> ...... <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
- 安装g++
#检测 rpm -qa | grep gcc-c++ #安装 yum -y install gcc-c++
- 安装Python 版本2.6
#我这里下载2.6.9的版本 以下操作必须要使用root用户 yum -y install zlib #编译python需要 yum -y install zlib-devel #编译python需要
yum -y install python-devel.x86_64 #编译 Ambari Metrics Monitor 项目会用到 cd /opt/software wget https://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz #下载源码 tar zxvf Python-2.6.9.tgz #解压 cd Python-2.6.9 #进入解压目录 ./configure --prefix=/安装路径/python2.6 #开始编译 注:编译依赖g++,所以要先安装上g++ make make install ln -s /安装路径/python2.6/bin/python /bin/python2.6 #创建快捷方式(也可以将bin/python放入环境变量) python2.6 -V #验证安装情况 #编译安装Setuptools cd /opt/software wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086 tar zxvf setuptools-0.6c11.tar.gz #解压 cd setuptools-0.6c11 python2.6 setup.py build #编译 python2.6 setup.py install #安装 ln -s /opt/software/python2.6/bin/easy_install /bin/easy_install #给easy_install创建快捷方式 #以上参考 http://blog.csdn.net/ab198604/article/details/8681851 - 安装rpm-build
rpm -qa | grep rpm-build #检验是否存在 yum install rpm-build
- 安装Nodejs 版本:v0.10.44
- 下载安装包 版本地址
-
wget http://nodejs.org/dist/v0.10.44/node-v0.10.44-linux-x64.tar.gz
- 解压
tar zxvf node-v0.10.44-linux-x64.tar.gz
- 设置 /etc/profile 中的环境变量
...... export NODE_HOME="/opt/node-v0.10.44-linux-x64" export PATH=$PATH:$NODE_HOME/bin
使之生效
source /etc/profile
- 查看安装情况
node -v
npm -v
- 安装Brunch
npm install -g brunch@1.7.20 brunch #检测
- 安装Git(如果代码是在本地的话,可略过这一步。)
yum install git git --version #检测
使用git下载ambari代码。之前从官网下载的代码,出现各种问题,改从这个git下载的代码后就完全没问题了。 下载命令:
git clone https://git-wip-us.apache.org/repos/asf/ambari.git
3.整体编译
整体编译需要下载很多的maven依赖包,ambari-web和ambari-admin也需要通过npm和bower下载大量依赖包
所以推荐先进行ambari-web编译和ambari-admin编译;而maven的依赖包,可以选择安装的时候不执行clean命令
- cd 到ambari的主目录
- 给ambari打上版本号
mvn versions:set -DnewVersion=2.4.2.0.0 #虽然官网说是4位,但实际上这里如果不是5位后面会有不少麻烦
pushd ambari-metrics
mvn versions:set -DnewVersion=2.4.2.0.0
popdambari的版本号坑也是不少的,可参考:Ambari源码编译版本号问题
- 因为编译过程中会下载很多很多文件,并且有些文件下载特别慢,所以我们需要在编译前把这些文件先提前下载好,并且放到指定位置,这样编译起来就快多了
mkdir -P ambari-admin/src/main/resources/ui/admin-web/node_tmp wget -O ambari-admin/src/main/resources/ui/admin-web/node_tmp/node.tar.gz http://nodejs.org/dist/v4.5.0/node-v4.5.0-linux-x64.tar.gz wget -O ambari-admin/src/main/resources/ui/admin-web/npm.tar.gz http://registry.npmjs.org/npm/-/npm-2.15.0.tgz mkdir -P ambari-metrics/ambari-metrics-timelineservice/target/embedded wget -O ambari-metrics/ambari-metrics-timelineservice/target/embedded/hbase.tar.gz http://private-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.3.4.0-3347/tars/hbase-1.1.2.2.3.4.0-3347.tar.gz wget -O ambari-metrics/ambari-metrics-timelineservice/target/embedded/phoenix.tar.gz http://private-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.3.4.0-3347/tars/phoenix-4.4.0.2.3.4.0-3347.tar.gz mkdir -P ambari-metrics/ambari-metrics-grafana/target/grafana/ wget -O ambari-metrics/ambari-metrics-grafana/target/grafana/grafana.tgz https://grafanarel.s3.amazonaws.com/builds/grafana-2.6.0.linux-x64.tar.gz mkdir -P ambari-metrics/ambari-metrics-assembly/target/embedded wget -O ambari-metrics/ambari-metrics-assembly/target/embedded/hadoop.tar.gz http://private-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.3.4.0-3347/tars/hadoop-2.7.1.2.3.4.0-3347.tar.gz
- 编译ambari
mvn -B -e clean install package rpm:rpm -DnewVersion=2.4.2.0.0 -DskipTests -Dpython.ver="python >= 2.6" -Preplaceurl #版本号 与上一步一致
编译过程中如果看到停在了下载文件的位置,可以中断编译,直接去下载文件并放到指定位置
- cd 到ambari-web目录下 执行命令
brunch watch --server
顺利的话 打开网址 http://<ambari-webserver ip>:3333 就能看到成果了
参考:https://cwiki.apache.org/confluence/display/AMBARI/Ambari+Development
4.ambari-web的编译
ambari-web可以单独编译,也可以单独启动及测试。但是因为官方提供的测试数据不全,以及有些时候使用不方便,所以选择将源码与安装程序结合而进行开发。
简而言之就是 让安装的ambari程序访问我们开发中的代码。
首先要确认已经安装nodejs、brunch.(前面已经安装过了)
这里要说明一点,如果在执行 brunch编译的时候提示nodejs版本过低,那么安装nodejs7.0+即可解决。
cd /SOURCE_PATH #这里的SOURCE_PATH指的是源码计划安装的目录
git clone https://git-wip-us.apache.org/repos/asf/ambari.git #如果没有源码的话,需要下载源码 cd ambari/ambari-web npm install -g brunch #安装最新版本就没问题 rm -rf node_modules public #如果有的话 删掉 npm install #下载依赖包 brunch build #编译 brunch w #监听文件更新情况并同步到public目录。使用brunch watch --server 的话,可以开启webserver,但是这里面 我们不需要启动,只做监听操作
cd /usr/lib/ambari-server #ambariserver的安装目录
mv web web-orig #备份原始代码
ln -s /SOURCE_PATH/ambari/ambari-web/public web #建立软链接 使系统可以访问到我们修改的代码
ambari-server restart
通过以上步骤,只要我们更改了/SOURCE_PATH/ambari/ambari-web中的源码,brunch都会在后台将变化同步到ambari-web/public。由于使用了软链接,这些变化也会自动被Ambari Server获取到。
开发人员只需要走:修改代码==>刷新页面==>确认
我使用的这个版本在启动服务的时候出现异常
照理说express模块应该是安装了的。查看一下
错误【UNMET DEPENDENCY】,这是依赖冲突问题。单独安装缺失的模块版本即可。如
npm install express@~3.3.0
开发:
1.如果要处理国际化(多语言) ,只需要在ambari-web/app下面 创建目录 locales/zh ,并把app下面的messages.js复制进去,修改成自己想要的内容即可。
2.在目录app/assets/data 下面是mock 数据文件在ajax请求的时候会根据app/utils/ajax/ajax.js中的设置来决定每一个请求。例如登录请求:
App.ajax.send({ name: \'router.login\', //这个name跟ajax.js中的key对应 sender: this, data: { auth: "Basic " + hash, usr: usr, loginName: encodeURIComponent(loginName) }, beforeSend: \'authBeforeSend\', success: \'loginSuccessCallback\', error: \'loginErrorCallback\' });
ajax.js中的对应部分
\'router.login\': { //对应ajax请求中的name属性 \'real\': \'/users/{loginName}?fields=*,privileges/PrivilegeInfo/cluster_name,privileges/PrivilegeInfo/permission_name\', \'mock\': \'/data/users/user_{usr}.json\', \'format\': function (data) { var statusCode = jQuery.extend({}, require(\'data/statusCodes\')); statusCode[\'403\'] = function () { console.log("Error code 403: Forbidden."); }; return { statusCode: statusCode }; } }
3.路由流程(输入url后查找哪些文件)
在router.js中定义了总路由 App.Router
App.Router = Em.Router.extend({ enableLogging: true,//定义局部变量 root: Em.Route.extend({ index: Em.Route.extend({//index是路由名 route: \'/\', //这个是路由路径 redirectsTo: \'login\' //重定向 (后面的值是路由名) }), enter: function(router){ router.initAdmin(); //进入该路由后的相关处理 }, login: Em.Route.extend({ route: \'/login:suffix\', enter: function (router, context) { //TODO 进入该路由后的相关处理 }, connectOutlets: function (router, context) { router.get(\'applicationController\').connectOutlet(\'login\');//获取applicationController并将LoginView放入其子模板 //在上面的过程中 获取applicationController会自动绑定ApplicationView //而后面的login,ember会将首字母转大写,后面拼接\'View\' //注意的是 controller与viewjs是自动对应,但不一定同时存在 }//渲染子模板 }), installer: require(\'routes/installer\'), //指向其他文件中的路由 initAdmin:function(){ //TODO } }) });
多想一点:
- 我们的代码要在linux上编译(所以代码要在linux上)
- 我们需要在windows上编写代码(windows上也要能访问到代码)
- 开发的代码还要有代码服务器(代码管理,但是代码在linux上,在linux上用svn?)
- 要有正在监控集群的ambari,同时如何把开发成果发布上去(每次从开发机编译代码,然后scp过去?)
针对以上问题,想到了如下方案
5.ambari-admin 的编译
ambari-admin 使用的是angularjs + bower + gulp。
bower与npm的使用方式基本一样,angularjs也与emberjs风格类似。
- cd 到 /源码目录/ambari-admin/src/main/resources/ui/admin-web
- 编辑 .bowerrc
{ "directory": "app/bower_components", "allow_root": true //允许以root用户执行bower命令。也可以在执行命令的时候通过参数设定 如:bower install --allow-root 不要复制这段注释 }
- 安装npm依赖包,全局安装gulp、bower
npm install npm install -g bower npm install -g gulp
- 安装bower的依赖包
bower install
- 修改gulpfile.js文件 (添加了用gulp-webserver的启动web,关于gulp-webserver的使用可参考这里)
\'use strict\'; var gulp = require(\'gulp\'); var $ = require(\'gulp-load-plugins\')(); var webserver = require(\'gulp-webserver\'); var current = "test"; var config = { start_task:{ test:"webserver", build:"build" } }; gulp.task(\'webserver\', function(){ gulp.src(\'app\').pipe(webserver({ port: 8000,//端口 host: \'192.168.30.135\',//域名 livereload: true,//实时刷新代码。不用f5刷新 directoryListing: true, //fallback:\'index.html\', open:true })) }); gulp.task(\'styles\', function () { return gulp.src(\'app/styles/*.css\') .pipe($.order([ \'app/styles/main.css\', \'app/styles/custom-admin-ui.css\' // This should always be the last stylesheet. So it can be dropped and be effective on build time ], { base: \'./\' })) .pipe($.concat(\'main.css\')) .pipe($.autoprefixer(\'last 1 version\')) .pipe(gulp.dest(\'.tmp/styles\')) .pipe($.size()); }); gulp.task(\'html\', [\'styles\'], function () { var jsFilter = $.filter(\'**/*.js\'); var cssFilter = $.filter(\'**/*.css\'); return gulp.src(\'app/*.html\') .pipe($.plumber()) .pipe($.useref.assets({searchPath: \'{.tmp,app}\'})) .pipe(jsFilter) .pipe(jsFilter.restore()) .pipe(cssFilter) .pipe(cssFilter.restore()) .pipe($.useref.restore()) .pipe($.useref()) .pipe(gulp.dest(\'dist\')) .pipe($.size()); }); gulp.task(\'views\', function () { return gulp.src(\'app/views/**/*.html\') .pipe(gulp.dest(\'dist/views\')); }); gulp.task(\'images\', function () { return gulp.src(\'app/img/**/*\') .pipe(gulp.dest(\'dist/img\')) .pipe($.size()); }); gulp.task(\'fonts\', function () { return $.bowerFiles() .pipe($.filter(\'**/*.{eot,svg,ttf,woff}\')) .pipe($.flatten()) .pipe(gulp.dest(\'dist/fonts\')) .pipe($.size()); }); gulp.task(\'extras\', function () { return gulp.src([\'app/*.*\', \'!app/*.html\'], {dot: true}) .pipe(gulp.dest(\'dist\')); }); gulp.task(\'clean\', function () { return gulp.src([\'.tmp\', \'dist\'], {read: false}).pipe($.clean()); }); gulp.task(\'build\', [\'html\', \'views\', \'images\', \'fonts\', \'extras\']); gulp.task(\'default\', [\'clean\'], function () { gulp.start(config.start_task[current]); });
- 安装 gulp-webserver
npm install gulp-webserver --save-dev
- 开始构建
gulp
- 如果gulpfile.js中的current是\'test\',那么访问 http://<ip>:8000/index.html 即可进行独立编译开发
- 如果gulpfile.js中的current是\'build\',则需要与ambari的安装程序进行结合使用。(与ambari-web编译的步骤类似)
cd /var/lib/ambari-server/resources/views/work mv ADMIN_VIEW\\{version} /tmp ln -s /sourcepath/ambari/ambari-admin/src/main/resources/ui/admin-web/dist ADMIN_VIEW\\{version} cp /tmp/ADMIN_VIEW\\{version}/view.xml ADMIN_VIEW\\{version}/ ambari-server restart
现在,我们更改源码的时候,在执行一下gulp,就可以在安装的ambari的GUI看到效果了(也可以再安装一个监听变化的gulp插件)
如果要国际化,只需要修改文件 app/scripts/i18n.config.js即可
插播1. 关于Brunch
Brunch自动化打包压缩编译工具。前端的工程化利器。
源码发生的改动会迅速反应到压缩结果。
官文请戳
- 确定安装好node.js
- 在全局安装brunch
npm install -g brunch
- 在当前目录创建项目 hellobrunch
brunch new hellobrunch -s es6
创建成功后,当前目录会创建文件夹hellobrunch,生成一些结构和相关文件,并通过npm下载安装所有的依赖包(node_modules)
- cd到刚创建的project目录(即hellobrunch),进行编译。编译压缩合并的结果会出现在 public文件夹
brunch build
其中:
assets中的文件会被直接拷贝到public
brunch-config存放的是压缩合并编译的规则
package.json存放的是依赖包信息
public/app.js及public/app.css是根据合并规则生成的合并结果
*.map是用于调试的代码映射信息 - 现在一个简单的webapp就成型了 接下来就是启动。启动后 如果源码发生变化 public中的内容也会自动跟进变化
brunch watch --server
或
brunch w -s
其中brunch watch 是监听源码变动并自动编译到public文件夹 而brunch --server则是启动web server可以看到服务的端口是3333,所以我们可以在浏览器上通过http://<ip>:3333 进行查看
- 安装插件 如jquery
npm install --save jquery
应用:(在app/initialize.js的最后 添加以下代码。保存后会发现 public/app.js中已经出现了这个代码片段)
var $ = require(\'jquery\'); console.log(\'Tasty Brunch, just trying to use jQuery!\', $(\'body\'));
插播2:Ember.js
与angularjs类似的前端框架
官文请戳
ambari2.4.2 的ambari-web中使用的emberjs版本信息:
// Version: v1.0.pre // Last commit: 7955b85 (2012-08-03 14:50:17 -0700)
Ambari一直使用的1.0pre 这是比2013年8月份1.0正式版还早一年的版本,现在官网是找不到这个版本的API的。
插播3:NPM
NPM是nodejs包管理器
npm下载的时候默认是国外的资源 速度一般会比较慢。跟maven一样 我们可以使用淘宝的代理:
- 编辑~/.npmrc文件 (默认是在这个位置,如果没有的话就创建一个)
vim ~/.npmrc
- 修改配置
......... registry = http://registry.npm.taobao.org #指定代理地址
要注意的是,有时候使用淘宝代理下载依赖会出现挂起的现象,临时禁掉代理(注释掉)就没问题了。
命令一览
npm -v #查看npm版本
npm config get prefix #查看全局安装目录
#更改全局安装目录
mkdir <somepath>/.npm-global #创建安装目录
npm config set prefix \'<somepath>/.npm-global\' #指定新目录
添加路径 #编辑~/.bash_profile export PATH=~/.npm-global/bin:$PATH
source ~/.bash_profile #生效
npm install -g <package-name> #全局模式安装模块
npm install --save <package-name> #安装模块并将信息写入package.config的dependencies
npm install --save-dev <package-name> #安装模块并将信息写入package.config的devDependencies
npm install <package-name> #在当前所在项目安装模块 (所以要进入项目目录)
npm install <package-name>@<version> #安装指定版本的模块 (不指定的话 默认获取最新版)
npm install <package-name>@">=v1 <v2" #指定版本范围
npm install #根据package.json 下载所有依赖包
npm uninstall [-g] <package name> [--save] #卸载本地[全局]模块,[package.json中删除依赖]
npm update [-g] <package name> #更新本地[全局]模块
npm outdated #展示项目中过时的包
npm update #更新项目中所有包
var moduleA = require(\'<package-name>\'); #使用模块(无法加载全局安装的模块)
npm ls [--depth=n] #列出当前安装的模块[深度(从0开始)]
npm root [-g] #查看当前[全局]模块的安装路径
关于package.json
package.json是本地已安装包的管理文件,通过这个文件我们可以知道当前项目依赖的包、指定包的版本
我们可以在安装包的时候将依赖信息写入这个文件,也可以根据这个文件下载所有需要的包(通过 npm install )
结构介绍
- name:项目名称,无空格的一个全小写单词,可包含下划线和破折号(如果该项目要发布到npm的话 还要全npm唯一)
- version:项目版本 格式是 x.x.x (每次发布都要更新)
- main:入口js文件 如 index.js
- scripts:脚本字典
- keywords:关键字 利于在npm网站中进行搜索
- author:作者
- license:ISC
- repository:代码提交路径
- bugs:bug提交目录
- homepage
- dependencies:项目中依赖的包
- devDependencies:开发和测试时依赖的包
关于发布自己的包
- 创建项目。最好要有README.md文件,让用模块的人能更清晰的了解项目
- 要有npm的账号。到官网https://www.npmjs.com注册一个即可,重点是账号,密码,邮箱。也可以在命令行执行 npm adduser
- 在shell下登录npm。执行命令 npm login,输入上面提到的三个信息
- 到npm项目下 执行以下命令就OK了
npm publish
#如果已经发布过一次了 记得要更新版本号,否则会出现问题[You cannot publish over the previously published version x.x.x." : <projectname>#项目名称也不能跟其他人的重复,否则会出现问题[you do not have permission to publish "<projectname>". Are you logged in as the correct user? : <projectname> ]
- 更新模块并重新发布
npm version patch #重新生成版本号 也可以编辑package.json中的version npm publish #发布
如果出现权限问题,如 [user "root" does not have permission to access the dev dir
] 可参考命令一览,更改全局目录并设一下权限即可
如果出现[cannot find module \'xxxx\']的问题 参考http://stackoverflow.com/questions/10776405/npm-cant-install-appjs-error-cannot-find-module-graceful-fs
插播4:less
less需要用npm安装
npm install less -g #因为这是个公用的模块,所以要安装到全局
main.less
@base: #f938ab; .box-shadow(@style, @c) when (iscolor(@c)) { -webkit-box-shadow: @style @c; box-shadow: @style @c; } .box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) { .box-shadow(@style, rgba(0, 0, 0, @alpha)); } .box { color: saturate(@base, 5%); border-color: lighten(@base, 30%); div { .box-shadow(0 0 5px, 30%) } }
使用命令编译
lessc main.less main.css
结果:main.css
.box { color: #fe33ac; border-color: #fdcdea; } .box div { -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); }
其他内容
- ambari-agent在安装集群的时候会读取当前节点上的一个配置文件。路径是 /etc/ambari-agent/conf/ambari-agent.ini 内容如下
[server] hostname=node1.somedomain #ambari-server的hostname。注意 如果server的hostname在安装的过程中有改动,一定要修改各个节点上该文件的这个设置,否则无法注册节点 url_port=8440 secured_url_port=8441 [agent] logdir=/var/log/ambari-agent piddir=/var/run/ambari-agent prefix=/var/lib/ambari-agent/data ;loglevel=(DEBUG/INFO) loglevel=INFO data_cleanup_interval=86400 data_cleanup_max_age=2592000 data_cleanup_max_size_MB = 100 ping_port=8670 cache_dir=/var/lib/ambari-agent/cache tolerate_download_failures=true run_as_user=root parallel_execution=0 alert_grace_period=5 alert_kinit_timeout=14400000 system_resource_overrides=/etc/resource_overrides ; memory_threshold_soft_mb=400 ; memory_threshold_hard_mb=1000 [security] keysdir=/var/lib/ambari-agent/keys server_crt=ca.crt passphrase_env_var_name=AMBARI_PASSPHRASE ssl_verify_cert=0 [services] pidLookupPath=/var/run/ [heartbeat] state_interval_seconds=60 dirs=/etc/hadoop,/etc/hadoop/conf,/etc/hbase,/etc/hcatalog,/etc/hive,/etc/oozie, /etc/sqoop,/etc/ganglia, /var/run/hadoop,/var/run/zookeeper,/var/run/hbase,/var/run/templeton,/var/run/oozie, /var/log/hadoop,/var/log/zookeeper,/var/log/hbase,/var/run/templeton,/var/log/hive ; 0 - unlimited log_lines_count=300 idle_interval_min=1 idle_interval_max=10 [logging] syslog_enabled=0
参考:
以上是关于Ambari 二次开发的主要内容,如果未能解决你的问题,请参考以下文章