跳至主要内容

如何让100台计算机同时为你计算同一道算术题?——分布式计算Hadoop配置及实践(一)

假如你有一个比较复杂的算术题,用1台普通计算机需要计算3个月才能出结果,有什么办法可以让它能在1天内出结果呢?
比较“廉价”的方式可能是用100台普通计算机搭建一台“超级计算机”,让100台计算机同时计算,那么理论上1天就可以完成。
Apache Hadoop 是一个分布式计算框架,你只需要定义如何将一个计算任务拆分(Map)以及如何将各个分任务的结果合并(Reduce),剩下的事情比如如何协调100台计算机一起工作,如何保证即使某一台计算机中途坏掉了也不会影响整个工作等,都由 Hadoop 帮你代劳。Hadoop 同时也是一个分布式的基础架构,在其基础上有:

  • HDFS 分布式储存
  • HBase 分布式NoSQL数据库
  • Nutch 分布式全文搜索

等等一大堆重量级产品,这些都是构建一个大型应用所必须的基础设施。@ivarptr

这里我简单介绍基本的 Hadoop 系统的搭建方法,Hadoop 在运行时由5个程序组成:
1个NameNode,用于管理命名空间以及客户端对文件的访问;
1个JobTracker,用于调度工作以及分配任务(Task);
1个SecondaryNameNode,用于辅助NameNode的工作;
1~N个DataNode 用于数据储存;
1~N个TaskTracker 用于执行任务,DataNode 和 TaskTracker 总是在同一台计算机里运行。

前3个程序一般是分别在三台不同的计算机里运行,为了简单起见下面的例子我会在同一台计算机里运行这3个程序,然后再另外找3台计算机运行DataNode(连同TaskTracker),一共需要4台计算机。结构图如下:


下面是详细的搭建过程

1、下载 Apache Hadoop

到这里 http://hadoop.apache.org/ 下载 HDFS,我使用的版本是 0.20.2,下载回来的一个压缩包就已经包含了上面提到的5个程序。

2、配置 Hadoop
虽然在一个典型的 Hadoop 系统里会有 4种不同角色的计算机,不过我们为了简单起见可以先在某一台计算机编辑好配置文件,然后再分发到其他计算机,这样可以避免一台台地配置浪费时间。

a、编辑 conf/hadoop-env.sh,设置正确的 JAVA_HOME 环境变量,比如
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk (Ubuntu + OpenJDK)
或者
export JAVA_HOME=/usr/lib/jvm (CentOS + OpenJDK)
Tips:不知道是不是我现在使用的版本有 bug,Hadoop 在配置了IPv6的系统中会监听错网络地址,所以需要增加如下一行以屏蔽 java 的IPv6功能:
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true

b、编辑 conf/core-site.xml

<configuration>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/var/lib/hadoop/hadoop-${user.name}</value>
</property>

<property>
  <name>fs.default.name</name>
  <value>hdfs://192.168.0.10:9000</value>
</property>
</configuration>

第一段设置数据的储存位置(相应的目录当前用户应该有全权限),第二段设置 namenode 服务地址,用于跟其他计算机交流。

c、编辑 conf/mapred-site.xml

<configuration>
<property>
  <name>mapred.job.tracker</name>
  <value>192.168.0.10:9001</value>
</property>
</configuration>
这段设置了 JobTracker 的服务地址。

d、编辑 conf/hdfs-site.xml

<configuration>
<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>
</configuration>
这段设置一个文件数据在 Hadoop 系统里冗余多少份,一般设置为3。这样一旦有新的文件数据写入 Hadoop,系统会随机将文件分别写入到3台datanode,这样一旦系统中的某一台datanode坏掉了(比如硬盘或者主板烧了)只需要将这台计算机卸下,再连接一台新的计算机到网络即可,数据会自动复制以保证始终有3份数据。这也是分布式储存系统维护方便的原理(请忘掉硬盘阵列吧)。

e、编辑 /etc/hosts
由于 Hadoop 有时会使用 hostname 访问系统中的其他计算机,而 hostname 有时会解析错误,所以比较笨的方法是在 /etc/hosts 里增加每一台计算机的名称和IP地址。比如:
192.168.0.10    master
192.168.0.100    data001
192.168.0.101    data002
192.168.0.102    data003

3、复制已配置好的 Hadoop 到每一台计算机

首先要保证从 namenode 计算机能够使用key方式登录(即无密码登录)到其他的每一台计算机(包括1台自己和3台datanode),实现的方法是在 namenode 计算机使用 ssh-keygen 命令生成key,对于Fedora linux发行版可能还需要运行 ssh-add 命令,然后使用 ssh-copy-id 的方法把这个key复制到每一台计算机,然后你至少使用 ssh 登录一次所有计算机(包括自己)。因为这是属于 ssh 的内容,具体的方法请查阅 ssh 相关文章。
然后就可以使用 scp 命令复制配置好的 Hadoop 程序到每一台 datanode 计算机了,Hadoop 程序的存放位置必须一致,比如在 namenode 计算机中Hadoop程序位于 /usr/local/hadoop,那么其他计算机也应该存放在这里。

4、设置 namenode 特有的配置
因为我们可以在 namenode 控制所有计算机的 Hadoop 启动或者关闭,所以需要列出有哪些计算机是受控制的。
a、编辑 conf/master 文件,写入如下1行
192.168.0.10
这一行表示要启动的 secondaryNameNode 位于 192.168.0.10 这台计算机(共 nameNode 同一台)
b、编辑 conf/slaves 文件,写入如下3行
192.168.0.100
192.168.0.101
192.168.0.102
这表示当前 Hadoop 系统一共有3台datanode以及他们的IP地址。

5、格式化 namenode
这一步只需做一遍,切换到 Hadoop 程序目录,运行:
$ bin/hadoop namenode -format

6、启动 hadoop
$ bin/start-dfs.sh
这时应该看到启动了 namenode, secondaryNamenode 以及3个 datanode。
$ bin/start-mapred.sh
这时应该看到启动了 jobTracker 和 3个taskTracker。
上面的两个命令也可以用一个命令代替:bin/start-all.sh

7、测试一个分布式计算
在 Hadoop 程序目录里附带了一个统计一个文件里每个单词出现次数的示例,我们将会用它来测试。
首先你需要准备几个纯文本文件(比如有文件 /tmp/text/hello.txt 和 /tmp/text/world.txt ),把他写入到 Hadoop。
$ bin/hadoop fs -copyFromLocal /tmp/text text
这样就会在 Hadoop 里创建了一个 text 文件夹,并且把 hello.txt 和 world.txt 复制到其中了。可以运行 ls 命令查看 Hadoop 里面的文件:
$ bin/hadoop fs -ls

然后运行示例程序
$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount text text-output
运行完毕之后使用 ls 命令可以查看运行结果:
$ bin/hadoop fs -ls text-output

你可以根据示例的源码修改成自己的程序,并且运行测试一下。

8、Web 监控页面
访问 http://192.168.0.10:50070 可以查看 namenode 的总体运行情况以及已连入的 datanode 列表
访问 http://192.168.0.10:50030 可以查看 jobTracker 的运行情况以及各个 taskTracker 的运行情况和日志

9、关闭Hadoop系统
$bin/stop-all.sh

10、如何新增加一台 datanode 到系统
如果某台 datanode 重启了,为了让它重新加入 Hadoop 系统,需要在 datanode 计算机上运行:
$ bin/hadoop -daemon.sh start datanode
假如系统需要扩容或者换了一台新机器,这时需要把之前配置好的 Hadoop 复制过来,然后运行上面一行命令即可。假如新增了IP地址或者IP地址发生改变,记得还要在 conf/slaves 文件里作相应的增改。

11、遇到问题?
需要成功配置 Hadoop 可能会有些难度,因为除了程序问题之外,还牵涉网络配置以及ssh登录设置,这些都要求你对 Linux 有比较熟悉的了解。如果遇到问题,最好的解决方法是查看 Hadoop 的日志,一般来根据日志提供的线索都能把问题解决。或者 follow me @ivarptr

参考资料:
Hadoop中文文档
http://hadoop.apache.org/common/docs/r0.20.2/cn/index.html

Hadoop 命令手册
http://hadoop.apache.org/common/docs/r0.20.2/cn/commands_manual.html


Running Hadoop On Ubuntu Linux (Single-Node Cluster)
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/

Running Hadoop On Ubuntu Linux (Multi-Node Cluster)
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/

评论

此博客中的热门博文

在CentOS 5.5里安装Git以及搭建Git服务器最简单教程

Git 是目前比较流行的免费开源的分布式版本控制系统,在Git里能够高效灵活地创建和管理分支。下面讲述如何在CentOS 5.5里安装 Git以及使用Git搭建服务端(严格来说是让一台服务器作为Git服务角色)。 安装 Git 程序 最简单的方法是在 CentOS 里添加 EPEL 软件库: su -c 'rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm' 然后就可以简单地通过库安装 Git 了。 su -c 'yum install git' 使用软件库安装 Git 比较方便,而且组件依赖也会自动解决,不过由于 epel 库的 git 版本是 1.5.5 的,而目前 git 已经更新到 1.7.3 了,如果你比较纠结新版本,那么就使用源码方式安装吧,相关文章 google 一下就有了。 创建 Git 服务端(角色) 这里介绍一种比较简单方法,适合整个项目组成员都是平等的情况,方法是大家共同使用一个 ssh 帐号访问 Git 库。 先创建一个用户帐号,比如叫 devteam,然后在 devteam 的 home 目录里创建第一个库文件夹,比如叫 project1.git,然后使用 git 初始化一个裸库。 su -c 'useradd devteam' #创建 devteam 帐号 su -c 'passwd devteam' #更改 devtem 帐号的密码 su - devteam #切换到 devteam 帐号 mkdir project1.git #创建第一个项目库源码库 cd project1.git # git --bare init #初始化一个裸库 ssh-keygen #生成 ssh 钥匙,以备后用。 至此,服务端角色已经搭建完毕了。 客户端访问 Git 库 客户端可以通过如下地址访问该库: devteam@myhost:project1.git 其中 myhost 是指你的服务器ip或者机器名或者域名。 那么克隆下来的命令就是这样了: git clone devteam@myhost:pr...

Apache Cassandra 0.7 的集群配置

跟 Hadoop/HBase 一样, Apache Cassandra 也是 NoSQL 产品中最为重要的成员之一,跟 HBase 相比,因为 Cassandra 使用了一种去中心化的模式(类似memcached集群), 使用 Cassandra 搭建 NoSQL 集群更为简单容易,特别是在 0.7 版本之后,下面简述使用 Cassandra 0.7 搭建一个集群。 @ivarptr 前提条件 a、准备3台或以上的计算机。下面假设有3台运行Linux操作系统的计算机,局域网的IP地址分别为 192.168.0.100, 192.168.0.101 和 192.168.0.102。 b、Java 1.6。 c、到 这里下载 0.7.x 版本的Cassandra 二进制发行包。 1、基本配置 挑选其中的一台机开始配置,先展开 cassandra 发行包: $ tar -zxvf apache-cassandra-$VERSION.tar.gz $ cd apache-cassandra-$VERSION 其中的 conf/cassandra.yaml 文件为主要配置文件,由于 0.7 版不再采用XML格式配置文件,如果对 YAML 格式不熟悉的话最好先到 这里 了解一下。 Cassandra 在配置文件里默认设定了几个目录: data_file_directories: /var/lib/cassandra/data commitlog_directory: /var/lib/cassandra/commitlog saved_caches_directory: /var/lib/cassandra/saved_caches data_file_directories 可以一次同时设置几个不同目录,cassandra 会自动同步所有目录。另外在日志配置文件 log4j-server.properties 也有一个默认设定日志文件的目录: log4j.appender.R.File=/var/log/cassandra/system.log 一般情况下采用默认的配置即可,除非你有特殊的数据储存要求,所以现在有两种方案:一是按照默认配置创建相关的目录,二是修改配置文件采用自己指定的目录。 下面为了简...

在家用PC里体验 FreeBSD 8.1(上)

F reeBSD ( http://www.freebsd.org/ ) 是一个开源免费的操作系统,最早接触FreeBSD是约7年前在 @hplcsz 挂bbs的服务器,后来很少关注了,最近接触到 Apple 的 MacOS 和 iOS (基于FreeBSD衍生出来的操作系统)联想起FreeBSD项目,才发现它已经更新到8.1版了。 恰好家里多出一台电脑暂时没有用,于是尝试用FreeBSD 8.1配置一台适合家用的电脑(用来看看新闻灌灌水的那种),于是有了如下一篇文章。 (注:这里假设读者已经有一定的Linux/BSD基础) 首先访问 FreeBSD 项目的官方网站,下载 FreeBSD 8.1的安装镜像文件( ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.1/ ),这里提供CD版、DVD版和U盘版,考虑到我有DVD刻录机,所以下载了DVD版。 下载过程是一个漫长的等待,期间强烈推荐阅读一下官方的《FreeBSD使用手册》(中文版,以下简称《使用手册》)( http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/index.html ),如果对Linux/BSD不是很熟悉,前3章是很有必要阅读的,否则会被折腾到2012年。等待DVD镜像下载完,大概已经看到第10章了。 1、安装 FreeBSD 8.1 刻录下载回来的DVD镜像文件,从光驱启动然后选择“Quick模式”即开始安装过程。结合《使用手册》一般没有多大问题,因为这篇文章重点是如何搭建家用PC的环境,所以具体的安装过程这里就省略了。小技巧: A、 FreeBSD 必须安装在主分区,在安装之前你必须腾出一个至少10来GB的主分区。 B、 当安装问你是否安装“Ports(相当于软件商店、软件中心)”时,要选择“YES”。 C、 当安装接近完成时,程序会问你 “Would you like to browse the collection now?“,这一步是问你是否安装DVD上附带的软件,选择Yes,然后把下面这两个大块头选中,这样能避免从网络下载桌面环境的安装文件,节省时间和网络流量,减低碳排放: + X11/xorg-7.5 + gnome/gnom...