Hadoop 安装、配置,以及问题的解决方法

        不少新手在刚接触Hadoop时,第一次安装、配置、部署、使用等方面或多或少的遇到过一些问题。本文既是自己的一个测试总结,也是为大多数新手提供一个参考(当然,网上以及有很多相关资料)。

 

硬件环境
共有2台机器,一台(作为masters),一台机器使用VM安装两套系统(作为
slaves),三系统均使用的Ubuntu 11.04 系统,Java使用的是jdk1.6.0_25。IP配置如下:

 

vm网络连接方式:均为‘桥接’

frank-1(主机名:即hostname):192.168.0.100   masters-----namenode
frank-2
(主机名:即hostname):192.168.0.102   slaves-------datanode

 

 

frank-3(主机名:即hostname):192.168.0.103   slaves-------datanode

 

关于linux下修改hostname主机名:

不能简单的使用:

$ hostname  主机名           // 这样设置只是临时修改,重启系统,会恢复为原主机名

网上说使用smit ---好像不是linux命令(没细查)

最简单最笨的方法--直接修改:/etc/hostname

 

另外有一点这里有一点需要强调的就是,务必要确保每台机器的主机名和IP地址之间能正确解析


 

一个很简单的测试办法就是ping一下主机名,比如在frank-1上ping frank-2,如果能ping通就OK!若不能正确解析,可以修改/etc/hosts文件,如果该台机器作Namenode用,则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名;如果该台机器作Datanode用,则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。

 

以本文为例,frank-1中的/etc/hosts文件看起来就应该是这样的:
127.0.0.0         localhost     localhost
192.168.0.100     frank-1        frank-1
192.168.0.102     frank-2        frank-2
192.168.0.103     frank-3        frank-3

frank-2中的/etc/hosts文件看起来就应该是这样的:
127.0.0.0         localhost    localhost
192.168.0.100     frank-1       frank-1
192.168.0.102     frank-2       frank-2

frank-3中的/etc/hosts文件看起来就应该是这样的:
127.0.0.0         localhost    localhost
192.168.0.100     frank-1       frank-1
192.168.0.103     frank-3       frank-3

 

      对于Hadoop来说,在HDFS看来,节点分为Namenode和Datanode,其中Namenode只有一个,Datanode可以是很多;在MapReduce看来,节点又分为Jobtracker和Tasktracker,其中Jobtracker只有一个,Tasktracker可以是很多。
我是将namenode和jobtracker部署在frank-1上,frank-2,frank-3作为datanode和tasktracker。当然你也可以将namenode,datanode,jobtracker,tasktracker全部部署在一台机器上.

 

所需软件:

jdk-6u25-linux-i586.bin

hadoop-0.21.0.tar.gz(和hbase整合时,要选择hadoop-0.20.x版本,经测试hadoop-0.20.0不可以,hadoop-0.20.1没测试,推荐使用hadoop-0.20.2,测试成功)

openssh

 

 

 

目录结构


由于Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐户
我的三台机器上是这样的:都有一个frank的帐户,主目录是/home/frank
Hadoop部署目录结构如下:/home/dbrg/HadoopInstall,所有的hadoop版本放在这个目录中。
将hadoop0.21.0压缩包解压至HadoopInstall中,为了方便以后升级,建议建立一个链接指向要使用的hadoop版本,不妨设为hadoop
$ ln  -s  hadoop0.21.0   hadoop
这样一来,所有的配置文件都在/hadoop/conf/目录中,所有执行程序都在/hadoop/bin目录中。
但是由于上述目录中hadoop的配置文件和hadoop的安装目录是放在一起的,这样一旦日后升级hadoop版本的时候所有的配置文件都会被覆盖,因此建议将配置文件与安装目录分离,一种比较好的方法就是建立一个存放配置文件的目录,/home/dbrg/HadoopInstall/hadoop-config/,然后将/hadoop/conf/目录中的core-site.xml,hdfs-site.xml,mapred-site.xml,
masters,slaves,hadoop_env.sh六个文件拷贝到hadoop-config/目录中,并指定环境变量$HADOOP_CONF_DIR指向该目录。环境变量在/home/frank/.bashrc和/etc/profile中设定。

 

综上所述,为了方便以后升级版本,我们需要做到配置文件与安装目录分离,并通过设定一个指向我们要使用的版本的hadoop的链接,这样可以减少我们对配置文件的维护。在下面的部分,你就会体会到这样分离以及链接的好处了。

 

 

SSH安装、设置


在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,故我们需要配置SSH使用无密码公钥认证的方式。
首先要保证每台机器上都装了SSH服务器,且都正常启动。实际中我们用的都是OpenSSH,这是SSH协议的一个免费开源实现。ssh安装很简单,$ sudo apt-get install openssh-server
以本文中的三台机器为例,现在frank-1是主节点,它需要主动发起SSH连接到frank-2和frank-3,对于SSH服务来说,frank-1就是SSH客户端,而frank-2、frank-3则是SSH服务端,因此在frank-2,frank-3上需要确定sshd服务已经启动(安装成功后,即启动,同时也是随系统的启动而启动的,可用$ netstat -ntl 查看网络状态,ssh默认端口22)。

简单的说,在frank-1上需要生成一个密钥对,即一个私钥,一个公钥。将公钥拷贝到frank-2,frank-3上,这样,比如当frank-1向frank-2发起ssh连接的时候,frank-2上就会生成一个随机数并用frank-1的公钥对这个随机数进行加密,并发送给frank-1;frank-1收到这个加密的数以后用私钥进行解密,并将解密后的数发送回frank-2,frank-2确认解密的数无误后就允许frank-1进行连接了。这就完成了一次公钥认证过程。

对于本文中的三台机器,首先在frank-1上生成无需登录密码的密钥对:
$ssh-keygen  -t  dsa -P '' -f ~/.ssh/id_dsa
这个命令将为frank-1上的用户frank生成其密钥对。生成的密钥对id_dsa,id_dsa.pub,默认存储在/home/frank/.ssh目录下。然后将id_dsa.pub的内容追加到每个机器(也包括本机)的/home/frank/.ssh/authorized_keys文件中,即下面的操作:

对于frank-1
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

$ scp ~/.ssh/id_dsa.pub frank-3:/home/frank

对于frank-2(frank-3同frank-2的方法)
$ mkdir .ssh  --------------------先进入frank-2,创建.ssh文件夹
$ scp ~/.ssh/authorized_keys frank-2:/home/frank/.ssh
此处的scp就是通过ssh进行远程copy,此处需要输入远程主机的密码,即frank-2机器上frank帐户的密码,当然,你也可以用其他方法将authorized_keys文件拷贝到其他机器上

接着,在三台机器上都需要对sshd服务进行配置(其实是可以不用配置的,完成了上面的那些操作了以后SSH就已经可以工作了),在三台机器上修改文件/etc/ssh/sshd_config
#去除密码认证前面的#
PasswordAuthentication  no
AuthorizedKeyFile   %h/.ssh/authorized_keys

至此各个机器上的SSH配置已经完成,可以测试一下了,比如frank-1向frank-2发起ssh连接
$ ssh  frank-2
如果ssh配置好了,就会出现以下提示信息
The authenticity of host [frank-2] can't be established. 
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52. 
Are you sure you want to continue connecting (yes/no)?
OpenSSH告诉你它不知道这台主机,但是你不用担心这个问题,因为你是第一次登录这台主机。键入“yes”。这将把这台主机的“识别标记”加到“~/.ssh/know_hosts”文件中。第二次访问这台主机的时候就不会再显示这条提示信息了。
然后你会发现不需要输入密码就可以建立ssh连接了,恭喜你,配置成功了
不过,别忘了测试本机ssh  frank-1

 

JDK的安装很简单就不在叙述了,关键是不要忘记配置环境变量:/etc/profile (namenode datanode都需配置jdk)

 

#set java environment

export JAVA_HOME=/home/frank/JavaInstall/jdk

export JRE_HOME=$JAVA_HOME/jre

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

export PATH=.:$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

 

 

在----umask 022 之上

 

 

Hadoop环境变量 (namenode datanode都需配置)

 


/etc/profile:增加:

#set hadoop environment

export HADOOP_HOME=/home/frank/HadoopInstall/hadoop

export PATH=.:$HADOOP_HOME/bin:$PATH

 

/home/frank/HadoopInstall/hadoop-conf/hadoop_env.sh

去掉#,并修改JAVA_HOME

 

# The java implementation to use.  Required.

export JAVA_HOME=/home/frank/JavaInstall/jdk

 

 

 

 

Hadoop配置文件

 

只有namenode需要修改masters和slaves(本文即frank-1):

 

masters:

frank-1

 

slaves:

frank-2

frank-3

 

 

core-site.xml,hdfs-site.xml,mapred-site.xml等其他文件可根据具体需求进行配置,下面是我的简单配置

core-site.xml配置如下:

 

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

<!-- Put site-specific property overrides in this file. -->

 

<configuration>

<!--   global properties-->

<property>

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

<value>/home/frank/HadoopInstall/tmp</value>

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

</property>

<!--   file system properties-->

<property>

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

<value>hdfs://frank-1:9000</value>

<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>

</property>

</configuration>

 

 

hdfs-site.xml配置如下:

 

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

<!-- Put site-specific property overrides in this file. -->

 

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

<description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.</description>

</property>

</configuration>

 

 

mapred-site.xml配置如下:

 

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

<!-- Put site-specific property overrides in this file. -->

 

<configuration>

<property>

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

<value>frank-1:9001</value>

<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.</description>

</property>

</configuration>

 

 

现在需要将hadoop部署到其他的机器上,保证目录结构一致
$ scp  -r  /home/frank/HadoopInstall  frank-2:/home/frank/
$ scp  -r  /home/frank/HadoopInstall  frank-3:/home/frank/

拷贝之后需要把配置好的masters和slaves修改过来,另外删除hadoop,重新建立链接


至此,可以说,Hadoop已经在各个机器上部署完毕了下面就让我们开始启动Hadoop吧

启动Hadoop
启动之前,我们先要格式化namenode,先进入~/HadoopInstall/hadoop目录,执行下面的命令
$ hadoop  namenode  -format

在这里,简单启动所有守护
$ start-all.sh

同样,如果要停止hadoop,则
$ stop-all.sh

 

HDFS操作

查看现有文件
$ hadoop  dfs  -ls /
其他操作可参考网上资料

 

 

 

 

 

你可能感兴趣的:(java,mapreduce,hadoop,测试,ssh,解密)