专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » hadoop:用 Hadoop 进行分布式并行编程 第 1 部分 »正文

hadoop:用 Hadoop 进行分布式并行编程 第 1 部分

来源: 发布时间:星期四, 2009年1月8日 浏览:29次 评论:0
  Hadoop 是个实现了 MapReduce 计算模型开源分布式并行编程框架借助于 Hadoop, 员可以轻松地编写分布式并行将其运行于计算机集群上完成海量数据计算本文将介绍 MapReduce 计算模型分布式并行计算等基本概念以及 Hadoop 安装部署和基本运行思路方法   Hadoop 介绍

  Hadoop 是个开源可运行于大规模集群上分布式并行编程框架由于分布式存储对于分布式编程来说是必不可少这个框架中还包含了个分布式文件系统 HDFS( Hadoop Distributed File )也许到目前为止Hadoop 还不是那么广为人知其最新版本号也仅仅是 0.16距离 1.0 似乎都还有很长段距离但提及 Hadoop 脉相承另外两个开源项目 Nutch 和 Lucene ( 3者创始人都是 Doug Cutting ),那绝对是大名鼎鼎Lucene 是个用 Java 开发开源高性能全文检索工具包它不是个完整应用而是套简单易用 API 在全世界范围内已有无数软件Software系统Web 网站WebSite基于 Lucene 实现了全文检索功能后来 Doug Cutting 又开创了第个开源 Web 搜索引擎(http://www.nutch.org) Nutch, 它在 Lucene 基础上增加了网络爬虫和些和 Web 相关功能些解析各类文档格式插件等此外Nutch 中还包含了个分布式文件系统用于存储数据从 Nutch 0.8.0 版本的后Doug Cutting 把 Nutch 中分布式文件系统以及实现 MapReduce 算法代码独立出来形成了个新开源项 HadoopNutch 也演化为基于 Lucene 全文检索以及 Hadoop 分布式计算平台个开源搜索引擎

  基于 Hadoop,你可以轻松地编写可处理海量数据分布式并行并将其运行于由成百上千个结点组成大规模计算机集群上从目前情况来看Hadoop 注定会有个辉煌未来:"云计算"是目前灸手可热技术名词全球各大 IT 公司都在投资和推广这种新计算模式而 Hadoop 又被其中几家主要公司用作其"云计算"环境中重要基础软件Software如:雅虎正在借助 Hadoop 开源平台力量对抗 Google, 除了资助 Hadoop 开发团队(Team)外还在开发基于 Hadoop 开源项目 Pig, 这是个专注于海量数据集分析分布式计算Amazon 公司基于 Hadoop 推出了 Amazon S3 ( Amazon Simple Storage Service )提供可靠快速可扩展网络存储服务以及个商用云计算平台 Amazon EC2 ( Amazon Elastic Compute Cloud )在 IBM 公司云计算项目--"蓝云计划"中Hadoop 也是其中重要基础软件SoftwareGoogle 正在跟IBM合作共同推广基于 Hadoop 云计算

  迎接编程方式变革

  在摩尔定律作用下以前员根本不用考虑计算机性能会跟不上软件Software发展约每隔 18 个月CPU 主频就会增加性能也将提升软件Software根本不用做任何改变就可以享受免费性能提升然而由于晶体管电路已经逐渐接近其物理上性能极限摩尔定律在 2005 年左右开始失效了人类再也不能期待单个 CPU 速度每隔 18 个月就翻为我们提供越来越快计算性能Intel, AMD, IBM 等芯片厂商开始从多核这个角度来挖掘 CPU 性能潜力多核时代以及互联网时代到来将使软件Software编程方式发生重大变革基于多核多线程并发编程以及基于大规模计算机集群分布式并行编程是将来软件Software性能提升主要途径

  许多人认为这种编程方式重大变化将带来次软件Software并发危机我们传统软件Software方式基本上是单指令单数据流顺序执行这种顺序执行十分符合人类研究习惯却和并发并行编程格格不入基于集群分布式并行编程能够让软件Software和数据同时运行在连成个网络许多台计算机上,这里台计算机均可以是台普通 PC 机这样分布式并行环境最大优点是可以很容易通过增加计算机来扩充新计算结点并由此获得不可思议海量计算能力, 同时又具有相当强容错能力批计算结点失效也不会影响计算正常进行以及结果正确性Google 就是这么做他们使用了叫做 MapReduce 并行编程模型进行分布式并行编程运行在叫做 GFS ( Google File )分布式文件系统上为全球亿万用户提供搜索服务

  Hadoop 实现了 Google MapReduce 编程模型提供了简单易用编程接口也提供了它自己分布式文件系统 HDFS,和 Google 区别Hadoop 是开源任何人都可以使用这个框架来进行并行编程如果说分布式并行编程难度足以让普通员望而生畏开源 Hadoop 出现极大降低了它门槛读完本文你会发现基于 Hadoop 编程非常简单无须任何并行开发经验你也可以轻松开发出分布式并行并让其令人难以置信地同时运行在数百台机器上然后在短时间内完成海量数据计算你可能会觉得你不可能会拥有数百台机器来运行你并行而事实上随着"云计算"普及任何人都可以轻松获得这样海量计算能力例如现在 Amazon 公司云计算平台 Amazon EC2 已经提供了这种按需计算租用服务有兴趣读者可以去了解这篇系列文章第 3部分将有所介绍

  掌握点分布式并行编程知识对将来员是必不可少Hadoop 是如此简便好用何不尝试下呢?也许你已经急不可耐想试下基于 Hadoop 编程是如何回事了但毕竟这种编程模型和传统顺序大不相同掌握点基础知识才能更好地理解基于 Hadoop 分布式并行是如何编写和运行因此本文会先介绍下 MapReduce 计算模型Hadoop 中分布式文件系统 HDFS, Hadoop 是如何实现并行计算然后才介绍如何安装和部署 Hadoop 框架以及如何运行 Hadoop

  MapReduce 计算模型

  MapReduce 是 Google 公司核心计算模型它将复杂运行于大规模集群上并行计算过程高度抽象到了两个Map 和 Reduce, 这是个令人惊讶简单却又威力巨大模型适合用 MapReduce 来处理数据集(或任务)有个基本要求: 待处理数据集可以分解成许多小数据集而且每个小数据集都可以完全并行地进行处理

  图 1. MapReduce 计算流程

路径中 Program Files 中间有空格定要用双引号将路径引起来)

  至此切就绪可以运行 Hadoop 了以下运行过程需要启动 cygwin, 进入模拟 Linux 环境在下载 Hadoop Core 包中带有几个举例并且已经打包成了 hadoop-0.16.0-examples.jar其中有个 WordCount 功能是统计批文本文件中各个单词出现次数我们先来看看如何运行这个Hadoop 共有 3种运行模式: 单机(非分布式)模式伪分布式运行模式分布式运行模式其中前两种运行模式体现不了 Hadoop 分布式计算优势并没有什么实际意义但对测试及调试很有帮助我们先从这两种模式入手了解基于 Hadoop 分布式并行是如何编写和运行

  单机(非分布式)模式

  这种模式在台单机上运行没有分布式文件系统而是直接读写本地操作系统文件系统

  代码清单1

$ cd /cygdrive/c/hadoop-0.16.0
$ mkdir test-in 
$ cd test-in
#在 test-in 目录下创建两个文本文件, WordCount 将统计其中各个单词出现次数
$ echo "hello world bye world" >file1.txt 
$ echo "hello hadoop goodbye hadoop" >file2.txt
$ cd ..
$ bin/hadoop jar hadoop-0.16.0-examples.jar wordcount test-in test-out
#执行完毕下面查看执行结果:
$ cd test-out
$ cat part-00000
bye   1
goodbye 1
hadoop 2
hello  2
world  2


  注意事项:运行 bin/hadoop jar hadoop-0.16.0-examples.jar wordcount test-in test-out 时务必注意第个参数是 jar, 不是 -jar, 当你用 -jar 时不会告诉你是参数错了报告出来信息是:Exception in thread "" java.lang.NoClassDefFoundError: org/apache/hadoop/util/ProgramDriver, 笔者当时以为是 path 设置问题浪费了不少时间通过分析 bin/hadoop 脚本可知-jar 并不是 bin/hadoop 脚本定义参数此脚本会把 -jar 作为 Java 参数Java -jar 参数表示执行个 Jar 文件(这个 Jar 文件必须是个可执行 Jar,即在 MANIFEST 中定义了主类), 此时外部定义 path 是不起作用因而会抛出 java.lang.NoClassDefFoundError 异常而 jar 是 bin/hadoop 脚本定义参数 Hadoop 自己个工具类 RunJar这个工具类也能够执行个 Jar 文件并且外部定义 path 有效

  伪分布式运行模式

  这种模式也是在台单机上运行但用区别 Java 进程模仿分布式运行中各类结点 ( NameNode, DataNode, JobTracker, TaskTracker, Secondary NameNode )请注意分布式运行中这几个结点区别:

  从分布式存储角度来说集群中结点由个 NameNode 和若干个 DataNode 组成, 另有个 Secondary NameNode 作为 NameNode 备份从分布式应用角度来说集群中结点由个 JobTracker 和若干个 TaskTracker 组成JobTracker 负责任务调度TaskTracker 负责并行执行任务TaskTracker 必须运行在 DataNode 上这样便于数据本地计算JobTracker 和 NameNode 则无须在同台机器上

  (1) 按代码清单2修改 conf/hadoop-site.xml注意 conf/hadoop-default.xml 中是 Hadoop 缺省参数你可以通过读此文件了解 Hadoop 中有哪些参数可供配置但不要修改此文件可通过修改 conf/hadoop-site.xml 改变缺省参数值此文件中设置参数值会覆盖 conf/hadoop-default.xml 同名参数

  代码清单 2

<configuration>
 <property>
  <name>fs.default.name</name>
  <value>localhost:9000</value>
 </property>
 <property>
  <name>mapred.job.tracker</name>
  <value>localhost:9001</value>
 </property>
 <property>
  <name>dfs.replication</name>
  <value>1</value>
 </property>
</configuration>


  参数 fs.default.name 指定 NameNode IP 地址和端口号缺省值是 file:///, 表示使用本地文件系统, 用于单机非分布式模式此处我们指定使用运行于本机 localhost 上 NameNode

  参数 mapred.job.tracker 指定 JobTracker IP 地址和端口号缺省值是 local, 表示在本地同 Java 进程内执行 JobTracker 和 TaskTracker, 用于单机非分布式模式此处我们指定使用运行于本机 localhost 上 JobTracker ( 用个单独 Java 进程做 JobTracker )

  参数 dfs.replication 指定 HDFS 中每个 Block 被复制次数起数据冗余备份作用在典型生产系统中这个数常常设置为3

  (2)配置 SSH,如代码清单3所示:

  代码清单 3

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys


  配置完后执行下 ssh localhost, 确认你机器可以用 SSH 连接并且连接时不需要手工输入密码

  (3)格式化个新分布式文件系统, 如代码清单4所示:

  代码清单 4

$ cd /cygdrive/c/hadoop-0.16.0
$ bin/hadoop namenode –format


  (4) 启动 hadoop 进程, 如代码清单5所示控制台上输出信息应该显示启动了 namenode, datanode, secondary namenode, jobtracker, tasktracker启动完成的后通过 ps –ef 应该可以看到启动了5个新 java 进程

  代码清单 5

$ bin/start-all.sh 
$ ps –ef


  (5) 运行 wordcount 应用, 如代码清单6所示:

  代码清单 6

$ bin/hadoop dfs -put ./test-in input 
#将本地文件系统上 ./test-in 目录拷到 HDFS 根目录上目录名改为 input
#执行 bin/hadoop dfs –help 可以学习各种 HDFS 命令使用
$ bin/hadoop jar hadoop-0.16.0-examples.jar wordcount input output
#查看执行结果:
#将文件从 HDFS 拷到本地文件系统中再查看:
$ bin/hadoop dfs -get output output
$ cat output/*
#也可以直接查看
$ bin/hadoop dfs -cat output/*
$ bin/stop-all.sh #停止 hadoop 进程


  故障诊断

  (1) 执行 $ bin/start-all.sh 启动 Hadoop 进程后会启动5个 java 进程, 同时会在 /tmp 目录下创建 5个 pid 文件记录这些进程 ID 号通过这 5个文件可以得知 namenode, datanode, secondary namenode, jobtracker, tasktracker 分别对应于哪个 Java 进程当你觉得 Hadoop 工作不正常时可以首先查看这5个 java 进程是否在正常运行

  (2) 使用 web 接口访问 http://localhost:50030 可以查看 JobTracker 运行状态访问 http://localhost:50060 可以查看 TaskTracker 运行状态访问 http://localhost:50070 可以查看 NameNode 以及整个分布式文件系统状态浏览分布式文件系统中文件以及 log 等

  (3) 查看 ${HADOOP_HOME}/logs 目录下 log 文件namenode, datanode, secondary namenode, jobtracker, tasktracker 各有个对应 log 文件次运行计算任务也有对应用 log 文件分析这些 log 文件有助于找到故障原因

  结束语

  现在你已经了解了 MapReduce 计算模型分布式文件系统 HDFS分布式并行计算等基本原理, 并且有了个可以运行 Hadoop 环境运行了个基于 Hadoop 并行在下篇文章中你将了解到如何针对个具体计算任务基于 Hadoop 编写自己分布式并行并将其部署运行等内容

  声明:本文仅代表作者个人的观点不代表 IBM 公司的观点

  有关作者

  曹羽中在北京航空航天大学获得计算机软件Software和理论专业硕士学位具有数年 unix 环境下 C 语言,Java,数据库以及电信计费软件Software开发经验技术兴趣还包括 OSGi 和搜索技术他目前在IBM中国系统和科技实验室从事系统管理软件Software开发工作,可以通过 [email protected]和他联系

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: