Hadoop 安装与配置手册


Hadoop 安装与配置手册(ver 0.1) 骆卫华 中科院计算所多语言交互技术实验室 2008-8-26 目录 Hadoop安装与配置手册(ver 0.1) ....................................................................................................1 1 前言........................................................................................................................................2 2 获取Hadoop...........................................................................................................................2 3 安装Hadoop...........................................................................................................................2 3.1 先决条件.....................................................................................................................2 3.2 安装.............................................................................................................................4 4 配置Hadoop...........................................................................................................................4 5 运行简单的例子....................................................................................................................9 6 补充说明................................................................................................................................9 7 推荐资源..............................................................................................................................13 8 参考文献..............................................................................................................................13 1 前言 Hadoop 是 Apache Lucene 下的一个子项目,它最初是从 Nutch 项目中分离出来专门负责分 布式存储以及分布式运算的项目。简单地说,Hadoop 是一个实现可靠、可扩展、分布式运 算的开源软件平台,它也是 Google 著名的分布式文件系统 Google File System 和分布式并行 开发框架 MapReduce 的开源版本。Hadoop 由三个相对独立,而又相辅相成的软件组成,包 括: (1) Hadoop Core,是 Hadoop 的核心,提供了一个分布式文件系统(HDFS),并支持 MapReduce 分布式计算框架; (2) Hbase,构造在 Hadoop Core 之上,提供一个可扩展、分布式的数据库系统; (3) ZooKeeper,是一个高可用、高可靠的协同工作系统,分布式程序可以用 ZooKeeper 保存并更新关键共享状态。 Hadoop的官方网址是http://hadoop.apache.org。它拥有三个不同的mailing list,分别是 Users(普通用户)、Developers(有兴趣参加Hadoop开发的人)和Commits(关注Hadoop版 本变化信息的人),可以通过http://hadoop.apache.org/core/mailing_lists.html订阅。想了解更多 Hadoop的信息,可以通过访问其Wiki网页http://wiki.apache.org/hadoop来达到目的。 Hadoop 支持的平台包括 Linux 和 Windows(Windows 需安装 Cygwin),目前已知在 Unix BSD 和 Mac OS/X 上也能运行。但官方说法是,GNU/Linux 是一个经过验证的开发和生产 平台,而 Win32 上尚未经过严格的测试,因此可以做开发平台,但不推荐作为生产平台。 我们以下的安装与配置均基于 Linux 平台,而不再针对 Windows 进行说明。具体来说,我 们采用 Ubuntu7 发布包,内核版本为 2.6.24-19,gcc 版本为 4.2.3。如果读者的平台基于其 他 Linux 发布包,请参考本手册并结合所用系统的具体情况进行调整。 Hadoop 是用 Java 语言开发的,它本身内在支持基于 Java 开发的程序,但通过特定的接 口(Streaming, PIPES 等),它也支持用其他语言(C/C++,Python,PHP 等)开发的程序。 2 获取 Hadoop Hadoop 的下载地址是 http://www.apache.org/dyn/closer.cgi/hadoop/core/ 。 截止到 2008-8-26,Hadoop 的最新版本是 0.18.0。我们以下的说明基于此前的一个稳定版本 0.17.1 完成,如果您获取的 Hadoop 版本不同,请参考该版本的相关说明进行调整。 3 安装 Hadoop 3.1 先决条件 Hadoop 的安装与运行需要依赖以下程序,在安装 Hadoop 之前,请确保在计算机上已经安 装了以下软件: (1) Java™1.5.x 及以上版本,推荐 Sun 公司的官方版本(http://www.java.com),必须安装。 下载时请注意选择对应于机器配置的正确的版本(操作系统、32/64 位); (2) ssh,必须安装,且每次系统启动时 sshd 服务也必须自动启动。Ubuntu 用户可以用 以下命令自动下载并安装: $ sudo apt-get install ssh $ sudo apt-get install rsync 其他Linux版本的用户可以到http://www.openssh.com/portable.html下载openssh并按 照相关说明安装; (3) 如果运行在 Windows 平台上,则必须安装 Cygwin(从 http://www.cygwin.com/下载), 安装好 Cygwin 之后还需要安装 openssh 包。 需要注意的是,由于 Hadoop 需要通过 ssh 服务在各个节点之间登录并运行服务,因此 必须确保安装 Hadoop 的各个节点之间的网络畅通,网络畅通的标准是每台机器的主机名和 IP 地址能够被所有机器正确解析(包括它自己)。一个简单的测试方法是 PING 主机名。为 便于说明,我们以下面的网络环境为例进行说明: 图 1 网络环境示例 Hadoop 集群由 3 个节点(同构、异构均可)构成,它们之间通过以太网进行通讯。图 1 中 每个节点下部的标签为该节点的主机名,其对应的 IP 地址如表 1 所示: 主机名 IP 地址 node1 192.168.1.11 node2 192.168.1.12 node3 192.168.1.13 表 1 主机名与对应的 IP 地址 我们需要在每台机器上 PING 所有三台机器,例如在 node1 上 ping node1,ping node2 和 ping node3。如果能 ping 通,则表示 node1 到 node2 和 node3 网络畅通。如果 ping 不通,则需要 更新 node1 上的主机名文件。具体做法是,以 root 身份打开/etc/hosts 文件,在里面添加以 下几行: 192.168.1.11 node1 192.168.1.12 node2 192.168.1.13 node3 node2 和 node3 也需要按照相同的方法进行设置。 3.2 安装 本手册的目标是为构造一个运行在多台机器上的 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 的复杂度和工作量; 4 配置 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 所示(读者所用的帐号和 节点名可能会有所不同): 图 2 .ssh 目录结构 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 所示的提示信息: 图 3 ssh 登录提示信息 敲入 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 按照下图所示进行设置即可。其中各个属性的含义均在 字段中进行说明。如果需要了解更多属性的含义及其属性取值 范围,请参考 hadoop/docs 下的 cluster_setup.pdf 文件。 hadoop-site.xml 配置示例: fs.default.name hdfs://node1:9000 The name of the default file system. Either the literal string "local" or a host:port for DFS. mapred.job.tracker hdfs://node1:19001 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. hadoop.tmp.dir /home/mapred/hadoopinstall/tmp A base for other temporary directories. dfs.name.dir /home/mapred/hadoopinstall/filesystem/name 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. dfs.data.dir /home/mapred/hadoopinstall/filesystem/data 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. mapred.local.dir /home/mapred/hadoopinstall/filesystem/local 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. dfs.replication 1 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. (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 如果成功,将会出现如下图提示: 图 4 HDFS 格式化 这里需要注意的是,包括 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 如果运行成功,将会出现以下提示: 图 5 hadoop 启动提示信息 在 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 客户端程序设置, 否则在下次连接时将无法成功登录。 5 运行简单的例子 HDFS 中的文件与目录用 Linux 命令是无法直接访问的,必须使用 Hadoop 自身提供的命令。 而且所有的操作都需要在 Namenode 上进行。在我们的示例中,需要登录到 node1 上,并进 入/home/mapred/hadoopinstall/hadoop/。以下是一些简单的文件访问命令示例: (1) 要创建一个目录,可以执行下面的命令: bin/hadoop dfs –mkdir mytest (2) 要从本地目录复制一个文件到 HDFS 中,可以执行下面的命令: #把~/corpus/text1.txt 复制到 HDFS 中,并改名为 test_input bin/hadoop dfs –copyFromLocal ~/corpus/text1.txt test_input (3) 查看根目录下有哪些文件和子目录,可以执行下面的命令: bin/hadoop dfs -ls (4) hadoop 自带了一些支持 MapReduce 的例子,包括 grep(在字符串中查找指定模式)、 sort(排序)、pi(基于 Monte-Carlo 法求 PI 值)、wordcount(在指定文件中统计词频) 等,这些例子都用 Java 实现。如果要统计 mytest 目录下所有文件中的词及其词频, 可以执行下面的命令: bin/hadoop jar hadoop-0.17.1-examples.jar wordcount mytest/* wordcount_output 执行下面的命令则可以查看统计的结果: bin/hadoop dfs -cat wordcount_output/part-00000 (5) hadoop 通过 streaming 机制可以支持用其他语言实现的 MapReduce 程序。例如,源 码 1 和源码 2 分别用 C 语言实现了一个 wordcount(对指定文件统计词及其词频) 的 mapper 和 reducer。将其分别编译成可执行程序 mapper、reducer,则可以用 hadoop 调用这两个程序实现 wordcount 功能: bin/hadoop jar contrib/streaming/hadoop-0.17.1-streaming.jar -mapper ~/mapred/mapper -reducer ~/mapred/reducer -input mytest/* -output myout 6 补充说明 如果用户自己所用的机器不属于集群中的节点,而且运行在 Windows 系统之后,在使用 Hadoop 集群时,通过 SSH 客户端来与节点进行通讯,那么在安装 Hadoop 之后,也需要对 其 SSH 客户端进行正确的设置,否则将无法通过客户端连接到节点上。 我们以以下典型使用模式为例进行说明:用户所用的机器运行 Windows XP 系统,SSH 客户端采用 SecureCRT,用户日常工作通过 ssh 协议连接到 node1,node2 和 node3 上。在这 三个节点改为无密码公钥验证的方式登录之后,客户端的 SecureCRT 也必须改为公钥验证 方式。以 node1 的设置为例,具体做法是: (1) 打开 SecureCRT,新建一个 session,在属性选项的 Connection 部分,设置正确的节 点名、IP 地址、帐号和验证方式,以 node1 为例,分别是 node1,192.168.1.11,mapred 和 PublicKey,如图 6 所示: (2) 打开 Properties 属性,在“Public Key Properties”里选择“use identity file”,并点击 “Create Identity File”,其他都接受默认设置,按照向导的指示点击“下一步”,当 要求设置“Passphrase”时,不输入任何密码,直接进入下一步,接受软件的默认设 置,直至完成。 图 6 SecureCRT 的 connection 设置 (3) 找到 SecureCRT 生成的 Identify 文件(假设文件名就是 Identity),将其上传到 node1 上(例如/home/mapred/)。由于 SecureCRT 生成的密钥文件格式与 Linux 不同,因此 必须进行转换,执行下面的命令即可完成转换: ssh-keygen -i -f identity.pub >>authorized_keys2 把 authorized_keys2 里的内容附加到/home/mapred/.ssh/authorized_keys 的最后一行即 可。 (4) 对 node2,node3 执行同样的操作。点击 SecureCRT 的 session 中的对应节点即可完 成登录。 源码 1(Mapper.c): #include #include #include #define BUF_SIZE 2048 #define DELIM "\n" int main(int argc, char *argv[]){ char buffer[BUF_SIZE]; while(fgets(buffer, BUF_SIZE - 1, stdin)){ int len = strlen(buffer); if(buffer[len-1] == '\n') buffer[len-1] = 0; char *querys = index(buffer, ' '); char *query = NULL; if(querys == NULL) continue; querys += 1; /* not to include '\t' */ query = strtok(buffer, " "); while(query){ printf("%s\t1\n", query); query = strtok(NULL, " "); } } return 0; } 源码 2(Reducer.c): #include #include #include #define BUFFER_SIZE 1024 #define DELIM "\t" int main(int argc, char *argv[]){ char strLastKey[BUFFER_SIZE]; char strLine[BUFFER_SIZE]; int count = 0; *strLastKey = '\0'; *strLine = '\0'; while( fgets(strLine, BUFFER_SIZE - 1, stdin) ){ char *strCurrKey = NULL; char *strCurrNum = NULL; strCurrKey = strtok(strLine, DELIM); strCurrNum = strtok(NULL, DELIM); /* should check error but.... */ if( strLastKey[0] == '\0'){ strcpy(strLastKey, strCurrKey); } if(strcmp(strCurrKey, strLastKey)){ printf("%s\t%d\n", strLastKey, count); count = atoi(strCurrNum); }else{ count += atoi(strCurrNum); } strcpy(strLastKey, strCurrKey); } printf("%s\t%d\n", strLastKey, count); /* flush the count */ return 0; } 7 推荐资源 以下几个网站是学习和使用 Hadoop 经常要参考的网站,建议大家经常去这些网站上了解一 些新的信息,并获取 Hadoop 开发和使用的最新情况: (1) Hadoop官方网站:http://hadoop.apache.org/,推荐指数:★★★★★,推荐理由:官 方消息,官方下载,官方手册; (2) Hadoop Wiki:http://wiki.apache.org/hadoop/FrontPage,推荐指数:★★★★ ☆,推荐理由:提供了几乎最全的Hadoop资源,包括用户手册、开发者手册以及第 三方使用Hadoop的论文和报告; (3) Hadoop研究:http://www.hadoop.org.cn/,推荐指数:★★★★,推荐理由:一个 MapReduce爱好者维护的网站,所整理的文章质量较高,并有一些较有深度的分析和 评论; (4) 一个Hadoop使用者的博客:http://www.meichua.com/diary/?catalog=11216495, 推荐指数:★★★,推荐理由:整理了几篇关于Hadoop架构、配置和使用方面的有 用的文章。 8 参考文献 1. Hadoop Quickstart. http://hadoop.apache.org/core/docs/current/quickstart.html 2. Hadoop Map/Reduce Tutorial. http://hadoop.apache.org/core/docs/current/mapred_tutorial.html 3. How to Setup Nutch and Hadoop. http://wiki.apache.org/nutch/NutchHadoopTutorial 4. Hadoop 学习笔记二 安装部署. http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html 5. Owen O’Mally. Programming with Hadoop’s Map/Reduce. ApacheCon EU 2008. 6. SecureCRT通过SSH2 连接OpenSSH主机. http://warandpeace.bokee.com/3822848.html 7. 马士华. 如何在Hadoop 中使用Streaming 编写MapReduce. http://www.hadoop.org.cn/hadoop/hadoop-streaming/ 8. How To Configure Hadoop. http://wiki.apache.org/hadoop/HowToConfigureTT
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

ccwan

贡献于2012-03-07

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf