前言:如果想安装到CentOS7,就一定要将源码在CentOS7上编译,然后安装,否则可能会出现各种问题

目录

  1. 源码结构
  2. 技术点
  3. 编译环境的搭建 
    1. 安装samba
    2. 安装编译环境
    3. 整体编译
    4. ambari-web的编译
    5. ambari-admin的编译
  4. 其他信息

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下进行代码修改。

  1. 安装samba

    1. #先检查是否已经安装
    2. #rpm -qa | grep samba
    3.  
    4. #未安装的话 执行安装命令
    5. yum install samba
  2. 重启 SMB服务
    1. service smb restart
  3. 在 Linux 上建立samba用户
    1. useradd samba
  4. 创建 Smb 用户,此用户必须是 Linux 上已经建立的,输入密码,完成即可。
    1. smbpasswd -a samba
  5. 关闭防火墙
  6. 确保setlinux关闭
    1. setenforce
  7. 修改/etc/samba/smb.conf,在最后加入想要共享的文件夹:
    1. [samba home]
    2. path = /home/samba
    3. writeable = yes
    4. guest ok = yes
    5. read only = no
    6.  
    7. [MyShare]
    8. path=/home/samba/ambari
    9. browsable=yes
    10. writable=yes
    11. guest ok=yes
    12. read only=no

现在就可以在windows上访问共享的目录了  在文件资源管理器上输入 \\<samba_ip> 即可 。注意ip前面有两个反斜线

2.安装编译环境

注:如果只想简单的改改页面,然后自己使用的话,完全没必要整体编译,只需要编译ambari-webambari-admin,然后把编译结果替换到ambari安装后的某些目录即可。

下面安装的软件,无论是yum,还是tar包,都要选择指定版本。

  1. 安装JDK 版本1.7.0

    1. yum install java-1.7.-openjdk java-1.7.-openjdk-devel
    2. #默认安装路径: /usr/lib/jvm/java-1.7.-openjdk
    3.  
    4. #在 ~/.bash_profile 中修改JVM内存参数
    5. export _JAVA_OPTIONS="-Xmx2048m -XX:MaxPermSize=512m -Djava.awt.headless=true"
  2. 安装maven 版本 3.0.5
    1. yum -y install 3.0.5-17.el7 #注意版本
      mvn -v #验证安装情况

    为了提升速度,最好修改maven源为国内源,如阿里的。执行命令  vim $MAVEN_HOME/conf/settings.xml

    1. <mirrors>
    2. ......
    3.  
    4. <mirror>
    5. <id>nexus-aliyun</id>
    6. <mirrorOf>central</mirrorOf>
    7. <name>Nexus aliyun</name>
    8. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    9. </mirror>
    10. </mirrors>
  3. 安装g++
    1. #检测
    2. rpm -qa | grep gcc-c++
    3.  
    4. #安装
    5. yum -y install gcc-c++
  4. 安装Python 版本2.6
    1. #我这里下载2..9的版本 以下操作必须要使用root用户
    2. yum -y install zlib #编译python需要
    3. yum -y install zlib-devel #编译python需要
      yum -y install python-devel.x86_64 #编译 Ambari Metrics Monitor 项目会用到
    4.  
    5. cd /opt/software
    6. wget https://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz #下载源码
    7. tar zxvf Python-2.6..tgz #解压
    8. cd Python-2.6. #进入解压目录
    9. ./configure --prefix=/安装路径/python2. #开始编译 注:编译依赖g++,所以要先安装上g++
    10. make
    11. make install
    12. ln -s /安装路径/python2./bin/python /bin/python2. #创建快捷方式(也可以将bin/python放入环境变量)
    13. python2. -V #验证安装情况
    14.  
    15. #编译安装Setuptools
    16. cd /opt/software
    17. wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086
    18. tar zxvf setuptools-.6c11.tar.gz #解压
    19. cd setuptools-.6c11
    20. python2. setup.py build #编译
    21. python2. setup.py install #安装
    22. ln -s /opt/software/python2./bin/easy_install /bin/easy_install #给easy_install创建快捷方式
    23.  
    24. #以上参考 http://blog.csdn.net/ab198604/article/details/8681851
  5. 安装rpm-build
    1. rpm -qa | grep rpm-build #检验是否存在
    2.  
    3. yum install rpm-build
  6. 安装Nodejs  版本:v0.10.44
    1. 下载安装包 版本地址
      1. wget http://nodejs.org/dist/v0.10.44/node-v0.10.44-linux-x64.tar.gz
    2. 解压
      1. tar zxvf node-v0.10.44-linux-x64.tar.gz
    3. 设置 /etc/profile 中的环境变量 
      1. ......
      2. export NODE_HOME="/opt/node-v0.10.44-linux-x64"
      3. export PATH=$PATH:$NODE_HOME/bin

      使之生效

      1. source /etc/profile
    4. 查看安装情况
      1. node -v
        npm -v
  7. 安装Brunch
    1. npm install -g brunch@1.7.20
    2. brunch #检测
  8. 安装Git(如果代码是在本地的话,可略过这一步。)
    1. yum install git
    2.  
    3. git --version #检测

    使用git下载ambari代码。之前从官网下载的代码,出现各种问题,改从这个git下载的代码后就完全没问题了。 下载命令:

    1. 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命令

  1. cd 到ambari的主目录
  2. 给ambari打上版本号
    1. mvn versions:set -DnewVersion=2.4.2.0.0 #虽然官网说是4位,但实际上这里如果不是5位后面会有不少麻烦
      pushd ambari-metrics
      mvn versions:set -DnewVersion=2.4.2.0.0
      popd

    ambari的版本号坑也是不少的,可参考:Ambari源码编译版本号问题

  3. 因为编译过程中会下载很多很多文件,并且有些文件下载特别慢,所以我们需要在编译前把这些文件先提前下载好,并且放到指定位置,这样编译起来就快多了
    1. mkdir -P ambari-admin/src/main/resources/ui/admin-web/node_tmp
    2. 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
    3. wget -O ambari-admin/src/main/resources/ui/admin-web/npm.tar.gz http://registry.npmjs.org/npm/-/npm-2.15.0.tgz
    4.  
    5. mkdir -P ambari-metrics/ambari-metrics-timelineservice/target/embedded
    6. 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
    7. 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
    8.  
    9. mkdir -P ambari-metrics/ambari-metrics-grafana/target/grafana/
    10. 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
    11.  
    12. mkdir -P ambari-metrics/ambari-metrics-assembly/target/embedded
    13. 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
  4. 编译ambari
    1. mvn -B -e clean install package rpm:rpm -DnewVersion=2.4.2.0.0 -DskipTests -Dpython.ver="python >= 2.6" -Preplaceurl #版本号 与上一步一致

    编译过程中如果看到停在了下载文件的位置,可以中断编译,直接去下载文件并放到指定位置

  5. cd 到ambari-web目录下 执行命令
    1. 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+即可解决。

  1. cd /SOURCE_PATH #这里的SOURCE_PATH指的是源码计划安装的目录
    git clone https://git-wip-us.apache.org/repos/asf/ambari.git #如果没有源码的话,需要下载源码
  2. cd ambari/ambari-web
  3. npm install -g brunch #安装最新版本就没问题
  4. rm -rf node_modules public #如果有的话 删掉
  5. npm install #下载依赖包
  6. brunch build #编译
  7. brunch w #监听文件更新情况并同步到public目录。使用brunch watch --server 的话,可以开启webserver,但是这里面 我们不需要启动,只做监听操作
  8.  
  9. 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】,这是依赖冲突问题。单独安装缺失的模块版本即可。如

  1. npm install express@~3.3.

开发:

1.如果要处理国际化(多语言) ,只需要在ambari-web/app下面 创建目录 locales/zh ,并把app下面的messages.js复制进去,修改成自己想要的内容即可。

2.在目录app/assets/data 下面是mock 数据文件在ajax请求的时候会根据app/utils/ajax/ajax.js中的设置来决定每一个请求。例如登录请求:

  1. App.ajax.send({
  2. name: 'router.login', //这个name跟ajax.js中的key对应
  3. sender: this,
  4. data: {
  5. auth: "Basic " + hash,
  6. usr: usr,
  7. loginName: encodeURIComponent(loginName)
  8. },
  9. beforeSend: 'authBeforeSend',
  10. success: 'loginSuccessCallback',
  11. error: 'loginErrorCallback'
  12. });

ajax.js中的对应部分

  1. 'router.login': { //对应ajax请求中的name属性
  2. 'real': '/users/{loginName}?fields=*,privileges/PrivilegeInfo/cluster_name,privileges/PrivilegeInfo/permission_name',
  3. 'mock': '/data/users/user_{usr}.json',
  4. 'format': function (data) {
  5. var statusCode = jQuery.extend({}, require('data/statusCodes'));
  6. statusCode['403'] = function () {
  7. console.log("Error code 403: Forbidden.");
  8. };
  9. return {
  10. statusCode: statusCode
  11. };
  12. }
  13. }

3.路由流程(输入url后查找哪些文件)

在router.js中定义了总路由 App.Router

  1. App.Router = Em.Router.extend({
  2. enableLogging: true,//定义局部变量
  3. root: Em.Route.extend({
  4. index: Em.Route.extend({//index是路由名
  5. route: '/', //这个是路由路径
  6. redirectsTo: 'login' //重定向 (后面的值是路由名)
  7. }),
  8. enter: function(router){
  9. router.initAdmin(); //进入该路由后的相关处理
  10. },
  11. login: Em.Route.extend({
  12. route: '/login:suffix',
  13. enter: function (router, context) {
  14. //TODO 进入该路由后的相关处理
  15. },
  16. connectOutlets: function (router, context) {
  17. router.get('applicationController').connectOutlet('login');//获取applicationController并将LoginView放入其子模板
  18. //在上面的过程中 获取applicationController会自动绑定ApplicationView
  19. //而后面的login,ember会将首字母转大写,后面拼接'View'
  20. //注意的是 controller与viewjs是自动对应,但不一定同时存在
  21. }//渲染子模板
  22. }),
  23. installer: require('routes/installer'), //指向其他文件中的路由
  24. initAdmin:function(){
  25. //TODO
  26. }
  27. })
  28. });

多想一点:

  1. 我们的代码要在linux上编译(所以代码要在linux上)
  2. 我们需要在windows上编写代码(windows上也要能访问到代码)
  3. 开发的代码还要有代码服务器(代码管理,但是代码在linux上,在linux上用svn?)
  4. 要有正在监控集群的ambari,同时如何把开发成果发布上去(每次从开发机编译代码,然后scp过去?)

针对以上问题,想到了如下方案

5.ambari-admin 的编译

ambari-admin 使用的是angularjs + bower + gulp。

bower与npm的使用方式基本一样,angularjs也与emberjs风格类似。

  1. cd 到 /源码目录/ambari-admin/src/main/resources/ui/admin-web
  2. 编辑 .bowerrc 
    1. {
    2. "directory": "app/bower_components",
    3. "allow_root": true //允许以root用户执行bower命令。也可以在执行命令的时候通过参数设定 如:bower install --allow-root 不要复制这段注释
    4. }
  3. 安装npm依赖包,全局安装gulp、bower
    1. npm install
    2. npm install -g bower
    3. npm install -g gulp
  4. 安装bower的依赖包
    1. bower install
  5. 修改gulpfile.js文件 (添加了用gulp-webserver的启动web,关于gulp-webserver的使用可参考这里
    1. 'use strict';
    2.  
    3. var gulp = require('gulp');
    4. var $ = require('gulp-load-plugins')();
    5. var webserver = require('gulp-webserver');
    6.  
    7. var current = "test";
    8. var config = {
    9. start_task:{
    10. test:"webserver",
    11. build:"build"
    12. }
    13. };
    14.  
    15. gulp.task('webserver', function(){
    16. gulp.src('app').pipe(webserver({
    17. port: 8000,//端口
    18. host: '192.168.30.135',//域名
    19. livereload: true,//实时刷新代码。不用f5刷新
    20. directoryListing: true,
    21. //fallback:'index.html',
    22. open:true
    23. }))
    24. });
    25.  
    26. gulp.task('styles', function () {
    27. return gulp.src('app/styles/*.css')
    28. .pipe($.order([
    29. 'app/styles/main.css',
    30. 'app/styles/custom-admin-ui.css' // This should always be the last stylesheet. So it can be dropped and be effective on build time
    31. ], { base: './' }))
    32. .pipe($.concat('main.css'))
    33. .pipe($.autoprefixer('last 1 version'))
    34. .pipe(gulp.dest('.tmp/styles'))
    35. .pipe($.size());
    36. });
    37.  
    38. gulp.task('html', ['styles'], function () {
    39. var jsFilter = $.filter('**/*.js');
    40. var cssFilter = $.filter('**/*.css');
    41.  
    42. return gulp.src('app/*.html')
    43. .pipe($.plumber())
    44. .pipe($.useref.assets({searchPath: '{.tmp,app}'}))
    45. .pipe(jsFilter)
    46. .pipe(jsFilter.restore())
    47. .pipe(cssFilter)
    48. .pipe(cssFilter.restore())
    49. .pipe($.useref.restore())
    50. .pipe($.useref())
    51. .pipe(gulp.dest('dist'))
    52. .pipe($.size());
    53. });
    54.  
    55. gulp.task('views', function () {
    56. return gulp.src('app/views/**/*.html')
    57. .pipe(gulp.dest('dist/views'));
    58. });
    59.  
    60. gulp.task('images', function () {
    61. return gulp.src('app/img/**/*')
    62. .pipe(gulp.dest('dist/img'))
    63. .pipe($.size());
    64. });
    65.  
    66. gulp.task('fonts', function () {
    67. return $.bowerFiles()
    68. .pipe($.filter('**/*.{eot,svg,ttf,woff}'))
    69. .pipe($.flatten())
    70. .pipe(gulp.dest('dist/fonts'))
    71. .pipe($.size());
    72. });
    73.  
    74. gulp.task('extras', function () {
    75. return gulp.src(['app/*.*', '!app/*.html'], {dot: true})
    76. .pipe(gulp.dest('dist'));
    77. });
    78.  
    79. gulp.task('clean', function () {
    80. return gulp.src(['.tmp', 'dist'], {read: false}).pipe($.clean());
    81. });
    82.  
    83. gulp.task('build', ['html', 'views', 'images', 'fonts', 'extras']);
    84.  
    85. gulp.task('default', ['clean'], function () {
    86. gulp.start(config.start_task[current]);
    87. });
  6. 安装 gulp-webserver
    1. npm install gulp-webserver --save-dev
  7. 开始构建
    1. gulp
  8. 如果gulpfile.js中的current是'test',那么访问 http://<ip>:8000/index.html 即可进行独立编译开发
  9. 如果gulpfile.js中的current是'build',则需要与ambari的安装程序进行结合使用。(与ambari-web编译的步骤类似)
    1. cd /var/lib/ambari-server/resources/views/work
    2. mv ADMIN_VIEW\{version} /tmp
    3. ln -s /sourcepath/ambari/ambari-admin/src/main/resources/ui/admin-web/dist ADMIN_VIEW\{version}
    4. cp /tmp/ADMIN_VIEW\{version}/view.xml ADMIN_VIEW\{version}/
    5. ambari-server restart

    现在,我们更改源码的时候,在执行一下gulp,就可以在安装的ambari的GUI看到效果了(也可以再安装一个监听变化的gulp插件)

如果要国际化,只需要修改文件 app/scripts/i18n.config.js即可


插播1. 关于Brunch

Brunch自动化打包压缩编译工具。前端的工程化利器。

源码发生的改动会迅速反应到压缩结果。

官文请戳

  1. 确定安装好node.js
  2. 在全局安装brunch
    1. npm install -g brunch
  3. 在当前目录创建项目 hellobrunch
    1. brunch new hellobrunch -s es6

    创建成功后,当前目录会创建文件夹hellobrunch,生成一些结构和相关文件,并通过npm下载安装所有的依赖包(node_modules)

  4. cd到刚创建的project目录(即hellobrunch),进行编译。编译压缩合并的结果会出现在 public文件夹
    1. brunch build

    1. 其中:
      assets中的文件会被直接拷贝到public
      brunch-config存放的是压缩合并编译的规则
      package.json存放的是依赖包信息
      public/app.jspublic/app.css是根据合并规则生成的合并结果
      *.map是用于调试的代码映射信息
  5. 现在一个简单的webapp就成型了 接下来就是启动。启动后 如果源码发生变化  public中的内容也会自动跟进变化
    1. brunch watch --server

      brunch w -s
    2.  
    3. 其中brunch watch 是监听源码变动并自动编译到public文件夹 brunch --server则是启动web server

    可以看到服务的端口是3333,所以我们可以在浏览器上通过http://<ip>:3333 进行查看

  6. 安装插件 如jquery
    1. npm install --save jquery

    应用:(在app/initialize.js的最后 添加以下代码。保存后会发现  public/app.js中已经出现了这个代码片段)

    1. var $ = require('jquery');
    2. console.log('Tasty Brunch, just trying to use jQuery!', $('body'));
插播2:Ember.js

与angularjs类似的前端框架

官文请戳

ambari2.4.2 的ambari-web中使用的emberjs版本信息:

  1. // Version: v1.0.pre
  2. // Last commit: 7955b85 (2012-08-03 14:50:17 -0700)

Ambari一直使用的1.0pre 这是比2013年8月份1.0正式版还早一年的版本,现在官网是找不到这个版本的API的。

插播3:NPM

官文:https://docs.npmjs.com

NPM是nodejs包管理器

npm下载的时候默认是国外的资源  速度一般会比较慢。跟maven一样 我们可以使用淘宝的代理:

  1. 编辑~/.npmrc文件  (默认是在这个位置,如果没有的话就创建一个)

    1. vim ~/.npmrc
  2. 修改配置
    1. .........
    2.  
    3. registry = http://registry.npm.taobao.org #指定代理地址

要注意的是,有时候使用淘宝代理下载依赖会出现挂起的现象,临时禁掉代理(注释掉)就没问题了。

命令一览

  1. npm -v #查看npm版本
  1. npm config get prefix #查看全局安装目录

  2. #更改全局安装目录
    mkdir <somepath>/.npm-global #创建安装目录
    npm config set prefix '<somepath>/.npm-global' #指定新目录
    添加路径 #编辑~/.bash_profile export PATH=~/.npm-global/bin:$PATH
    source ~/.bash_profile #生效
  3. npm install -g <package-name> #全局模式安装模块
  4.  
  5. npm install --save <package-name> #安装模块并将信息写入package.config的dependencies
  1. npm install --save-dev <package-name> #安装模块并将信息写入package.config的devDependencies
  1. npm install <package-name> #在当前所在项目安装模块 (所以要进入项目目录)
  2.  
  3. npm install <package-name>@<version> #安装指定版本的模块 (不指定的话 默认获取最新版)
  4.  
  5. npm install <package-name>@">=v1 <v2" #指定版本范围
  6.  
  7. npm install #根据package.json 下载所有依赖包
  8.  
  9. npm uninstall [-g] <package name> [--save] #卸载本地[全局]模块,[package.json中删除依赖]
  10.  
  11. npm update [-g] <package name> #更新本地[全局]模块
  12.  
  13. npm outdated #展示项目中过时的包
    npm update #更新项目中所有包
  14.  
  15. var moduleA = require('<package-name>'); #使用模块(无法加载全局安装的模块)
  16.  
  17. npm ls [--depth=n] #列出当前安装的模块[深度(从0开始)]
  18.  
  19. 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:开发和测试时依赖的包

关于发布自己的包

  1. 创建项目。最好要有README.md文件,让用模块的人能更清晰的了解项目
  2. 要有npm的账号。到官网https://www.npmjs.com注册一个即可,重点是账号,密码,邮箱。也可以在命令行执行 npm adduser
  3. 在shell下登录npm。执行命令 npm login,输入上面提到的三个信息
  4. 到npm项目下 执行以下命令就OK了
    1. npm publish
      #如果已经发布过一次了 记得要更新版本号,否则会出现问题[You cannot publish over the previously published version x.x.x." : <projectname>
    1. #项目名称也不能跟其他人的重复,否则会出现问题[you do not have permission to publish "<projectname>". Are you logged in as the correct user? : <projectname> ]
  5. 更新模块并重新发布
    1. npm version patch #重新生成版本号 也可以编辑package.json中的version
    2.  
    3. 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安装

  1. npm install less -g #因为这是个公用的模块,所以要安装到全局

main.less

  1. @base: #f938ab;
  2.  
  3. .box-shadow(@style, @c) when (iscolor(@c)) {
  4. -webkit-box-shadow: @style @c;
  5. box-shadow: @style @c;
  6. }
  7. .box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) {
  8. .box-shadow(@style, rgba(0, 0, 0, @alpha));
  9. }
  10. .box {
  11. color: saturate(@base, 5%);
  12. border-color: lighten(@base, 30%);
  13. div { .box-shadow(0 0 5px, 30%) }
  14. }

使用命令编译

  1. lessc main.less main.css

结果:main.css

  1. .box {
  2. color: #fe33ac;
  3. border-color: #fdcdea;
  4. }
  5. .box div {
  6. -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
  7. box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
  8. }

其他内容

  1. ambari-agent在安装集群的时候会读取当前节点上的一个配置文件。路径是 /etc/ambari-agent/conf/ambari-agent.ini 内容如下

    1. [server]
    2. hostname=node1.somedomain #ambari-server的hostname。注意 如果server的hostname在安装的过程中有改动,一定要修改各个节点上该文件的这个设置,否则无法注册节点
    3. url_port=
    4. secured_url_port=
    5.  
    6. [agent]
    7. logdir=/var/log/ambari-agent
    8. piddir=/var/run/ambari-agent
    9. prefix=/var/lib/ambari-agent/data
    10. ;loglevel=(DEBUG/INFO)
    11. loglevel=INFO
    12. data_cleanup_interval=
    13. data_cleanup_max_age=
    14. data_cleanup_max_size_MB =
    15. ping_port=
    16. cache_dir=/var/lib/ambari-agent/cache
    17. tolerate_download_failures=true
    18. run_as_user=root
    19. parallel_execution=
    20. alert_grace_period=
    21. alert_kinit_timeout=
    22. system_resource_overrides=/etc/resource_overrides
    23. ; memory_threshold_soft_mb=
    24. ; memory_threshold_hard_mb=
    25.  
    26. [security]
    27. keysdir=/var/lib/ambari-agent/keys
    28. server_crt=ca.crt
    29. passphrase_env_var_name=AMBARI_PASSPHRASE
    30. ssl_verify_cert=
    31.  
    32. [services]
    33. pidLookupPath=/var/run/
    34.  
    35. [heartbeat]
    36. state_interval_seconds=
    37. dirs=/etc/hadoop,/etc/hadoop/conf,/etc/hbase,/etc/hcatalog,/etc/hive,/etc/oozie,
    38. /etc/sqoop,/etc/ganglia,
    39. /var/run/hadoop,/var/run/zookeeper,/var/run/hbase,/var/run/templeton,/var/run/oozie,
    40. /var/log/hadoop,/var/log/zookeeper,/var/log/hbase,/var/run/templeton,/var/log/hive
    41. ; - unlimited
    42. log_lines_count=
    43. idle_interval_min=
    44. idle_interval_max=
    45.  
    46. [logging]
    47. syslog_enabled=

参考:

ambari2.4.2在CentOS7上的二次开发的更多相关文章

  1. 踏上Revit二次开发之路 1 准备工作

    1 准备工作 工欲善其事,必先利其器.在正式开始之前,我觉得有必要先盘点一下需要准备些什么. 1.1 硬件设备 PC机一台(谢绝Apple). 配置不能太低,至少要i3以上的cpu.4g以上的内存和支 ...

  2. 踏上Revit二次开发之路 0 序

    0 序 近来,由于工作上的需要,开始自学Revit二次开发. Revit由欧特克公司专为BIM构建,是建筑业体系中使用最广泛的软件之一.借助欧特克公司在我国市场占有率方面的绝对优势,甚至给不少人带来& ...

  3. 本人亲测-SSM整合后的基础包(供新手学习使用,可在本基础上进行二次开发)

    本案例是在eclipse上进行开发的,解压后直接添加到eclipse即可.还需要自己配置maven环境.链接:https://pan.baidu.com/s/1siuvhCJASuZG_jqY5utP ...

  4. 踏上Revit二次开发之路 2 从“HelloWorld”入手

    2 从"HelloWorld"入手 在欧特克的官方网页上有个叫<My First Plug-in Training>的项目,号称可以让一个完全没有编程基础的人照着做出一 ...

  5. 踏上Revit二次开发之路 3 自己的工具按钮

    3 自己的工具按钮 上次的例子只能在"附加模块"→"外部工具"下运行,用作个人作品是没问题,如果打算搞个公司产品的话,估计BOSS是不会满意的.这次我来做一个直 ...

  6. ODI KM二次开发手册

    ODI KM二次开发手册   分类: ODI(16) 目录(?)[+] 1 引言 1.1 编写目的 本手册面向的读者对象为具备数据集成业务知识及对ODI操作了解的开发人员,作为其完成基于ODI基础上K ...

  7. YApi二次开发环境部署

    YApi 是去哪儿网大前端技术中心开源的一个可视化的接口管理平台.下面是在CentOS7下搭建二次开发环境步骤. 1 安装MongoDB 具体安装参考CentOS7安装MongoDB 2 安装Node ...

  8. OpenStack 实现技术分解 (5) 应用开发 — 使用 OpenStackClients 进行二次开发

    文件夹 文件夹 前文列表 參考阅读 前言 OpenStackClients 使用 OpenStackClients 获取 project_client object 的 demo 调用 project ...

  9. 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

随机推荐

  1. 《UNIX网络编程》 -- 第六章

    6.3 select 函数 给出描述符1.4.5而 maxfdp1 设置为6的原因: maxfdp1 是值-结果参数,这里传递的是描述符的范围,类似之前的 size_of(length).又因为描述符 ...

  2. coursera 《现代操作系统》 -- 第十周 文件系统(2)

    身份验证 Authentication 知道用户是谁.通过账号密码.Id 这样的识别出来. 访问控制 Permission 知道用户是谁后. 主动控制 记录用户ID和对应的访问权限 --> 记录 ...

  3. Time-series Storage Layer Time Series Databases 时间序列

    w 关于时间序列数据库的思考-CSDN.NET  http://www.csdn.net/article/2015-07-13/2825192  存储和处理时间序列数据(“Time Series Da ...

  4. Dev GridControl 小结3

    Dev GridControl 小结 时间 2014-03-26 19:24:01  CSDN博客 原文  http://blog.csdn.net/jiankunking/article/detai ...

  5. Windows常见窗口样式和控件风格

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用)WS_CHILDWINDOW 子窗口(不能与WS_PO ...

  6. Linux中的特殊字符

    单引号: 在单引号中所有的特殊字符都没有特殊含义 双引号: 在双引号中 $ ` \ 三个字符表示,调用变量的值.引用命令.转义,其他特殊字符均没有特殊含义 反引号: 用反引号括起来的内容被当作系统命令 ...

  7. php 计算器的例子

    php实现的计算器的例子,代码如下: <html>     <head>         <title>PHP实现简单计算器-www.jbxue.com</t ...

  8. java上机

    package wordcont; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayLi ...

  9. STM32 ~ CH340在STM32实现一键下载电路

    在做基于STM32的多功能MP3播放器的课题时,在程序下载这部分时借鉴了正点原子开发板上的一键下载电路,采用CH340G这款芯片设计. 在画PCB初期原理图部分,对采用CH340G设计的一键下载电路不 ...

  10. Windows&Linux常用命令笔记

    目录 linux windows Linux: 1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name &qu ...