ambari2.4.2在CentOS7上的二次開發


前言:如果想安裝到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
    #先檢查是否已經安裝
    #rpm -qa | grep samba
    
    #未安裝的話  執行安裝命令
    yum install samba

     

  2. 重啟 SMB服務
    service smb restart

     

  3. 在 Linux 上建立samba用戶
    useradd samba

     

  4. 創建 Smb 用戶,此用戶必須是 Linux 上已經建立的,輸入密碼,完成即可。
    smbpasswd -a samba

     

  5. 關閉防火牆
  6. 確保setlinux關閉
    setenforce 0

     

  7. 修改/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-webambari-admin,然后把編譯結果替換到ambari安裝后的某些目錄即可。

下面安裝的軟件,無論是yum,還是tar包,都要選擇指定版本。

  1.  安裝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"

     

  2. 安裝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>

     

  3. 安裝g++
    #檢測
    rpm -qa | grep gcc-c++
     
    #安裝
    yum -y install gcc-c++

     

  4. 安裝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

      

  5. 安裝rpm-build
    rpm -qa | grep rpm-build #檢驗是否存在
     
    yum install rpm-build

     

  6. 安裝Nodejs  版本:v0.10.44
    1. 下載安裝包 版本地址
    2. wget http://nodejs.org/dist/v0.10.44/node-v0.10.44-linux-x64.tar.gz
    3. 解壓
      tar zxvf node-v0.10.44-linux-x64.tar.gz

       

    4. 設置 /etc/profile 中的環境變量 
      ......
      export NODE_HOME="/opt/node-v0.10.44-linux-x64"
      export PATH=$PATH:$NODE_HOME/bin

       使之生效

      source /etc/profile
    5. 查看安裝情況
      node -v
      npm -v
  7. 安裝Brunch
    npm install -g brunch@1.7.20
    brunch  #檢測

     

  8. 安裝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命令

 

  1. cd 到ambari的主目錄
  2. ambari打上版本號
    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. 因為編譯過程中會下載很多很多文件,並且有些文件下載特別慢,所以我們需要在編譯前把這些文件先提前下載好,並且放到指定位置,這樣編譯起來就快多了
    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

     

  4. 編譯ambari
    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目錄下 執行命令
    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
        }
    })
});

 

 

 多想一點:

  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 
    {
        "directory": "app/bower_components",
        "allow_root": true //允許以root用戶執行bower命令。也可以在執行命令的時候通過參數設定 如:bower install --allow-root 不要復制這段注釋
    }

     

  3. 安裝npm依賴包,全局安裝gulp、bower
    npm install
    npm install -g bower
    npm install -g gulp

     

  4. 安裝bower的依賴包
    bower install

     

  5. 修改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]);
    });

     

  6. 安裝 gulp-webserver
    npm install gulp-webserver --save-dev

     

  7. 開始構建
    gulp

     

  8. 如果gulpfile.js中的current是'test',那么訪問 http://<ip>:8000/index.html 即可進行獨立編譯開發
  9. 如果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自動化打包壓縮編譯工具。前端的工程化利器。

源碼發生的改動會迅速反應到壓縮結果。

官文請戳

  1. 確定安裝好node.js
  2. 在全局安裝brunch
    npm install -g brunch

     

  3. 在當前目錄創建項目 hellobrunch
    brunch new hellobrunch -s es6

     創建成功后,當前目錄會創建文件夾hellobrunch,生成一些結構和相關文件,並通過npm下載安裝所有的依賴包(node_modules)

     

  4. cd到剛創建的project目錄(即hellobrunch),進行編譯。編譯壓縮合並的結果會出現在 public文件夾
    brunch build

     

    其中:
    assets中的文件會被直接拷貝到public
    brunch-config存放的是壓縮合並編譯的規則
    package.json存放的是依賴包信息
    public/app.js及public/app.css是根據合並規則生成的合並結果
    *.map是用於調試的代碼映射信息

     

  5. 現在一個簡單的webapp就成型了 接下來就是啟動。啟動后 如果源碼發生變化  public中的內容也會自動跟進變化
    brunch watch --server

    brunch w -s

    其中brunch watch 是監聽源碼變動並自動編譯到public文件夾 而brunch --server則是啟動web server

    可以看到服務的端口是3333,所以我們可以在瀏覽器上通過http://<ip>:3333 進行查看

     

  6. 安裝插件 如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

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

NPM是nodejs包管理器

npm下載的時候默認是國外的資源  速度一般會比較慢。跟maven一樣 我們可以使用淘寶的代理:

  1. 編輯~/.npmrc文件  (默認是在這個位置,如果沒有的話就創建一個)
    vim ~/.npmrc

     

  2. 修改配置
    .........
    
    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:開發和測試時依賴的包

 

關於發布自己的包

  1. 創建項目。最好要有README.md文件,讓用模塊的人能更清晰的了解項目
  2. 要有npm的賬號。到官網https://www.npmjs.com注冊一個即可,重點是賬號,密碼,郵箱。也可以在命令行執行 npm adduser
  3. 在shell下登錄npm。執行命令 npm login,輸入上面提到的三個信息
  4. 到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> ]

     

  5. 更新模塊並重新發布
    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);
}

 

 

 


 其他內容

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

     

 

 

 

參考:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM