声明:博主写了一些Ambari系列文章,可以在历史文章中查看。

一、Ambari-web二次开发

ambari-web可以单独编译,用来修改ambari UI页面。采用ember.js(版本:v1.0.pre)作为前端MVC框架和NodeJS相关工具,用handlebars.js作为页面渲染引擎,在CSS/HTML方面还用了Bootstrap(v2.1.1)框架。

Ambari-web目录结构:

目录或文件 描述
app/ 主要应用程序代码。包括Ember中的view、templates、controllers、models、routes
config.coffee brunch应用程序生成器的配置文件
package.json npm包管理配置文件
test/ 测试文件
vendor/ Javascript库和样式表适用第三方库。

1.准备工作:

  • npm安装:推荐v4.5.0
  • brunch安装:推荐v1.7.20
  • npm、brunch安装地址:点击这里

2.安装npm依赖包

1
2
3
# 切换到ambari-web目录下
cd /opt/ambari-web
npm install

3.编译源码

1
2
3
brunch build
# or实时编译
brunch w

4.替换文件,建立软连接

1
2
3
4
5
cd /usr/lib/ambari-server
# 备份web目录,也可将web目录改名
mv web web_bak
# 建立软链接 使ambari-server可以访问到我们修改编译后的代码
ln -s /opt/ambari-web/public web

5.重启服务

1
ambari-server restart

6.打开浏览器,输入ip:8080访问页面。

二、Ambari-admin二次开发

ambari-admin也可进行单独编译,使用的是angularjs + bower + gulp。

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

1.准备工作

1
2
3
4
5
6
# 切换到admin-web目录下 
cd 到 /opt/ambari-admin/src/main/resources/ui/admin-web
# 全局安装gulp,bower
npm install -g bower
npm install -g gulp
yum -y install git

2.编辑.bowerrc文件

1
2
3
4
{
"directory": "app/bower_components",
"allow_root": true //允许以root用户执行bower命令。也可以在执行命令的时候通过参数设定 如:bower install --allow-root 不要复制这段注释
}

3.安装npm、bower依赖包,

1
2
npm install
bower install

4.修改gulpfile.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
'use strict';

var gulp = require('gulp');
var $ = require('gulp-load-plugins')();

var current = "build";
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('xml', function () {
return gulp.src('app/*.xml')
.pipe(gulp.dest('dist'));
});

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', 'xml', 'fonts', 'extras']);

gulp.task('default', ['clean'], function () {
gulp.start(config.start_task[current]);
});

5.开始编译

1
gulp

6.建立软连接

1
2
3
4
cd /var/lib/ambari-server/resources/views/work
mv ADMIN_VIEW\{2.6.1.0} /tmp
ln -s /opt/ambari-admin/src/main/resources/ui/admin-web/dist ADMIN_VIEW\{2.6.1.0}
cp /tmp/ADMIN_VIEW\{2.6.1.0}/view.xml ADMIN_VIEW\{2.6.1.0}/

7.重启服务

1
ambari-server restart

8.Tip

有时候页面内容不全或无法访问,实际上是创建的软连接ADMIN_VIEW{version}缺少东西,将之前备份的ADMIN_VIEW{version}文件内容替换进去,然后再执行ambari-server restart,gulp,刷新页面应该就成功了。

现在,我们更改源码的时候,再执行一下gulp,就可以看到效果了。修改完一次,手动执行一次gulp

三、Ambari整体编译

1.准备工作

防火墙关闭
selinux关闭 getenforce获取其当前状态
jdk 1.8
node.js 4.5.0
maven 3.3.9
python(虚机自带) ≥2.6
python-devel yum install python-devel 2.7.5-90
rpm-build yum install rpm-build 4.11.3-45
gcc-c++ yum install gcc-c++ 0:4.8.5-44.el7
brunch 1.7.20
bower 1.8.12
gulp
git
  • 禁用selinux
1
2
vim /etc/selinux/config
修改SELINUX=disabled
  • 禁用防火墙
  1. 查看防火墙状态

    1
    systemctl status firewalld
  2. 查看开机是否启动防火墙服务

    1
    systemctl is-enabled firewalld
  3. 关闭防火墙并使其开机自关闭

    1
    2
    systemctl stop firewalld
    systemctl disable firewalld
  • java、nodejs、brunch、maven安装地址

  • 安装python-devel、rpm-build、gcc-c++

    1
    2
    3
    yum install -y python-devel
    yum install -y rpm-build
    yum install -y gcc-c++
  • 查看python版本

    1
    python -V

    如果版本为2.6.x的,可忽略;

    如果版本是2.7.x的,需要进行操作ln -s /usr/bin/python2.7 /usr/bin/python2.6

2.提前下载一些文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

mkdir -p /tmp/phantomjs
wget -O /tmp/phantomjs/phantomjs-1.9.7-linux-x86_64.tar.bz2 http://p7rtzbtjz.bkt.clouddn.com/phantomjs-1.9.7-linux-x86_64.tar.bz2
wget -O /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 http://p7rtzbtjz.bkt.clouddn.com/phantomjs-2.1.1-linux-x86_64.tar.bz2

3.整体编译

  • 给ambari源码赋予777权限 && cd 到ambari的根目录
  • 给ambari源码打上版本号
1
2
3
4
5
mvn versions:set -DnewVersion=2.6.1.0.0  #虽然官网说是4位,但实际上这里如果不是5位后面会有不少麻烦
# 进入到amabri-metrics根目录,给ambari-metrics打上版本号
pushd ambari-metrics
mvn versions:set -DnewVersion=2.6.1.0.0
popd
  • 编译ambari
1
2
mvn -B -X -e install package rpm:rpm -DnewVersion=2.6.1.0.0 -DskipTests -Dpython.ver="python >= 2.6" -Drat.skip=true -Preplaceurl
# 若编译中断出现错误,解决完错误继续执行上述命令即可。若重新给ambari打版本号,则需要mvn clean下,切记在clean前将tar包备份。

四、安装samba

samba可以使linux上的代码作为网络驱动器,映射到windows上。

Samba安装配置:点击这里

五、使用编译后的rpm包安装

1
yum install -y /lyz/2.6.1/ambari-server/target/rpm/ambari-server/RPMS/x86_64/ambari-server-2.6.1.0-0.x86_64.rpm

值得一提的是,开发ambari后台的时候,就经常会使用到整体编译,编译成功之后,再进行rpm包安装。为了提高工作效率,使用脚本来实现自动化安装。

ambariSetup.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/expect
# excute interactive command
spawn echo "*******************start ambari-server setup*****************"
set timeout 300
set javahome /usr/java/jdk1.8.0_151
set mysqlport 3309
set databasename ambari
set username root
set dbpass root123
spawn ambari-server setup
expect {
"continue*" { send "y\r"; exp_continue}
"daemon*" { send "y\r" }
}
expect "daemon*"
send "root\r"
expect "*?"
send "y\r"
expect "choice (*"
send "3\r"
expect "JAVA_HOME:"
send "$javahome\r"
expect "LZO packages*"
send "n\r"
expect "configuration*"
send "y\r"
expect "choice (*"
send "3\r"
expect "Hostname*"
send "\r"
expect "Port (*"
send "$mysqlport\r"
expect "Database name (*"
send "$databasename\r"
expect "Username (*"
send "$username\r"
expect "Database Password (*"
send "$dbpass\r"
expect "password*"
send "$dbpass\r"
expect "properties*"
send "y\r"
expect eof

reSetupAmbariServer.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# 判断该脚本所在的绝对路径
bin=`dirname $0`
bin=`cd "$bin";pwd`
# 停止ambari-server服务
echo -e "\e[0;32;1m====停止ambari-server服务====\e[0m"
ambari-server stop
# 卸载当前ambari-server服务
echo -e "\e[0;32;1m====卸载当前ambari-server服务====\e[0m"
yum remove -y ambari-server
# 安装新的ambari-server
echo -e "\e[0;32;1m====安装新的ambari-server====\e[0m"
yum install -y /lyz/0626/ambari-server-2.6.1.0-0.x86_64.rpm
# ambari安装
echo -e "\e[0;32;1m====start ambari-server setup====\e[0m"
chmod +x $bin/ambariSetup.sh
expect $bin/ambariSetup.sh
# 向配置文件内添加jdbc.path
echo -e "\e[0;32;1m====向配置文件内添加jdbc.path====\e[0m"
echo 'server.jdbc.driver.path=/usr/share/java/mysql-connector-java-5.1.45-bin.jar'>>/etc/ambari-server/conf/ambari.properties
# 安装ambari
ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java-5.1.45-bin.jar
# 启动ambri-server
echo -e "\e[0;32;1m====启动ambri-server====\e[0m"
ambari-server start

步骤:

1.执行ambari整体编译。

2.执行脚本,脚本须在同一目录下。