ZhongZiChang’s Dao

April 9, 2007

用Hadoop搭建分布式存储和分布式运算集群

Filed under: 开发, 搜索, 配置 — 钟 子昌 @ 7:59 pm

1. 列出使用的机器

普通PC,要求:
cpu: 750M-1G
mem: >128M
disk: >10G
不需要太昂贵的机器。

机器名:
finewine01
finewine02
finewine03

将finewine01设为主节点,其它的机器为从节点。

2. 下载和生成

从这里checkout,我选择trunk
http://svn.apache.org/repos/asf/lucene/hadoop/
使用ant进行生成

3. 部署前的准备工作
在主节点的start-all.sh脚本执行后,主节点和从节点的所有服务运行。即这个脚本将启动主节点的服务,并ssh到从所有的节点,继而启动从节点的服务。

start-all.sh这个脚本假定hadoop被安装在所有机器的同一个位置,每一台机器都用同一个路径存放hadoop的数据。

我们需要在每台机器上创建同样的目录结构。
/hadoop
/hadoop-install/hadoop-0.10.0 hadoop的0.10.0版的安装位置
/filesystem hadoop文件系统的根
/home 用户hadoop的主目录

以root登录到所有的机器,创建hadoop用户和目录结构。
ssh -l root finewine01
mkdir /hadoop
mkdir /hadoop/hadoop-install
mkdir /hadoop/filesystem
mkdir /hadoop/home
groupadd hadoop
useradd -d /hadoop/home -g hadoop hadoop
chown -R hadoop:hadoop /hadoop
passwd hadoop hadooppassword

start-all.sh脚本要启动所有机器的服务,需要对所有的机器进行ssh无密码的登录的能力。因此我们需要在每台机器上创建一个ssh key。在这个例子中,主节点也需要启动自己的服务,因此主节点同样需要做无密码的ssh登录设置。

用vi编辑/hadoop/hadoop-install/hadoop-0.10.0/conf/hadoop-env.sh,将下面的环境变量设置:

export HADOOP_HOME=/hadoop/hadoop-install/hadoop-0.10.0
export JAVA_HOME=/usr/java/jdk1.5.0_06
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves

这个文件还有很多变量,这些变量的设定影响hadoop的运行。比如你以后执行脚本时发生ssh错误,就需要调整其中的HADOOP_SSH_OPTS变量。
同时需要注意的是,在初始的拷贝操作后,需要在设置hadoop-env.sh文件中的HADOOP_MASTER变量,这样程序才能通过rsync同步主节点的改变到所有的从节点上。

在主节点上创建ssh keys,然后复制到各个从节点上。这些操作必须由先前创建的hadoop用户完成。不要su成hadoop用户来做。开启一个新shell,以hadoop用户的身份登录来完成这些操作。
cd /hadoop/home
ssh-keygen -t rsa (Use empty responses for each prompt)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /hadoop/home/.ssh/id_rsa.
Your public key has been saved in /hadoop/home/.ssh/id_rsa.pub.
The key fingerprint is:
a6:5c:c3:eb:18:94:0b:06:a1:a6:29:58:fa:80:0a:bc nutch@localhost

在主节点上,拷贝刚才创建的公共key到一个名为authorized_keys的文件:
cd /hadoop/home/.ssh
cp id_rsa.pub authorized_keys

只需在主节点上运行ssh-kegen程序。其他节点的目录结构创建后,将刚才在主节点创建的keys通过scp拷贝到从节点的同样的目录上。
scp /hadoop/home/.ssh/authorized_keys hadoop@finewine02:/hadoop/home/.ssh/authorized_keys
第一次,你需要输入hadoop用户的密码。第一次登录到其他的机器上,ssh提示你是否选择将机器加入到已知的机器列表中,选择yes。这个keys文件拷贝后,以hadoop的身份从主节点到从节点的登录就不需要密码了。
可以从主节点上以hadoop的身份测试:
ssh finewine02
接下来一个命令提示符将直接出现,不需要密码的。

一旦成功在所有机器上创建ssh keys后,就可以开始在从节点上部署hadoop。

4. 部署hadoop到一个机器上

首先,我们部署hadoop到一个节点上(主节点)。确保运行正常后,加入其他从节点。下面所有的操作都是由登录后的hadoop用户进行的。
cp -R /path/to/build/* /hadoop/hadoop-install/hadoop-x.x.x

然后确保这些shell脚本文件都是unix格式,并且是可执行的(这些文件分别在/bin和/conf目录中)。

一个hadoop-site.xml的例子:

fs.default.name
finewine01:9000

The name of the default file system. Either the literal string
“local” or a host:port for NDFS.

mapred.job.tracker
finewine01:9001

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.

mapred.map.tasks
2

define mapred.map tasks to be number of slave hosts

mapred.reduce.tasks
2

define mapred.reduce tasks to be number of slave hosts

dfs.name.dir
/hadoop/filesystem/name
dfs.data.dir
/hadoop/filesystem/data
mapred.system.dir
/hadoop/filesystem/mapreduce/system
mapred.local.dir
/hadoop/filesystem/mapreduce/local
dfs.replication
1
fs.default.name // 缺省的文件系统 “local”或者”host:port”

hadoop包含两个组件,分别是分布式文件系统和mapreduce功能。分布式文件系统允许你在多台普通机器上存储和复制文件。mapreduce可以让你很容易就执行并行程序任务。

分布式文件系统包含名字节点和数据节点。当一个客户想操作一个在文件系统上的文件时,它首先和名字节点联系,名字节点将告诉它在那个数据节点上可以取得文件。名字节点负责调度和保存那些数据块保存和复制到在那些机器上。数据节点是数据仓库,保存真实的文件数据块。当你在同一台机器上运行名字节点和数据节点的服务时,它同样会通过sockets来通讯,如同在不同机器上一样。

mapreduce是一种分布式运算,就如分布式文件系统一样,只不过分布的一个运算操作,而不是文件。负责mapreduce调度服务器叫做mapreduce job tracker。每一个执行运算操作的节点都有一个守护叫task tracker,task tracker运行并且和job tracker通信。

主节点和从节点的通信以连续的heartbeat(5-10秒)的方式进行。如果从节点的heartbeat停止,主节点将假定该从节点失效并不再使用该节点。

mapredu.job.traker // mapreduce的主节点,”local”或者”host:port”

mapred.map.tasks和mapred.reduce.tasks用于设定并行任务的数量。

dfs.name.dir // 名字节点用于存储数据节点的跟踪和调度信息

dfs.data.dir // 数据节点用于存储实际的数据块

mapred.system.dir // mapreduce tasker 存储自己的数据,仅仅在tasker所在的机器上,不在mapreduce主机上

mpred.local.dir // mapreduce 在节点上存储自己的本地数据。mapreduce使用巨大的本地空间来执行它的tasks。tasks退出时,mapreduce产生的中间文件并没有被删除。在每个节点上,这个属性是一样的。

dfs.replication // 冗余,单个文件将被拷贝到多少机器上。这个值不能高于的所有的数据节点的数量。否则守护启动时会看见很多错误信息。

在你启动hadoop服务之前,确保格式化名字节点

bin/hadoop namenode -format

现在可以启动hadoop服务了

bin/start-all.sh

停止hadoop服务可以使用下面的命令

bin/stop-all.sh

如果设置正确,会看到正常的输出信息

5. 部署Hadoop到多台机器上

一旦你在一台机器上成功运行hadoop,就可以将配置文件拷贝到其他的机器上。
如:
scp -r /hadoop/hadoop-install/hadoop-x.x.x hadoop@finewine02:/hadoop/hadoop-install/

对每台从节点机器都执行这个操作。然后编辑slaves文件,增加每一个slave到这个文件中,每行一个。编辑hadoop-site.xml的值,修改map和reduce的task的数量。修改replication属性。

6. 分布式搜索

产品系统一般每个索引库存100万条记录。50个服务器每秒处理20多个请求。
多处理器、多磁盘的系统,每个服务使用一个独立的磁盘和索引,这样机器的费用可以降低50%,电力解约到75%。一个多磁盘的机器并不能像单磁盘机器一样每秒处理那么多查询,但是它能处理更大的索引数量,因此平均起来效率更高一些。

7. 同步代码到从节点上

hadoop提供同步代码到从节点的能力。这个功能是可选的,因为它会减慢服务启动的速度,并且有时候你并不想同步改变到从节点上。

虽然从节点可以和主节点同步,但在第一次,你仍然需要基本的安装到从节点上,以至同步的脚本生效。这些工作上面我们在上面已经做了,所以不需要做改变。

同步的启动是由主节点ssh到从节点上,并执行bin/hadoop-daemon.sh脚本。这个脚本调用rsync来同步主节点。这表示你需要能以无密码的方式由从节点登录到主节点。前面,我们设置了从主节点到从节点的无密码登录,现在则设置反向登录。

如果是由于rsync选项引起了问题,查看bin/hadoop-daemon.sh脚本,大约在82行有rsync的选项。

那么,首先第一件事情就是在conf/hadoop-env.sh文件中,设置hadoop主节点变量。如:
export HADOOP_MASTER=finewine01:/hadoop/hadoop-install/hadoop-x.x.x

然后拷贝到所有从节点上,scp /hadoop/hadoop-installl/hadoop-x.x.x/conf/hadoop-env.sh hadoop@finewine02:/hadoop/hadoop-install/hadoop-x.x.x/hadoop-env.sh

最终,你需要登录到所有的从节点上,为每台机器创建一个ssh key。然后拷贝回到主节点,并追加到文件/hadoop/home/.ssh/authorized_keys文件中。在每个从节点上进行如下操作:

ssh -l nutch finewine02
cd /hadoop/home/.ssh

ssh-keygen -t rsa (Use empty responses for each prompt)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /hadoop/home/.ssh/id_rsa.
Your public key has been saved in /hadoop/home/.ssh/id_rsa.pub.
The key fingerprint is:
a6:5c:c3:eb:18:94:0b:06:a1:a6:29:58:fa:80:0a:bc nutch@localhost

scp id_rsa.pub hadoop@finewine01:/hadoop/home/finewine02.pub

在每台从节点机器完成上面的操作后,追加所有的文件到主节点的authorized_keys文件。

cd /hadooop/home
cat finewine*.pub >> .ssh/authorized_keys

当这些操作完成后,每次运行bin/start-all.sh脚本,文件都会从主节点同步的每一个从节点。

8. 查看状况

端口 : 50070
dfs的状态

端口:50060
tracker状态

50030
map/reduce管理

其他端口:
dfs.secondary.info.port 50090
dfs.datanode.port 50010
dfs.info.port 50070
mapred.job.tracker.info.port 50030
mapred.task.tracker.report.port 50050
tasktracker.http.port 50060

March 2, 2007

十分钟比较google图书搜索和cbdb

Filed under: 搜索, 有用的网站 — 钟 子昌 @ 4:46 pm

google的书不全(关于计算机方面的书比较多),cbdb的书很全,包括了从1900年到2006年的所有中文书籍。

google图书搜索 将一些人们关心的分类提取出来(可全文阅读,国学图书),cbdb其实很智能,功能隐藏的太深了,应该适当的提示。

google提供部分电子书(可全文阅读,部分阅读),可能数据还很少,搜不出来。

google搜索结果不准确,我试了两个查询,分别是”小说”,“武侠小说”,”windows编程”,”邓小平”,”刘德华”,搜索结果惨不忍睹,cbdb的效果比它好多了。

google有书的封面图片,cbdb还没有,据说正在加。

google网页的视觉感受比cbdb好,cbdb的字体偏小,颜色淡,不耐看。

google提供购买书籍的途径,cbdb没有。

目前google使用操作比cbdb方便。建议cbdb在显示单本书的页面上使用ajax技术,比如评论就不要再跳转一个页面了,真的很麻烦。还要再转一个页面才能看图书详情,太麻烦了,而且“图书详情”这个是什么东西嘛,点击进去还是跟原来的页面内容差不多,晕菜了。在显示单本图书的页面时应该把和这本书相关的所有的功能服务都提供,一目了然比不断的跳转方便多了。

就这么点内容,不说总结了。

November 8, 2006

开始Hadoop

Filed under: 搜索 — 钟 子昌 @ 12:22 am

+ 下载和安装

设置环境变量 $HADOOP_INSTALL 作为Hadoop的安装目录。

各个版本的hadoop都是安装在$HADOOP_INSTALL这个目录下。

然后在$HADOOP_INSTALL创建一个软连接hadoop连接到指定版本的hadoop。这样运行hadoop的所有工具都是在$HADOOP_INSTALL/hadoop/bin下,所有的配置文件都是放置在$HADOOP_INSTALL/hadoop/conf下。

+ 启动脚本

$HADOOP_INSTALL/hadoop/bin目录下包含运行Hadoop DFS 和 Map/Reduce守护的脚本:

* start-all.sh 启动所有的Hadoop守护。包括namenode, datanode, jobtracker, tasktrack
* stop-all.sh 停止所有的Hadoop。
* start-mapred.sh 启动Map/Reduce守护。包括Jobtracker和Tasktrack。
* stop-mapred.sh 停止Map/Reduce守护
* start-dfs.sh 启动Hadoop DFS守护.Namenode和Datanode
* stop-dfs.sh 停止DFS守护

+ 配置文件
$HADOOP_INSTALL/hadoop/conf 目录下包含Hadoop的配置文件.

* hadoop-env.sh 包含hadoop使用的环境变量集.设置这些变量可以影响Hadoop守护进程的行为。
* slaves 这个文件列出slave守护所在的主机(datanode和tasktracker),一行一个。缺省情况下,只包含一个条目”localhost”
* hadoop-default.xml 这个文件包含一些一般性的缺省设置.关系hadoop守护和map/reduce jobs,不要修改这个文件。
* mapred-default.xml 这个文件包含站点特定的设置,关系Map/Reduce守护和jobs.缺省情况下这个文件是空的。在这个文件中设置的属性将会覆盖hadoop-default.xml中的Map/Reduce设置,用这个文件来整理你的站点的map/reduce的行为。
* hadoop-site.xml 这个文件包含关系到所有hadoop守护和Map/Reduce jobs的特定设置。缺省情况下,这个文件是空的.这个文件中的设置将会覆盖hadoop-default.xml和mapred-default.xml中的设置。这个文件包含的设置关系到Hadoop安装过程中的所有服务器和客户端,对于实例讲,就是namnode和jobtracker的位置。

+ 在单一节点上设置Hadoop

一个HDFS实例(包含一个namenode和一个单一的datanode)和
一个Map/Reduce集群(包含一个jobtracker和单一的tasktracker)

下面的“基本配置”的过程仅适用于大型集群。

+ 基本配置

下面的配置一些是必需,一些是推荐。

* hadoop环境设置
确保在hadoop-env.sh中设置JAVA_HOME变量,指向想要使用的java安装目录。可以根据你的需要在hadoop-env.sh中设置其他的环境变量。HADOOP_HOME变量是根据启动脚本自动推断的.

*Jobtracker和Namenode的设置
指出在哪里运行你的namenode和jobtracker。
fs.default.name // 设置namenodes(host:port)
mapred.job.tracker // 设置jobtrackers(host:port)
这些设置在hadoop-site.xml文件中,你可能需要设置下面的端口:
dfs.datannode.port
dfs.info.port
mapred.job.tracker.info.port
mapred.task.tracker.output.port
mapred.task.tracker.report.port

* 数据的路径设置
指出数据的走向。
包括namenode将namespace checkpoint和编辑记录存储在哪里,datanode将在哪里存储文件系统块,Map/Reduce中间输出的存储位置和HDFS的临时存储。这些路径的缺省值是指到/tmp下的各个位置。这些设置必须都是在文件hadoop-site.xml文件中。hadoop-site.xml中的这些设置是很重要的,否则它们会被Map/Reduce jobs的客户配置所覆盖。给下面的变量设定相应的值:
dfs.name.dir
dfs.data.dir
dfs.client.buffer.dir
mapred.local.dir

+ 格式化namenode

开始安装Hadoop的第一步就是格式化Hadoop文件系统,在集群的本地文件系统上实现。 不要格式化一个正在运行的Hadoop文件系统,这会引起所有的数据都会被擦除。要格式化文件系统(初始化dfs.name.dir变量指定的目录),执行下面的命令:% $HADOOP_INSTALL/hadoop/bin/hadoop namenode -format

+ 启动一个单节点集群

运行命令:
% $HADOOP_INSTALL/hadoop/bin/start-all.sh
将会在你的机器上启动一个Namenode,Datanode,Jobtracker和一个Tasktracker。

+ 在安装中分离配置
在上面的例子中,Hadoop集群用到的配置文件都在Hadoop安装过程中列出。在升级到新的版本时,这将时非常麻烦的,因为所有的自定义配置必须重新创建。从安装中分离配置时可以的。要做到这样,选择一个放置Hadoop配置文件的目录(如:/foo/bar/hadoop-config),拷贝hadoop-site.xml, slaves和Hadoop-env.sh到这个目录。你可以设置环境变量HADOOP_CONFIG_DIR指到这个目录,或者将其以选项的形式传递一个Hadoop脚本 –config .在这里例子中,集群将以以下的命令启动和停止:
% $HADOOP_INSTALL/hadoop/bin/start-all.sh –config /foo/bar/hadoop-config
% $HADOOP_INSTALL/hadoop/bin/stop-all.sh –config /foo/bar/hadoop-config
传递一个脚本的配置目录的路径必须是绝对路径。

+ 启动一个大型集群
* 确保集群内所有的节点上相同路径的Hadoop包都是可访问的。如果你在安装时使用分开配置,确保配置目录也是可访问。
* 集群中的slaves文件必须是一行表示一个节点
* 然后按照上面的“基本配置”这一段来进行
* 格式化Namenode
* 在要运行Namenode的节点上执行
% $HADOOP_INSTALL/hadoop/bin/start-dfs.sh
这将会启动HDFS(Namnode和Datanode)。Namenode就是你执行这条命令的机器,Datanode在上面所提到的slaves文件列出。
* 在要运行Jobtracker的机器上执行
% $HADOOP_INSTALL/hadoop/bin/start-mapred.sh
这将启动Map/Reduce集群(Jobtracker和Tasktracker)。Jobtracker在你执行这条命令的机器上执行,而Tasktracker在slaves文件中列出的机器上运行。
* 上面两个命令同样可以带一个 –config选项执行。

+ 停止集群
分别在Jobtracker和Namenode 上执行
% $HADOOP_INSTALL/hadoop/bin/stop-mapred.sh
% $HADOOP_INSTALL/hadoop/bin/stop-dfs.sh
这些命令同样接受–config选项。

Powered by WordPress