Hadoop单机伪分布式部署

由于没有那么多机器,就在自己的虚拟机上部署一套Hadoop集群,这被称作伪分布式集群,但是不管怎么样,这里主要记录部署hadoop的过程以及遇到的问题,然后再使用一个简单的程序测试环境。

1、安装JAVA、下载hadoop程序包,配置hadoop的环境变量。

这里要设置JAVA_HOME等于java的安装目录,将hadoop程序所在的目录添加到系统的PATH环境变量下,这样可以直接在shell中启动hadoop命令。这里使用的hadoop的2.6.0版本。

2、设置SSH

之所以需要安装ssh是因为Hadoop需要通过ssh方式启动slave列表中的各台机器上的守护进程,虽然我们这里称作伪分布式的方式安装,但是hadoop还是按照集群的方式启动的,只不过集群中的所有机器都是在同一台机器上罢了。ssh默认端口为22,可以查看端口22判断是否已经安装启动了。然后为了能够让hadoop通过ssh启动程序,需要免密码使用ssh,如果不进行设置,直接使用

ssh user@127.0.0.1(要确保本机已经安装了ssh服务器和客户端)会出现这样的情况:
linuxidc@linuxidc:~/workplace$ ssh linuxidc@127.0.0.1
linuxidc@127.0.0.1's password:
Welcome to Ubuntu 13.10 (GNU/Linux 3.11.0-12-generic i686)

* Documentation:  https://help.ubuntu.com/

Last login: Mon Jan 19 15:03:01 2015 from localhost

也就是每次都需要你输入该用户的密码,为了配置免密码登录,需要执行如下的命令:

ssh-keygen  -t  dsa -P '' -f  ~/.ssh/id_dsa
cat  ~/.ssh/id_dsa.pub  >>  ~/.ssh/authorized_keys

第一个命令是生成一个密钥,-t表示迷药类型,这里使用dsa认证的方式,-P表示密码,这里使用的是空,-f表示生成密钥文件的地址;第二个目录是将生成的密钥的公钥拷贝成当前主机已授权的key文件,这样通过ssh命令连接主机就不需要密码了。可以再次通过上面的ssh命令检验。
3、配置hadoop的环境配置文件etc/hadoop/hadoop-env.sh
这个是hadoop的环境配置文件,需要配置JAVA_HOME的目录,确保该目录是java的安装目录。
4、配置etc/hadoop/core-site.xml配置文件
 
<configuration>

<property>
          <name>hadoop.tmp.dir</name>
          <value>/home/linuxidc/workplace/hadoop/data</value>
    </property>

<property>
          <name>fs.default.name</name>
          <value>hdfs://主机地址:9000</value>
    </property>

</configuration>

5、配置MapReduce配置文件etc/hadoop/mapred-site.xml

<configuration>
    <property>
          <name>mapred.job.tracker</name>
          <value>主机地址:9001</value>
    </property>
</configuration>

6、配置HDFS配置文件etc/hadoop/hdfs-site.xml

<configuration>
    <property>
          <name>dfs.replication</name>
          <value>1</value>
    </property>

<property>
          <name>dfs.namenode.name.dir</name>
          <value>/home/linuxidc/workplace/hadoop/hdfs/name</value>
    </property>

<property>
          <name>dfs.datannode.data.dir</name>
          <value>/home/linuxidc/workplace/hadoop/hdfs/data</value>
    </property>
</configuration>

7、格式化hdfs文件系统然后启动所有的模块
hadoop namenode -format         
该命令格式化HDFS文件系统。
然后执行./sbin/start-all.sh,这时候会出现问题,如下:
 
Starting namenodes on [Java HotSpot(TM) Client VM warning: You have loaded library /home/linuxidc/workplace/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
 
查看发现这是由于平台的不兼容导致的,我下载的hadoop是64位的版本,而自己的机器却是32位的,所以这时候需要手动编译hadoop。
 
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ file  /home/linuxidc/workplace/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0
/home/linuxidc/workplace/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x2c42803ac908d7781a6c66a16723dd8ebb7dd76e, not stripped
linuxidc@linuxidc-VirtualBox:~/workplace/hadoop/hadoop-2.6.0$ uname -a
Linux linuxidc.netease.com 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:12:00 UTC 2013 i686 i686 i686 GNU/Linux
 
但是maven依赖于protobuf,所以还需要首先下载并安装protobuf,protobuf的版本必须是2.5.0版本或者以上,否则也会编译不通过。maven的版本还需要3.0.2以上,可以下载一个maven的执行文件来构建。
构建过程中出现这样的问题:
 
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (make) on project hadoop-common: An Ant BuildException has occured: exec returned: 1
[ERROR] around Ant part ...<exec dir="/home/linuxidc/workplace/hadoop/hadoop-2.6.0-src/hadoop-common-project/hadoop-common/target/native" executable="cmake" failonerror="true">... @ 4:152 in /home/linuxidc/workplace/hadoop/hadoop-2.6.0-src/hadoop-common-project/hadoop-common/target/antrun/build-main.xml
 
这时候需要安装下面两个库,如下:
 
sudo apt-get install zlib1g-dev
sudo apt-get install libssl-dev
 
又出现问题了:org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-hdfs-httpfs: An Ant BuildException has occured: exec returned: 2
google了一把发现是因为没有安装forrest而导致的,也不知道这个是干什么的,直接去官网()上下载一个最新的版本,是绿色安装的(难道这些就是java的优势吗?以前下载c++实现的程序都是需要三步安装)。然后设置环境变量FORREST_HOME和PATH中加入forrest的bin目录,重新编译。
 
加入forrest之后仍然还出现这个错误,于是决心不编译这个模块了,找到hadoop-hdfs-project/pom.xml文件,将<!--module>hadoop-hdfs-httpfs</module-->给注释掉,重新编译就能够顺利编译完成,不知道对hadoop有没有什么影响。
 
这时候 已经编译好的hadoop-2.6.0在hadoop-2.6.0-src/hadoop-dist/target/目录下,这时候我们使用这个覆盖之前下载的hadoop目录就可以了。因为这是一个新编译出来的程序,所以需要再次执行hadoop namenode -format 来初始化HDFS,否则还是会出现错误。
再次执行start-dfs.sh出现如下的错误:
 
Starting namenodes on [linuxidc.netease.com]
linuxidc.netease.com: Error: JAVA_HOME is not set and could not be found.
localhost: Error: JAVA_HOME is not set and could not be found.
Starting secondary namenodes [0.0.0.0]
0.0.0.0: Error: JAVA_HOME is not set and could not be found.
 
我觉得这是由于在ssh登录到新的终端之后JAVA_HOME在新的会话里面不再有效(如果是在shell下通过export设置的就只在当前回会话有效,如果希望对于当前用户的所有会话都有效则需要在~/.bashrc文件里面添加export JAVA_HOME=XXX,如果希望对于所有的用户都有效,需要在/etc/profile文件的末未添加export)。但是这样操作之后通过ssh建立新的会话,查看JAVA_HOME变量确定是有效值,但是仍然会出现这样的错误,于是就不得不使出狠招了。在libexec/hadoop-config.sh文件里面找到"Error: JAVA_HOME is not set and could not be found."这一行,可以看出这一行是没有找到JAVA_HOME所设置的目录而打印的,那么就在这一个if判断之前加上export JAVA_HOME=xxx语句,就可以确定在这里能够找到JAVA_HOME的值了,无论在哪个终端上都不会出错,但是如果在多个机器上,每个机器的JAVA_HOME的路径设置不一样的话,这样需要一个个的修改,的确是一个问题。
 
再次执行./sbin/start-dfs.sh和./sbin/start-yarn.sh两个脚本,就能够把hadoop需要的进程全部启动了,通过jps查看有下面的进程:
 
linuxidc@linuxidc:~/workplace/hadoop$ jps
8329 SecondaryNameNode
8507 ResourceManager
8660 Jps
8143 DataNode
8023 NameNode
8628 NodeManager
 
好了,到这里hadoop单机版就编译部署完成了,其实集群的部署应该也是差不多的,通过ssh的方式也很容易在多个机器中部署。然后使用一个简单的测试程序跑一下吧。
 
在学习新语言的时候都是使用”hello world“作为入门,而单词统计的程序就是mapReduce的”hello world“,下面我们随便创造一个英文单词组成的文件,然后统计这个文件中每一个单词出现的次数。下面是hadoop官方文档的介绍页:
 
Apache Hadoop 2.6.0

Apache Hadoop 2.6.0 is a minor release in the 2.x.y release line, building upon the previous stable release 2.4.1.

Here is a short overview of the major features and improvements.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b209e11a120092c3163dda522e7751a9.html