本节书摘来异步社区《Hadoop MapReduce实战手册》一书中的第1章,第1.5节,作者: 【美】Srinath Perera , Thilina Gunarathne 译者: 杨卓荦 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.5 安装HDFS
Hadoop MapReduce实战手册
HDFS是Hadoop的分布式文件系统。MapReduce任务使用HDFS读取和写入数据。HDFS部署包括一个NameNode和多个DataNode,如图1-3所示。
要想安装HDFS,需要先配置NameNode和DataNode,然后在slave文件中指定DataNode列表。当我们启动NameNode时,启动脚本将自动启动这些DataNode列表。
准备工作
无论使用的是单台机器还是多台机器,本节都适用。如果你用的是多台机器,则应该选择一台机器作为主节点来运行HDFS NameNode。如果你使用的是单台机器,则可以用它既作NameNode,又作DataNode。
- 在用于安装HDFS集群的所有机器上安装Java。
- 如果你使用的是Windows机器,则需要在每一台机器上都安装Cygwin和SSH服务。链接http://pigtail.net/LRP/printsrv/cygwin-sshd.html`提供了详细安装说明。
操作步骤
现在让我们在分布式模式下安装HDFS。
- 从主节点到从节点依次启用SSH服务。通过运行以下命令之一检查确认,可以跳过输入密码直接使用SSH服务登录到本地机器或其他所有节点机器:
>sshlocalhost
>sshIPaddress
- 如果上述命令返回错误或要求输入密码,那么可以执行下列命令来创建SSH密钥:
>ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
将~/.ssh/id_dsa.pub文件复制到集群中的所有节点。然后通过运行以下命令(如果authorized_keys文件不存在,则运行以下命令。否则,跳到cat命令),将SSH密钥写入每个节点的~/.ssh/authorized_keys文件:
>touch ~/.ssh/authorized_keys&&chmod 600 ~/.ssh/authorized_keys
现在配置权限设置,将你的密钥写入~/.ssh/authorized_keys文件。
>cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
然后你就可以使用下面的命令登录了:
>sshlocalhost
这个命令在主目录的.ssh/目录创建一个SSH密钥对,并且将生成的带SSH的公钥注册为一个信任密钥。
- 在每台机器上创建一个目录,用于存储HDFS数据。我们称那个目录为HADOOP_DATA_DIR。现在,让我们创建两个子目录——HADOOP_DATA_DIR/data和HADOOP_DATA_DIR/name。通过为每个目录运行以下命令,将目录权限更改为755:
>chmod 755 <name of dir>
- 在NameNode上,将目录跳转到解压后的HADOOP_HOME目录。然后将所有从节点的IP地址写入HADOOP_HOME/conf/slaves文件,每行一个独立的IP地址。当我们启动NameNode时,它会使用slaves文件启动DataNode。
- 在所有机器上,编辑HADOOP_HOME/conf/hadoop-env.sh,取消该文件中JAVA_HOME行的注释,将其指向本地的Java安装目录。例如,如果Java安装在/opt/jdk1.6下,那么可以将JAVA_HOME行改为export JAVA_HOME=/opt/jdk1.6。
- 在每个节点的HADOOP_HOME/conf目录下,将下面的配置代码添加到core-site.xml文件和
hdfs-site.xml文件中。在添加配置之前,把MASTER_NODE字符串替换为主节点的IP地址,并把HADOOP_DATA_DIR替换为第一步创建的目录。
HADOOP_HOME/conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<!-- URL of MasterNode/NameNode -->
<value>hdfs://MASTER_NODE:9000/</value>
</property>
</configuration>
HADOOP_HOME/conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<!-- Path to store namespace and transaction logs -->
<value>HADOOP_DATA_DIR/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<!-- Path to store data blocks in datanode -->
<value>HADOOP_DATA_DIR/data</value>
</property>
</configuration>
- 从NameNode上,运行以下命令来格式化一个新的文件系统:
>bin/hadoopnamenode –format
12/04/09 08:44:50 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
...
12/04/09 08:44:51 INFO common.Storage: Storage directory /Users/
srinath/playground/hadoop-book/hadoop-temp/dfs/name has been
successfully formatted.
12/04/09 08:44:51 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at Srinath-s-MacBook-Pro.
local/172.16.91.1
************************************************************/
- 使用下面的命令开始HDFS的安装:
>bin/start-dfs.sh
这个命令将首先启动一个NameNode进程。然后,它会查看HADOOP_HOME/conf/slaves文件,启动DataNode进程。控制台将打印类似下面的消息。
startingnamenode, logging to /root/hadoop-setup-srinath/
hadoop-1.0.0/libexec/../logs/hadoop-root-namenode-node7.beta.out
209.126.198.72: starting datanode, logging to /root/hadoop-setupsrinath/
hadoop-1.0.0/libexec/../logs/hadoop-root-datanode-node7.beta.out
209.126.198.71: starting datanode, logging to /root/hadoop-setupsrinath/
hadoop-1.0.0/libexec/../logs/hadoop-root-datanode-node6.beta.out
209.126.198.72: starting secondarynamenode, logging to /root/hadoop-setup-
srinath/hadoop-1.0.0/libexec/../logs/hadoop-rootsecondarynamenode-
node7.beta.out
Hadoop使用集中式架构来管理元数据。在这种设计中,NameNode持有所有文件的信息,记录文件与数据库的对应关系及数据块的具体位置。NameNode是单点,当它发生故障时,它将停止HDFS集群的所有操作。为了避免这种情况,Hadoop支持secondary NameNode,该进程备份了NameNode中的所有数据。如果NameNode发生故障,secondary NameNode会取代其位置1。
- 访问链接http://MASTER_NODE:50070/,看是否能看到HDFS启动页面。在这里,请将
MASTER_NODE替换为运行HDFS NameNode的主节点的IP地址。 - 最后,使用下面的命令关闭HDFS集群:
>bin/stop-dfs.sh
工作原理
NameNode启动时,将读取HADOOP_HOME/conf/slaves文件,找到需要启动的DataNode列表,启动它们,并设置HDFS集群。在1.7节中,我们将探讨如何使用HDFS来存储和管理文件。
HDFS安装只是整个Hadoop安装的一部分。1.8节中会介绍如何设置Hadoop的其余部分。