Ubuntu下编译和部署Hadoop 2.2

  在Ubuntu下编译各种项目总会遇到不少的问题,尤其是缺少各种依赖,好友都推荐用CentOS。不过个人对Ubuntu这个品牌以及背后的Canonical公司比较喜欢,加之用过其桌面版多年,算是熟悉了。这里记录下编译和部署Hadoop 2.2的一些过程,以供快速参考。

0、虚拟机环境准备
  宿主机器配置i7 8g内存,我这里用VMware虚拟了4台Ubuntu Server 64bit,每台机器分配1g内存。主机名分别为h0,h1,h2,h3,配置好每台机器的/etc/hosts,将各主机名映射到私有ip。

127.0.0.1       localhost
192.168.10.33   h0
192.168.10.176  h1
192.168.10.207  h2
192.168.10.90   h3

  配置免密码ssh登录,这里只将h0作为namenode和secondarynamenode,h1~3作为datanode,应此只需要配置h0到h1~3的免密码登录,以及各虚拟机自己的免密码登录。

ssh-keygen -t rsa
cat id_rsa.pub >> authorized_keys
scp authorized_keys ubuntu@h1:~/.ssh/authorized_keys_from_h0
scp authorized_keys ubuntu@h2:~/.ssh/authorized_keys_from_h0
scp authorized_keys ubuntu@h3:~/.ssh/authorized_keys_from_h0

1、安装编译环境
  由于Hadoop官方提供的只有32位环境,所以需要自己编译64位的,以下步骤仅在h0上操作。首先准备编译需要的组件,这里随系统决定所需。当然Java运行环境也是必须的,apt-get安装OpenJDK即可。

sudo apt-get install subversion maven cmake libssl-dev

2、签出Hadoop 2.2源代码

svn checkout http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.2.0/

3、添加jetty-util依赖
  编辑vim hadoop-common-project/hadoop-auth/pom.xml,添加:

<dependency>
   <groupId>org.mortbay.jetty</groupId>
   <artifactId>jetty-util</artifactId>
   <scope>test</scope>
</dependency>

4、编译安装protobuf 2.5

wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2
tar jxvf protobuf-2.5.0.tar.bz2
cd protobuf-2.5.0/
./configure
make
sudo make install

添加环境变量,或者重启一次

export LD_LIBRARY_PATH=/usr/local/lib/

5、执行编译
首次执行:

mvn package -Pdist,native -DskipTests -Dtar

如果有错误,根据错误原因处理,一般都是缺少依赖。装好后重复执行即可,也可以添加-e -X参数,打印更多的日志来帮助查找错误。成功后可以看到以下的输出:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 46:40.307s
[INFO] Finished at: Fri Jan 17 17:32:23 CST 2014
[INFO] Final Memory: 66M/188M
[INFO] ------------------------------------------------------------------------

6、安装配置
  建立以下文件夹:

~/hadoop/dfs/data
~/hadoop/dfs/name
~/hadoop/temp

  编译好的Hadoop可以在release-2.2.0/hadoop-dist/target/hadoop-2.2.0/找到,我这里将其复制到~/hadoop下,切换到目录:

cd ~/hadoop/hadoop-2.2.0/etc/hadoop/

配置以下几个文件,如果没有的,可以在复制改名对应的template。

hadoop-env.sh
修改JAVA_HOME 为系统Java Home环境,apt-get安装的OpenJDK一般是这个路径。

export JAVA_HOME=/usr/lib/jvm/default-java

core-site.xml
ubuntu为运行Hadoop的用户。

<configuration>
     <property>
          <name>fs.defaultFS</name>
          <value>hdfs://h0:9000</value>
     </property>
     <property>
          <name>io.file.buffer.size</name>
          <value>131072</value>
     </property>
     <property>
          <name>hadoop.tmp.dir</name>
          <value>file:/home/ubuntu/hadoop/temp</value>
          <description>Abase for other temporary directories.</description>
     </property>
     <property>
          <name>hadoop.proxyuser.ubuntu.hosts</name>
          <value>*</value>
     </property>
     <property>
          <name>hadoop.proxyuser.ubuntu.groups</name>
          <value>*</value>
     </property>
</configuration>

hdfs-site.xml

<configuration>
     <property>
          <name>dfs.namenode.secondary.http-address</name>
          <value>h0:9001</value>
     </property>
     <property>
          <name>dfs.namenode.name.dir</name>
          <value>file:/home/ubuntu/hadoop/dfs/name</value>
     </property>
     <property>
          <name>dfs.datanode.data.dir</name>
          <value>file:/home/ubuntu/hadoop/dfs/data</value>
     </property>
     <property>
          <name>dfs.replication</name>
          <value>3</value>
     </property>
     <property>
          <name>dfs.webhdfs.enabled</name>
          <value>true</value>
     </property>
</configuration>

mapred-site.xml

<configuration>
     <property>
          <name>dfs.namenode.secondary.http-address</name>
          <value>h0:9001</value>
     </property>
     <property>
          <name>dfs.namenode.name.dir</name>
          <value>file:/home/ubuntu/hadoop/dfs/name</value>
     </property>
     <property>
          <name>dfs.datanode.data.dir</name>
          <value>file:/home/ubuntu/hadoop/dfs/data</value>
     </property>
     <property>
          <name>dfs.replication</name>
          <value>3</value>
     </property>
     <property>
          <name>dfs.webhdfs.enabled</name>
          <value>true</value>
     </property>
</configuration>

yarn-site.xml

<configuration>
     <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
     </property>
     <property>
          <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
          <value>org.apache.hadoop.mapred.ShuffleHandler</value>
     </property>
     <property>
          <name>yarn.resourcemanager.address</name>
          <value>h0:8032</value>
     </property>
     <property>
          <name>yarn.resourcemanager.scheduler.address</name>
          <value>h0:8030</value>
     </property>
     <property>
          <name>yarn.resourcemanager.resource-tracker.address</name>
          <value>h0:8031</value>
     </property>
     <property>
          <name>yarn.resourcemanager.admin.address</name>
          <value>h0:8033</value>
     </property>
     <property>
          <name>yarn.resourcemanager.webapp.address</name>
          <value>h0:8088</value>
     </property>
</configuration>

slaves
定义节点的主机名:

h1
h2
h3

  至此,配置就算完成了,将Hadoop目录复制到另外三台机器上,放相同的目录下。

scp -r hadoop-2.2.0/ h1:~/hadoop/
scp -r hadoop-2.2.0/ h2:~/hadoop/
scp -r hadoop-2.2.0/ h3:~/hadoop/

7、启动Hadoop

在h0上执行:

./sbin/start-dfs.sh
./sbin/start-yarn.sh

  用jps可以查看Java进程所对应的服务。

ubuntu@h0:~/hadoop/hadoop-2.2.0$ jps
1902 NameNode
1604 SecondaryNameNode
2076 ResourceManager

ubuntu@h1:~$ jps
1354 DataNode
1123 NodeManager

ubuntu@h2:~$ jps
1146 DataNode
1378 NodeManager

ubuntu@h3:~$ jps
1139 DataNode
1371 NodeManager

  到此,namenode和datanode都启动完毕。