写在前面:

最近需要定制的原因,需要将原来Cloudera版本的Hadoop更改为Apache版本的Hadoop和Oozie,对官方文档的学习,发现Hadoop1.1.1和Oozie3.3.2的组合比较好,所以,经过几天的搭建,终于成功了,现在把心得分享出来,希望给需要的朋友帮助。如果需要转载请注明出处,谢谢!

1.Apache版本HADOOP云计算平台环境搭建

1.1 集群环境介绍

       Hadoop集群环境包含1台机器,在每台机器上运行4台虚拟机,是一个典型的主从式(Master-Slaves)结构。集群包含一个主控节点(Master)和4个从属节点(Slave)。在主从式结构中,主节点一般负责集群管理、任务调度和负载平衡等,从节点则执行来自主节点的计算和存储任务。

       该集群环境具体的软硬件和网络配置情况见表3.1。

表3.1 集群详细软硬件和网络配置

序号

主机名

网络地址

操作系统

1

Master

192.168.137.2

Centos6.4-x64

2

Slave1

192.168.137.3

Centos6.4-x64

3

Slave2

192.168.137.4

Centos6.4-x64

1.2 Hadoop环境搭建

1.2.1 Apache Hadoop简介

       Hadoop是Apache开源组织的一个分布式计算框架,可以在大量廉价硬件设备组成的集群上运行应用程序,并为应用程序提供了一组稳定可靠的接口,旨在构建一个具有高可靠性和良好扩展性的分布式系统。随着云计算技术的逐渐流行与普及,该项目被越来越多的个人和企业所运用。Hadoop项目的核心是HDFS、MapReduce和HBase,它们分别是Google云计算核心技术GFS(Google File System)、MapReduce和Bigtable的开源实现。

1.2.2 Apache Hadoop安装准备

1、hosts的配置

       这一步是必须的,因为这里需要对使用环境的user做具体的分配和指定。

2、更改hosts

       首先需要设定IP地址:

#ifconfig                       //查询现在的ip地址

       然后通过设置VPN,来设置各机器的IP地址,具体过程这里就不详述了。

现在需要配置每台电脑的hosts名称,使用下列指令:

#vim /etc/sysconfig/network

       在其中添加这样的内容:

HOSTNAME=Master.Hadoop

(备注:Slave机器则改为相应的Slave1.Hadoop…….)

3、配置hosts文件

#vim /etc/hosts

       在其中添加下面几行内容:

192.168.137.2 Master.Hadoop

192.168.137.3 Slave1.Hadoop

192.168.137.4 Slave2.Hadoop


 4、验证设置是否启用

       我们在Master.Hadoop对机器为"Slave1.Hadoop"的主机名进行ping通测试,看是否能测试成功。

Master.Hadoop$ping192.168.137.3

(备注:对于其他机器之间的测试同理)

5、添加一个用户

#adduser hadoop

#passwd hadoop                 //设置hadoop的密码

1.3.3 ssh无密码验证设置(以下设置全部在hadoop用户下进行)

       Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。

1、安装和启动ssh

       可以通过下面命令查看是否已经安装ssh和rsync,显示如下:

$rpm –qa | grep openssh

$rpm –qa | grep rsync

2、Master机器上生成密码对

       在Master节点上执行以下命令:

$ssh-keygen –t rsa –P ''

(备注:这里的“’”是单引号,上面指令最后使用了两个单引号)

       这条命令是生成其无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa和id_rsa.pub,默认存储在"~/.ssh"目录下。

       查看"/usr/hadoop/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。使用下面的指令:

$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

       在验证前,需要做两件事儿。第一件事儿是修改文件"authorized_keys"权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用RSA功能),另一件事儿是用root用户设置"/etc/ssh/sshd_config"的内容。使其无密码登录有效。

3、修改文件"authorized_keys"的权限

       使用下列指令:

$chmod 600~/.ssh/authorized_keys

4、设置SSH配置

       用root用户登录服务器修改SSH配置文件"/etc/ssh/sshd_config"的下列内容,去掉下面几句话前面的注释符“#”。

RSAAuthentication yes # 启用 RSA 认证

PubkeyAuthentication yes # 启用公钥私钥配对认证方式

AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径


设置完之后记得重启SSH服务,才能使刚才设置有效。

$service sshd restart

       退出root登录,使用hadoop普通用户验证是否成功。

#ssh localhost

5、在Slave机器上生成密码对

       在Slave1.Hadoop上执行下列指令:

$ssh-keygen –t –rsa –P ''

       在Slave1.Hadoop机器中生成~/.ssh文件。然后在把本机生成的密码对加载到本机上的authorized_keys

$cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys

       然后更改authorized_keys文件的权限。

$chmod 600~/.ssh/authorized_keys

(备注:如果有多个Slave,对多个Slave进行相同的操作即可,Slave2.Hadoop,Slave2.Hadoop……)

6、在Master和Slave之间追加授权密码

Master.Hadoop$cd ~/.ssh

Master.Hadoop$scp./id_rsa.pub hadoop@192.168.137.3:~/

Slave1.Hadoop$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

Slave1.Hadoop$scp ~/.ssh/id_rsa.pub hadoop@192.168.137.4:~/

Master.Hadoop$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

(备注:如果有多个Slave,对多个Slave和Master之间进行相同的操作即可)

       用root用户登录服务器修改SSH配置文件"/etc/ssh/sshd_config"的下列内容,去掉下面几句话前面的注释符“#”。

RSAAuthentication yes # 启用 RSA 认证

PubkeyAuthentication yes # 启用公钥私钥配对认证方式

AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)


  设置完之后记得重启SSH服务,才能使刚才设置有效。

$service sshd restart

   退出root登录,使用hadoop普通用户验证是否成功。

#ssh localhost

7、验证ssh无密码登陆设置成功

Master.Hadoop$ssh Slave1.Hadoop

       这时候如果不需要输入Slave1.Hadoop主机的登陆密码,就说明设置成功了,否则,说明前面的设置出错了,请细心检查下。

       同理,再输入下列指令,检验Slave对Master的设置是否成功:

Slave1.Hadoop$sshMaster.Hadoop

1.3.4 JAVA环境安装(所有主机均要安装,并且以下操作在root用户下执行)

1、下载jdk

       从oracle官网下载jdk1.7.0_21,放到根目录下/。

2、安装jdk

       执行下列指令:

#cd /usr

#mkdir java

#cp / jdk-7u21-linux-x64.rpm/usr/java/

#cd /usr/java

#rpm –ivh jdk-7u21-linux-x64.rpm

       然后会进行rpm安装的过程。

3、设置java环境变量

       编辑"/etc/profile"文件,在后面添加Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"内容。

首先,编辑"/etc/profile"文件

#vim /etc/profile

其次,添加Java环境变量

       在"/etc/profile"文件的尾部添加以下内容:

# set java environment

export JAVA_HOME=/usr/java/jdk1.7.0_21

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin


       保存并退出,执行下面命令使其配置立即生效。

 #source /etc/profile

4、验证安装和配置是否成功

       输入下列指令:

#java -version

       然后写一个小的JAVA程序,编译执行下是否正确执行,如果可以,则配置成功,否则,JAVA的配置过程可能有问题,需要检查。

1.3.5 Hadoop集群安装

  所有的机器上都要安装hadoop,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装和配置hadoop需要以"root"的身份进行。

       用root用户登录"Master.Hadoop"机器,查看我们用SSH上传至"/"目录下的"hadoop-1.1.1.tar.gz",把该文件复制到“/usr/”目录下。

1、进入"/usr/"目录下,用下面命令把"hadoop-1.1.1.tar.gz "进行解压,并将其命名为"hadoop",把该文件夹的读权限分配给普通用户hadoop,然后删除" hadoop-1.1.1.tar.gz"安装包。

#cd /usr

#tar -zxvf hadoop-1.1.1.tar.gz

#mv hadoop-1.1.1 hadoop

#chown -R hadoop:hadoop hadoop

#rm -r hadoop-1.1.1.tar.gz                 

2、把Hadoop的安装路径添加到"/etc/profile"中,修改"/etc/profile"文件(配置java环境变量的文件),将以下语句添加到末尾,并使其有效:

3、在"/usr/hadoop"创建"tmp"文件夹

#mkdir /usr/hadoop/tmp

4、配置"/etc/profile"

#vim /etc/profile

# set hadoop path

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH:$HADOOP_HOME/bin


重启"/etc/profile"

#source /etc/profile

5、配置hadoop

需要配置hadoop的文件,首先,配置hadoop-env.sh

  该"hadoop-env.sh"文件位于"/usr/hadoop/conf"目录下。

在文件的末尾添加下面内容。

# set java environment

export JAVA_HOME=/usr/java/jdk1.7.0_21


       Hadoop配置文件在conf目录下,之前的版本的配置文件主要是Hadoop-default.xml和Hadoop-site.xml。由于Hadoop发展迅速,代码量急剧增加,代码开发分为了core,hdfs和map/reduce三部分,配置文件也被分成了三个core-site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。

其次是配置core-site.xml文件,修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。

<configuration>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/usr/hadoop/tmp</value>

(备注:请先在 /usr/hadoop 目录下建立 tmp 文件夹)

        <description>A base for other temporary directories.</description>

    </property>

<!-- file system properties -->

    <property>

        <name>fs.default.name</name>

        <value>hdfs://192.168.137.2:9000</value>

    </property>

</configuration>


(备注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被干掉,必须重新执行format才行,否则会出错。)

       然后是配置hdfs-site.xml文件,修改Hadoop中HDFS的配置,配置的备份方式默认为1。

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>1</value>

        (备注:replication 是数据副本数量,默认为3salve少于3台就会报错)

    </property>

<configuration>


       最后,配置mapred-site.xml文件,修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。

<configuration>

    <property>

        <name>mapred.job.tracker</name>

        <value>http://192.168.137.2:9001</value>

    </property>

</configuration>


       下面需要配置masters文件和slaves文件,对于masters文件,去掉"localhost",改成本集群中主节点的IP地址:192.168.137.2;对于slaves文件(Master主机特有),去掉"localhost",加入集群中所有Slave机器的IP,也是每行一个。

192.168.137.3

192.168.137.4


       现在在Master机器上的Hadoop配置就结束了,剩下的就是配置Slave机器上的Hadoop。将 Master上配置好的hadoop所在文件夹"/usr/hadoop"复制到所有的Slave的"/usr"目录下(实际上Slave机器上的slavers文件是不必要的, 复制了也没问题)。用下面命令格式进行。(备注:此时用户可以为hadoop也可以为root)

#scp -r /usr/hadoop root@192.168.137.3:/usr/

#scp -r /usr/hadoop root@192.168.137.4:/usr/

       当然不管是用户root还是hadoop,虽然Master机器上的"/usr/hadoop"文件夹用户hadoop有权限,但是Slave1上的hadoop用户却没有"/usr"权限,所以没有创建文件夹的权限。所以无论是哪个用户进行拷贝,右面都是"root@机器IP"格式。因为我们只是建立起了hadoop用户的SSH无密码连接,所以用root进行"scp"时,扔提示让你输入"Slave1.Hadoop"服务器用户root的密码。

       hadoop文件夹确实已经复制了,但是我们发现hadoop权限是root,所以我们现在要给"Slave1.Hadoop"服务器上的用户hadoop添加对"/usr/hadoop"读权限。以root用户登录"Slave1.Hadoop",执行下面命令。

#chown -R hadoop:hadoop hadoop

接着在"Slave1 .Hadoop"上修改"/etc/profile"文件(配置 java 环境变量的文件),将以下语句添加到末尾,并使其有效(source /etc/profile):

# set hadoop environment

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH :$HADOOP_HOME/bin


1.3.6 启动及验证

1、格式化HDFS文件系统

  在"Master.Hadoop"上使用普通用户hadoop进行操作。(备注:只需一次,下次启动不再需要格式化,只需 start-all.sh)

$hadoop namenode –format

2、启动hadoop

  在启动前关闭集群中所有机器的防火墙,不然会出现datanode开后又自动关闭。

 $service iptables stop

   使用下面命令启动。

 $start-all.sh

       启动 hadoop成功后,在 Master 中的 tmp 文件夹中生成了 dfs 文件夹,在Slave 中的 tmp 文件夹中均生成了 dfs 文件夹和 mapred 文件夹。

       到此为止,hadoop云计算平台配置完毕。


 

2.OOZIE的安装配置

2.1 OOZIE简介

       oozie是一种Java Web应用程序,它运行在Javaservlet容器——即Tomcat中,并使用数据库来存储以下内容:

•     工作流定义

•     当前运行的工作流实例,包括实例的状态和变量

       Oozie工作流是放置在控制依赖DAG(有向无环图 DirectAcyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。我们会使用hPDL(一种XML流程定义语言)来描述这个图。

       hPDL是一种很简洁的语言,只会使用少数流程控制和动作节点。控制节点会定义执行的流程,并包含工作流的起点和终点(start、end和fail节点)以及控制工作流执行路径的机制(decision、fork和join节点)。动作节点是一些机制,通过它们工作流会触发执行计算或者处理任务。Oozie为以下类型的动作提供支持:Hadoop map-reduce、Hadoop文件系统、Pig、Java和Oozie的子工作流(SSH动作已经从Oozie schema 0.2之后的版本中移除了)。

       所有由动作节点触发的计算和处理任务都不在Oozie之中——它们是由Hadoop的Map/Reduce框架执行的。这种方法让Oozie可以支持现存的Hadoop用于负载平衡、灾难恢复的机制。这些任务主要是异步执行的(只有文件系统动作例外,它是同步处理的)。这意味着对于大多数工作流动作触发的计算或处理任务的类型来说,在工作流操作转换到工作流的下一个节点之前都需要等待,直到计算或处理任务结束了之后才能够继续。Oozie可以通过两种不同的方式来检测计算或处理任务是否完成,也就是回调和轮询。当Oozie启动了计算或处理任务的时候,它会为任务提供唯一的回调URL,然后任务会在完成的时候发送通知给特定的URL。在任务无法触发回调URL的情况下(可能是因为任何原因,比方说网络闪断),或者当任务的类型无法在完成时触发回调URL的时候,Oozie有一种机制,可以对计算或处理任务进行轮询,从而保证能够完成任务。

       Oozie工作流可以参数化(在工作流定义中使用像${inputDir}之类的变量)。在提交工作流操作的时候,我们必须提供参数值。如果经过合适地参数化(比方说,使用不同的输出目录),那么多个同样的工作流操作可以并发。

       一些工作流是根据需要触发的,但是大多数情况下,我们有必要基于一定的时间段和(或)数据可用性和(或)外部事件来运行它们。Oozie协调系统(Coordinatorsystem)让用户可以基于这些参数来定义工作流执行计划。Oozie协调程序让我们可以以谓词的方式对工作流执行触发器进行建模,那可以指向数据、事件和(或)外部事件。工作流作业会在谓词得到满足的时候启动。

经常我们还需要连接定时运行、但时间间隔不同的工作流操作。多个随后运行的工作流的输出会成为下一个工作流的输入。把这些工作流连接在一起,会让系统把它作为数据应用的管道来引用。Oozie协调程序支持创建这样的数据应用管道。

2.2 OOZIE安装具体过程

1、先下载Oozie,下载后解压oozie-3.3.2.tar.gz到根目录下:

获取文件“oozie-3.3.2”,放到目录“/”下。并重命名为oozie。

这个时候执行命令:

#./bin/mkdistro.sh–DskipTests

2、下载ext-2.2.zip,下载文件“ext-2.2”,放到目录“/”下。

3、设置HADOOP的配置文件

在/usr/hadoop/conf/core-site.xml文件中加入下列内容:

<!-- OOZIE -->

<property>

<name>hadoop.proxyuser.hadoop.hosts</name>

<value>192.168.137.2</value>

</property>

<property>

<name>hadoop.proxyuser.hadoop.groups</name>

<value>hadoop</value>

</property>


修改完成后,新建一个文件夹/usr/oozie/libext/将ext-2.2.zip放到该目录下。

4、将oozie文件夹复制到/usr/目录下面。

5、拷贝HADOOP的JAR包到oozie。

将./hadooplibs/hadoop-1/文件夹下的所有JAR包复制到刚才新建的libext文件夹下。

6、拷贝ext-2.2.zip文件到./webapp/下并且解压到该目录下。

7、创建文件oozie.war。运行命令:

/usr/oozie/bin/oozie-setup.sh-extjs /oozie/webapp/src/main/webapp/ext-2.2.zip

显示:Specified Oozie WAR '/usr/oozie/oozie.war'already contains ExtJS library files,即可继续。

8、设置OOZIE的配置文件。

       修改文件/usr/oozie/conf/oozie-site.xml,找到下面这部分内容:

<property>

        <name>oozie.service.JPAService.create.db.schema</name>

        <value>false</value>

        <description>

            Creates Oozie DB.

            If set to true, it creates the DB schema if it does not exist. If the DB schema exists is a NOP.

            If set to false, it does not create the DB schema. If the DB schema does not exist it fails start up.

        </description>

</property>


将其中的false改成true。

 9、加载数据库。

使用命令:

#/usr/oozie/bin/ooziedb.sh create -sqlfile oozie.sql –run

之后出现:

  setting CATALINA_OPTS="$CATALINA_OPTS -Xmx1024m"

Validate DB Connection

DONE

Check DB schema does not exist

DONE

Check OOZIE_SYS table does not exist

DONE

Create SQL schema

DONE

Create OOZIE_SYS table

DONE

Oozie DB has been created for Oozie version '3.3.2'

The SQL commands have been written to: oozie.sql


即表示创建成功。这时候可以看到一个oozie.sql文件。

10、加入原Hadoop的包,这里需要拷贝hadoop-core-1.1.1.jar和commons-configuration-1.6.jar这两个JAR包到目录:./oozie-server/webapps/oozie/WEB-INF/lib/下。

11、拷贝oozie.war文件到./oozie-server/webapps/下。

12、更改权限,此时需要更改oozie文件夹及其全部子文件的权限:

#chown -R hadoop:hadoop oozie

13、开启Oozie,使用命令:

$./bin/oozied.sh run

14、查看web控制台

输入命令:

$oozie admin -oozie http://192.168.137.2:11000/oozie -status

当看到结果:

System mode: NORMAL

则表示已经成功,通过浏览器输入http://192.168.137.2:11000/oozie就能看到Oozie的管理界面。如下图2.1所示:


图2.1 Oozie管理界面


转自:http://blog.csdn.net/zwenjun/article/details/11831643

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐