hadoop 安装 和 ssh 服务

来源:互联网 发布:墨墨背单词 知乎 编辑:程序博客网 时间:2024/04/30 02:34

1.hadoop安装

  目标是为构造一个运行在多台机器上的Hadoop集群提供指南,因此所述的安装均面向多台机器。在单台机器上安装Hadoop非常简单,在获取Hadoop之后(通常是一个压缩包),解压缩到特定目录即可。由于Hadoop是通过ssh服务对多个节点进行管理和同步,因此要求这些节点具有一个相同的帐号,而且Hadoop的部署目录结构都相同,为实现此要求,我们按照以下方式安装Hadoop:
(1) 在每一台机器上创建一个相同的帐号(以下以mapred为例进行说明),这个帐号的默认主目录相同,如/home/mapred/;为了便于用mapred帐号修改系统设置和访问系统文件,我们推荐把mapred也设为sudoers(有root权限的用户),具体做法是用已有的sudoer登录系统,执行sudo visudo –f /etc/sudoers,并在此文件中添加以下一行:
mapred ALL=(ALL) ALL
保存并退出即可;
(2) 以mapred帐号登录到每个节点上,在mapred主目录中为Hadoop创建目录hadoopinstall,即/home/mapred/hadoopinstall,所有的hadoop版本放在这个目录中;
(3) 把hadoop-0.17.1压缩包解压到hadoopinstall中,为了便于以后升级,一种值得推荐的做法是建议一个链接指向当前所用的Hadoop版本,不妨就设为hadoop;
(4) 按照以上步骤完成设置之后,所有的配置文件都在/hadoop/conf/目录中,所有的可执行程序都在/hadoop/bin目录中,但是hadoop的配置文件和hadoop的安装目录是放在一起的,这样一旦日后升级,所有的配置文件都会被覆盖,因此建议将配置文件与安装目录分离,一种比较好的方法就是建立一个存放配置文件的目录,例如/home/dbrg/HadoopInstall/hadoop-config/,然后将/hadoop/conf/目录中的hadoop_site.xml,masters,slaves,hadoop_env.sh四个文件拷贝到hadoop-config/目录中;
(5) 设置环境变量$HADOOP_CONF_DIR指向存放配置文件的目录,为保证用户每次登录到系统中都自动设置此环境变量,需要在/home/mapred/.bashrc和/etc/profile两个文件中都添加一行命令:
export HADOOP_CONF_DIR=/home/mapred/hadoopinstall/hadoop_config/
这种配置方法使得hadoop的配置文件与安装目录分离,并通过设定一个链接指向当前使用的Hadoop版本,大大降低了人工部署和维护Hadoop的复杂度和工作量;


2.配置Hadoop

        Hadoop是master/slave结构,在一个Hadoop集群中,有一个Namenode(相当于master)和若干个Datanode(相当于slave),其中Namenode通过ssh服务来启动和停止各个Datanode上的各种守护进程。因此ssh的设置是Hadoop部署中很重要的一环。显然,不可能要求用户每次在节点之间执行指令时输入密码,因此我们需要配置ssh使之采用无密码公钥认证的方式来登录。

首先保证所有的机器都安装了ssh服务器,并启动了sshd服务。以前述Hadoop集群为例,我们设定node1为主节点(Namenode),node2和node3是从节点(Datanode),node1要调度node2和node3上的程序,需要主动发起ssh连接到node2和node3。对于ssh服务而言,node1是客户端,node2和node3是服务端。要实现无密码公钥认证,需要在node1
上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到node2和node3上。当node1通过ssh连接node2时,node2就会生成一个随机数并用node1的公钥对随机数进行加密,并发送给node1。node1收到加密数之后再用私钥进行解密,并将解密数回传给node2,node2确认解密数无误之后就允许node1进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。

具体步骤是:

(1) 在node1上生成密码对,执行以下命令:
mapred@node1:~$ ssh-keygen -t rsa
此命令为node1上的用户mapred生成密钥对,当询问保存路径时回车采用默认路径即可,当提示要为密钥输入passphrase是回车采用空密码。此命令执行完毕生成一对密钥文件id_rsa(私钥)和id_rsa.pub(公钥),默认存储在/home/mapred/.ssh下;
(2) 把生成的id_ras.pub文件改名为authorized_keys,并复制到每台机器(包括本机)的/home/mapred/.ssh/下。如果机器上已经有authorized_keys文件,则把id_rsa.pub中的内容直接复制到authorized_keys文件尾;如果不存在,则直接复制即可。假设各台机器上均没有authorized_keys,则对于node1,执行
cp /home/mapred/.ssh/id_rsa.pub /home/mapred/.ssh/authorized_keys
对于node2(node3与node2相同),执行
mapred@node2:~$mkdir /home/mapred/.ssh
mapred@node1:~/.ssh$scp authorized_keys node2:/home/mapred/.ssh/
(3) 修改authorized_keys的访问权限,只有所有者对authorized_keys有读写权限,其他人不允许有写权限,否则ssh不能正确工作。在node2和node3上执行以下命令:
mapred@node2:~/.ssh$chmod 644 authorized_keys
以上命令执行完之后,.ssh目录的内容应该如下图2所示(读者所用的帐号和节点名可能会有所不同):

node1,node2,node3上的.ssh目录都应该与此相似。
(4) 对sshd服务进行配置,去除密码验证,方法是修改每台机器的/etc/ssh/sshd_config文件,把对应的项设置成如下所示的形式:
#去除密码认证
PasswordAuthentication no
AuthorizedKeysFile .ssh/authorized_keys
重启sshd服务:
sudo /etc/init.d/ssh restart
(5) 测试ssh连接,例如node1向node2发起ssh连接:
ssh node2
如果ssh配置正确,将会出现如图3所示的提示信息:


敲入yes并回车即可。此后在从node1向node2 发起ssh连接时将不再需要输入任何信息。从每个节点向包括它自己在内的所有节点进行以上ssh连接测试,并在出现以上提示信息时输入yes,这样Hadoop通过ssh在各个节点之间调度时将不会出现要求用户输入的情形。


完成ssh服务配置之后,需要修改Hadoop的相关配置文件,具体步骤如下:
(1) 打开node1节点的/home/mapred/hadoopinstall/hadoop-config/hadoop_env.sh,修改其中的JAVA_HOME和HADOOP_HOME变量,其中JAVA_HOME是Java的根目录(即使用Java安装包安装好Java之后bin目录的父目录),HADOOP_HOME是Hadoop的根目录(即bin目录的父目录,如果不做手工修改,那么这也是默认设置),在我们的例子中采用如下设置:

#安装的Java版本为1.6
export JAVA_HOME=/home/mapred/jre1.6.0_07
export HADOOP_HOME= /home/mapred/hadoopinstall/hadoop

(2) 修改node1节点的/home/mapred/hadoopinstall/hadoop-config/masters,指定Namenode主机名,在我们的例子中,masters文件的内容是
node1
(3) 修改node1节点的/home/mapred/hadoopinstall/hadoop-config/slaves,指定Datanode从机名,在我们的例子中,slaves文件的内容是
node2
node3
(4) 修改node1节点的/home/mapred/hadoopinstall/hadoop-config/hadoop-site.xml文件,这个文件指定了Hadoop的一些运行时属性,是非常关键的配置文件,但需要注意,同目录下的hadoop-default.xml不允许直接修改。通常情况下,hadoop-site.xml按照下图所示进行设置即可。其中各个属性的含义均在<description>字段中进行说明。如果需要了解更多属性的含义及其属性取值范围,请参考hadoop/docs下的cluster_setup.pdf文件。
hadoop-site.xml配置示例:

<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!--Site-specific property overrides in this file. --><configuration><property><name>fs.default.name</name><value>hdfs://node1:9000</value><description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description></property><property><name>mapred.job.tracker</name><value>hdfs://node1:19001</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><property><name>hadoop.tmp.dir</name><value>/home/mapred/hadoopinstall/tmp</value><description>A base for other temporary directories.</description></property><property><name>dfs.name.dir</name><value>/home/mapred/hadoopinstall/filesystem/name</value><description>Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. </description></property><property><name>dfs.data.dir</name><value>/home/mapred/hadoopinstall/filesystem/data</value><description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.</description></property><property><name>mapred.local.dir</name><value>/home/mapred/hadoopinstall/filesystem/local</value><description>Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.</description></property><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>

(5) 在完成以上修改之后,把node1上的Hadoop原样复制到node2和node3上,保证目录结构一致:
scp –r /home/mapred/hadoopinstall node2:/home/mapred/
scp –r /home/mapred/hadoopinstall node3:/home/mapred/
完成以上操作之后,Hadoop在集群(node1,node2,node3)上已部署完成。
(6) 把主节点Namenode的文件系统格式化为HDFS,这个过程不会影响到各个节点现有的文件和程序。格式化的方法是进入node1的/home/mapred/hadoopinstall/hadoop/bin目录,然后执行以下命令:
hadoop namenode –format
如果成功,将会出现如下图提示:


这里需要注意的是,包括Hadoop0.17.1及其以前版本在内的Hadoop程序存在一个bug,如果用户已经格式化过Namenode,那么下一次重新格式化Namenode时,必须手工清除Namenode上的filesystem和tmp两个文件夹(具体路径在hadoop-site.xml文件中由用户指定),即执行rm –fr filesystem和rm –fr tmp,否则在启动服务时无法启动Datanode;
(7) 现在可以启动Hadoop服务了,启动服务只需要启动Namenode节点上的Hadoop守护进程,例如对于我们的集群,只需要登录到node1上,进入/home/mapred/hadoopinstall/hadoop/bin目录,执行以下命令:
./start-all.sh
如果运行成功,将会出现以下提示:


在Hadoop启动与运行过程中,如果出现任何错误,系统都将把出错信息自动写入各个节点hadoop/logs目录中的日志文件,用户可以打开对应的文件以辅助查找故障原因。
(8) 如果需要关闭Hadoop服务,则只需关闭Namenode节点上的Hadoop守护进程,在我们的例子中,只需要登录到node1上,进入/home/mapred/hadoopinstall/hadoop/bin目录,执行以下命令:
./stop-all.sh
在完成了以上步骤之后,Hadoop服务就在集群(node1,node2,node3)上部署成功了。
如果用户通过运行于Windows系统之上的SSH客户端程序来操纵集群的各个节点,而且使用的验证方式是Password,那么请参考第6节的相关说明更改SSH客户端程序设置,否则在下次连接时将无法成功登录。

原创粉丝点击