hadoop----- 云计算实验 作者 : 张吉良李菁平邓鹏球 关键词 : hadoop 分布式 云计算 mapreduce 摘要 : 摩尔定律统制下的软件开发时代有一个非常有意思的现象 : Andy giveth, and Bill taketh away. 不管 CPU 的主频有多快, 我们始终有办法来利用它, 而我们也陶醉在机器升级带来的程序性能提高中 我们不知不觉的一直在享受着这样的免费午餐 可是, 随着摩尔定律的提前终结, 免费的午餐终究要还回去, Google 的 MapReduce 正是把分布式的业务逻辑从复杂的细节中抽象出来, 使得没有或者很少并行开发经验的程序员也能进行并行应用程序的开发, 分布式编程的时代已来临. 经过几天的试验, 对分布式计算, 分布式文件系统进行了初步探索, 中间碰到很多问题, 但在实验组的共同努力下, 已实现单机伪分布式计算, 在探索集群分布式计算方面遇到不少麻烦, 但最终还是实现了 HDFS, 但由于时间原因核心思想 :mapreduce 未能实现, 如果有时间的话, 我们实验组将继续实验, 希望能实现真正的集群计算! 一 : 实验环境的搭建 : 1: 实验平台 : 2 台机器 fedora11 jdk1.6.0_17 hadoop-0.20.1 机器 IP 配置如下 : zjl:10.62.85.136 lijp:10.62.85.137 实验中为保证每台机子能 ping 通对方, 需要修改 linux 下 /etc/hosts 文件 : 以本文为例,zjl 中的 /etc/hosts 文件如下 : 127.0.0.0 localhost 10.62.85.136 zjl 10.62.85.137 lijp lijp 中的 /etc/hosts 文件如下 : 127.0.0.0 localhost 10.62.85.136 zjl 10.62.85.137 lijp ping 10.62.85.203 看能否 ping 通, 如下所示 :
对于 Hadoop 来说, 在 HDFS 看来, 节点分为 Namenode 和 Datanode, 其中 Namenode 只有一个,Datanode 可以是很多 ; 在 MapReduce 看来, 节点又分为 Jobtracker 和 Tasktracker, 其中 Jobtracker 只有一个,Tasktracker 可以是很多 我是将 namenode 和 jobtracker 部署在 zjl 上,lijp 作为 datanode 和 tasktracker 当然你也可以将 namenode,datanode,jobtracker, tasktracker 全部部署在一台机器上 2: 目录结构由于 Hadoop 要求所有机器上 hadoop 的部署目录结构要相同, 并且都有一个相同的用 户名的帐户 我的 2 台机器上是这样的 : 都有一个 zjl 的帐户, 主目录是 /home/zjl Hadoop 部署目录结构如下 :/home/zjl/hadoop, 所有的 hadoop 版本放在这个目录中 将 hadoop0.20.1 压缩包解压至 hadoop 中 3:SSH 设置在 Hadoop 启动以后,Namenode 是通过 SSH(Secure Shell) 来启动和停止各个节点上 的各种守护进程的, 这就需要在节点之间执行指令的时候是不需要输入密码的方式, 故我们 需要配置 SSH 使用无密码公钥认证的方式 首先要保证每台机器上都装了 SSH 服务器, 且 都正常启动 实际中我们用的都是 OpenSSH, 这是 SSH 协议的一个免费开源实现 fedora11 中默认安装的 OpenSSH 版本 以本文中的 2 台机器为例, 现在 zjl 是主节点, 它需要主动发起 SSH 连接到 lijp, 对于 SSH 服务来说,zjl 就是 SSH 客户端, 而 lijp 则是 SSH 服务端, 因此在 lijp 上需要确定 sshd 服务已经启动 简单的说, 在 zjl 上需要生成一个密钥对, 即一个私钥, 一个公钥 将公钥 拷贝到 lijp 上, 这样, 比如当 zjl 向 lijp 发起 ssh 连接的时候,lijp 上就会生成一个随机数并 用 zjl 的公钥对这个随机数进行加密, 并发送给 zjl;zjl 收到这个加密的数以后用私钥进行解 密, 并将解密后的数发送回 lijp,lijp 确认解密的数无误后就允许 zjl 进行连接了 这就完成 了一次公钥认证过程 对于本文中的 2 台机器, 首先在 zjl 上生成密钥对 : $ssh-keygen -t rsa 这个命令将为 zjl 上的用户 zjl 生成其密钥对, 询问其保存路径时直接回车采用默认路径, 当 提示要为生成的密钥输入 passphrase 的时候, 直接回车, 也就是将其设定为空密码 生成的 密钥对 id_rsa,id_rsa.pub, 默认存储在 /home/zjl]/.ssh 目录下 然后将 id_rsa.pub 的内容复制 到每个机器 ( 也包括本机 ) 的 /home/zjl/.ssh/authorized_keys 文件中, 如果机器上已经有 authorized_keys 这个文件了, 就在文件末尾加上 id_rsa.pub 中的内容, 如果没有 authorized_keys 这个文件, 直接 cp 或者 scp 就好了, 下面的操作假设各个机器上都没有 authorized_keys 文件 对于在 /home/zjl/.ssh 下 : $cp id_rsa.pub authorized_keys 对于 lijp 在 /home/zjl/ 下 :
$mkdir.ssh $cd.ssh $scp authorized_keys dbrg- 此处的 scp 就是通过 ssh 进行远程 copy, 此处需要输入远程主机的密码, 即 lijp 机器上 zjl 帐户的密码. 在 lijp 机子上 : $chmod 644 authorized_keys 这一步非常关键, 必须保证 authorized_keys 只对其所有者有读写权限, 其他人不允许有写 的权限, 否则 SSH 是不会工作的 向 lijp 发起 ssh 连接请求 : $ssh lijp 如果 ssh 配置好了, 就会出现以下提示信息 The authenticity of host [lijp] can't be established. Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52. Are you sure you want to continue connecting (yes/no)? OpenSSH 告诉你它不知道这台主机, 但是你不用担心这个问题, 因为你是第一次登录这台 主机 键入 yes 这将把这台主机的 识别标记 加到 ~/.ssh/know_hosts 文件中 第 二次访问这台主机的时候就不会再显示这条提示信息了 然后你会发现不需要输入密码就可 以建立 ssh 连接了 4:Hadoop 配置 1:conf/hadoop-env.sh 文件中最基本需要指定 JAVA_HOME, 例如我的如下 : export JAVA_HOME=/usr/java/jdk1.6.0_17 2 :conf/core-site.xml 文件配置如下 : <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <name>fs.default.name</name> <value>hdfs://10.62.85.136:9000/</value> <description>the name of the default file system. Either the literal string "local" or a host:port for DFS.</description> <name>mapred.job.tracker</name> <value>hdfs://10.62.85.136:9001/</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> <name>hadoop.tmp.dir</name> <value>/home/zjl/hadoop/tmp</value> <description>a base for other temporary directories.</description>
<name>dfs.name.dir</name> <value>/home/zjl/hadoop/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> <name>dfs.data.dir</name> <value>/home/zjl/hadoop/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> <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> </configuration> 3:zjl 远程拷贝 hadoop 文件给 lijp: $scp -r /home/zjl/hadoop lijp:/home/zjl/
4: 启动 Hadoop a): 进入 /home/zjl/hadoo/ hadoop-0.20.1 格式化 namenode
b): 启动 hadoop $bin/start-all.sh 5:hdfs 操作 6:mapreduce 操作 :