前言:若是想安裝到CentOS7,就必定要將源碼在CentOS7上編譯,而後安裝,不然可能會出現各類問題css
wiki:https://cwiki.apache.org/confluence/display/AMBARI/Ambarihtml
爲了方便了解結構樹,使用了一個在線腦圖來展現。 前端
查看完整java
軟件版本(要嚴格參照這個要求)node
注:上表中操做系統是CentOS7,不是CentOS6.5python
由於須要用到nodejs、python等編譯環境,而且nodejs有些庫文件是須要C++ 、ruby、python等一些語言進行編譯,在windows上處理會比較複雜,因此選擇在Linux上搭建編譯環境,並使用samba協議共享Linux中的文件,在linux上運行測試,在windows下進行代碼修改。jquery
#先檢查是否已經安裝 #rpm -qa | grep samba #未安裝的話 執行安裝命令 yum install samba
service smb restart
useradd samba
smbpasswd -a samba
setenforce 0
[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前面有兩個反斜線linux
注:若是隻想簡單的改改頁面,而後本身使用的話,徹底不必總體編譯,只須要編譯ambari-web和ambari-admin,而後把編譯結果替換到ambari安裝後的某些目錄便可。c++
下面安裝的軟件,不管是yum,仍是tar包,都要選擇指定版本。git
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"
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>
#檢測 rpm -qa | grep gcc-c++ #安裝 yum -y install gcc-c++
#我這裏下載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 -qa | grep rpm-build #檢驗是否存在 yum install rpm-build
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
...... export NODE_HOME="/opt/node-v0.10.44-linux-x64" export PATH=$PATH:$NODE_HOME/bin
使之生效
source /etc/profile
node -v
npm -v
npm install -g brunch@1.7.20 brunch #檢測
yum install git git --version #檢測
使用git下載ambari代碼。以前從官網下載的代碼,出現各類問題,改從這個git下載的代碼後就徹底沒問題了。 下載命令:
git clone https://git-wip-us.apache.org/repos/asf/ambari.git
總體編譯須要下載不少的maven依賴包,ambari-web和ambari-admin也須要經過npm和bower下載大量依賴包
因此推薦先進行ambari-web編譯和ambari-admin編譯;而maven的依賴包,能夠選擇安裝的時候不執行clean命令
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源碼編譯版本號問題
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
mvn -B -e clean install package rpm:rpm -DnewVersion=2.4.2.0.0 -DskipTests -Dpython.ver="python >= 2.6" -Preplaceurl #版本號 與上一步一致
編譯過程當中若是看到停在了下載文件的位置,能夠中斷編譯,直接去下載文件並放到指定位置
brunch watch --server
順利的話 打開網址 http://<ambari-webserver ip>:3333 就能看到成果了
參考:https://cwiki.apache.org/confluence/display/AMBARI/Ambari+Development
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 } }) });
多想一點:
針對以上問題,想到了以下方案
ambari-admin 使用的是angularjs + bower + gulp。
bower與npm的使用方式基本同樣,angularjs也與emberjs風格相似。
{ "directory": "app/bower_components", "allow_root": true //容許以root用戶執行bower命令。也能夠在執行命令的時候經過參數設定 如:bower install --allow-root 不要複製這段註釋 }
npm install npm install -g bower npm install -g gulp
bower install
'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]); });
npm install gulp-webserver --save-dev
gulp
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便可
Brunch自動化打包壓縮編譯工具。前端的工程化利器。
源碼發生的改動會迅速反應到壓縮結果。
官文請戳
npm install -g brunch
brunch new hellobrunch -s es6
建立成功後,當前目錄會建立文件夾hellobrunch,生成一些結構和相關文件,並經過npm下載安裝全部的依賴包(node_modules)
brunch build
其中:
assets中的文件會被直接拷貝到public
brunch-config存放的是壓縮合並編譯的規則
package.json存放的是依賴包信息
public/app.js及public/app.css是根據合併規則生成的合併結果
*.map是用於調試的代碼映射信息
brunch watch --server
或
brunch w -s
其中brunch watch 是監聽源碼變更並自動編譯到public文件夾 而brunch --server則是啓動web server
能夠看到服務的端口是3333,因此咱們能夠在瀏覽器上經過http://<ip>:3333 進行查看
npm install --save jquery
應用:(在app/initialize.js的最後 添加如下代碼。保存後會發現 public/app.js中已經出現了這個代碼片斷)
var $ = require('jquery'); console.log('Tasty Brunch, just trying to use jQuery!', $('body'));
與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的。
NPM是nodejs包管理器
npm下載的時候默認是國外的資源 速度通常會比較慢。跟maven同樣 咱們可使用淘寶的代理:
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 )
結構介紹
關於發佈本身的包
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
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); }
[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
參考: