这段时间一直在搞Hadoop集群迁移,最近Hadoop也没出什么大问题,就没更新运维系列。这次的运维系列也跟Hadoop自己的故障无关,主要是自动化运维。


不过我确实犯了一个严重的错误,在迁移新集群的时候,为了安装部署方便,我把hbase打成了rpm包的方式进行部署。在编写spec文件的时候,一个变量少写了一对花括号,结果把操作系统的文件给删掉了。而我恰恰是在新集群的生产环境下去编译rpm,后果就是那台服务器崩溃了。这是我这么多年第一次间接的执行了一下rm -rf /,尽管新集群还没开始正式上线跑,没造成任何影响,但是这个实在是太丢人了。以后坚决要在虚拟机里打rpm。


这次的运维记录系列主要是记录一下在Hadoop运维下,如何把Hadoop及周边生态软件打包成rpm和deb的方式,这个方式同样也可以用在其他软件的部署上。阅读这次的记录系列,你需要掌握以下技能:基本的rpm操作命令,hadoop生态系统的基本环境变量设置和源码知识。


以打包Hive为例,为啥不以打包hbase,因为hbase打包太过复杂,不仅需要修改官方的spec文件,还要修改hbase自身的源码。上来就说hbase打包rpm估计绝大多数人看不懂,而hive官方不提供spec文件,可以自己编写,hive本身的工作结构比较简单,也不需要修改源码,所以打包起来的spec文件也不复杂,复杂的以后慢慢记录。这个spec脚本是我自己写的,反正能用就行了。


Summary: Hive 0.10.0, Apache Hive, Rpm by Xianglei, include mysql jdbc connector and fixed hive-exec.jar for get_json_object judgement of quotation and double qoutation
Name: hive
Version: 0.10.0
Release: 1
License: Apache License 2.0
Group: System
Source: hive-0.10.0.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
Url: http://www.phphiveadmin.net
Packager: Xianglei
BuildArchitectures: noarch
Requires: jdk >= 1.6, hadoop
%define bin_dir /usr/bin
%define lib_dir /usr/lib
%define conf_dir /etc/hive
%define scripts_dir /usr/share/scripts
%description
Apache Hive phpHiveAdmin release
%prep
%setup -q -n %{name}-%{version}
%build
%install
%__rm -rf $RPM_BUILD_ROOT
%__mkdir -p $RPM_BUILD_ROOT/%{bin_dir}/
%__mkdir -p $RPM_BUILD_ROOT/%{lib_dir}/
%__mkdir -p $RPM_BUILD_ROOT/%{conf_dir}/
%__mkdir -p $RPM_BUILD_ROOT/%{scripts_dir}/
%__cp -rf bin/* $RPM_BUILD_ROOT/%{bin_dir}/
%__cp -f HivePlugin.jar $RPM_BUILD_ROOT/%{lib_dir}/
%__cp -rf lib/* $RPM_BUILD_ROOT/%{lib_dir}/
%__cp -rf conf/* $RPM_BUILD_ROOT/%{conf_dir}/
%__cp -rf scripts/* $RPM_BUILD_ROOT/%{scripts_dir}/
useradd -g hadoop hive
%files
%defattr(-,root,root)
%config(noreplace) %{conf_dir}/hive-site.xml
%config(noreplace) %{conf_dir}/hive-env.sh
%{bin_dir}/*
%{lib_dir}/*
%{conf_dir}/*
%{scripts_dir}/*
%clean
%__rm -rf $RPM_BUILD_ROOT


大概说一下,逐行解释太累了。

第一行是发行版的汇总说明,Hive-0.10.0,apache版本,鄙人打的包,在里面包含了mysql的jdbc驱动和修改后的hive-exec.jar,因为0.10.0版本严格了gen_json_object的语法,禁用了单引号的json格式,而我们好多数据里都是单引号的json,所以我让同事修改了这部分的java源码,自动适应单引号和双引号,重新打包成jar。

名称:Hive

版本:0.10.0

发行版本:1

Requires: jdk >= 1.6, hadoop

这段是定义你的软件依赖于其他什么软件,操作系统中必须同时存在jdk >= 1.6的版本和hadoop才可以安装这个hive,否则rpm -ivh的时候会出现faild dependence...什么玩意,当然,这些也都是需要用rpm安装的,官方都提供了。

然后是定义rpm安装完以后,hive相应的路径都在什么位置下,以及他们在spec文件中对应的变量。

bin_dir是spec中的变量,/usr/bin是rpm安装完以后,hive的bin文件夹路径。


%setup 是将hive源包就是上面指定的hive-0.10.0.tar.gz解压缩到rpmbuild/BUILD文件夹下。对于centos5来说。这个路径是/usr/src/redhat/BUILD,对于centos6来说,就是你当前工作目录的rpmbuild/BUILD。

%build对我们没用,hive已经是编译好的了,%build和%configure主要是针对从源码编译。

%install是具体的安装操作,都是些linux基本操作

最后是设置属性和清理BUILDROOT文件夹。

rpm的打包,网上有很多详细讲解的文章,这里就不详细说了。用rpmbuild即可,而对于debian和ubuntu这类系统,rpm可以直接转换成deb。


这个主要的思路是为了省事,我不想去逐台执行tar zxf xxxxx.tar.gz,然后再把配置文件逐台拷贝,直接一台配置好了,打包rpm,去每个服务器执行rpm -ivh xxxx.rpm,然后直接启动就好了。


在hbase打包的过程中,除了要修改官方提供的hbase.spec,还需要修改hbase本身的部分脚本源码,比如在spec中,指定了在安装完成后,需要执行一个sbin/update-hbase-env.sh,但这个脚本里面有些路径是写死的,有问题,要根据实际情况进行调整。比如我是用rpm安装的hadoop,HADOOP_HOME在/usr下。而脚本中寻找HADOOP_JAR是在$HADOOP_HOME/*.jar,这样肯定是找不到的。就需要修改update-hbase-env.sh中的HADOOP_JAR到$HADOOP_HOME/share/hadoop/*.jar,对zookeeper也是这样处理,这些是需要注意的。还有hbase命令,hbase-daemon.sh这些命令,也需要自己去修改脚本,以适应rpm打包后的路径要求。


不过需要了解的是,hadoop生态系统中,除了hadoop的hbase,其他软件都不提供spec文件,都得自己编写。而hadoop和hbase的spec,也不是完全好使,还得修改不少内容和源码才能用的起来。