- 浏览: 282619 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (153)
- unix (2)
- sql (3)
- pl/sql (1)
- cvs (1)
- core java (36)
- OOAD UML (1)
- XML (4)
- JDBC (5)
- Hibernate (1)
- HTML (1)
- javascript (2)
- servlet (2)
- jsp (1)
- AJAX (1)
- Struts1.x (0)
- Struts2.x (5)
- Spring (6)
- EJB (2)
- WebService (2)
- 生活 (2)
- 感情 (0)
- 其他 (9)
- jbuilder2005 (1)
- db2 (1)
- groovy (1)
- 银行业务 (1)
- Android (9)
- java设计模式 (8)
- J2SE (2)
- DataBase (4)
- lucene (2)
- java卡 (1)
- flex (3)
- 烹饪 (1)
- 测试 (1)
- java硬件 (2)
- upnp (3)
- S2SH lib (1)
- nio CshBBrain (1)
- socket (1)
- 二维码 (1)
- 热加载 (1)
- hadoop (3)
- NIO (1)
- 新银行前置机预研 (1)
- springmvc3 (1)
- jvm (1)
- sf (0)
最新评论
-
niwowl:
可以!
gson使用在android使用例子 -
smallbee:
xin_jmail 写道首先感谢楼主的文章,让我知道了lock ...
java ReentrantLock Condition调试记录 -
xin_jmail:
首先感谢楼主的文章,让我知道了lock.newConditio ...
java ReentrantLock Condition调试记录 -
smallbee:
brad2309 写道lz 你的两个messageReceiv ...
基于Apache Mina实现的TCP长连接和短连接实例 -
brad2309:
lz 你的两个messageReceived方法是不是错乱了
基于Apache Mina实现的TCP长连接和短连接实例
Hadoop是由Java编写的,该项目已到得Yahoo的全面支持
—— 分布式计算开源框架Hadoop入门实践(一)
在SIP项目设计的过程中,对于它庞大的日志在开始时就考虑使用任务分解的多线程处理模式来分析统计,在我从前写的文章《Tiger
Concurrent Practice --日志分析并行分解设计与实现》中有所提到。但是由于统计的内容暂时还是十分简单,所以就采用Memcache作为计数
器,结合MySQL就完成了访问 控制以及统计的工作。然而未来,对于海量日志分析的工作,还是需要有所准备。现在最火的技术词汇莫过于“
云计算”,在Open API日益盛行的今天,互联网应用的数据将会越来越有价值,如何去分析这些数据,挖掘其内在价值,就需要分布式计算来
支撑海量数据的分析工作。
回过头来看,早先那种多线程,多任务分解的日志分析设计,其实是分布式计算的一个单机版缩略,如何将这种单机的工作进行分拆,变成协
同工作的集群, 其实就是分布式计算框架设计所涉及的。在去年参加BEA大会的时候,BEA和VMWare合作采用虚拟机来构建集群,无非就是希
望使得计算机硬件能够类似 于应用程序中资源池的资源,使用者无需关心资源的分配情况,从而最大化了硬件资源的使用价值。分布式计算
也是如此,具体的计算任务交由哪一台机器执行,执 行后由谁来汇总,这都由分布式框架的Master来抉择,而使用者只需简单地将待分析内
容提供给分布式计算系统作为输入,就可以得到分布式计算后的结果。
Hadoop是Apache开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用,如亚马逊、Facebook和Yahoo等等。 对于我来说
,最近的一个使用点就是服务集成平台的日志分析。服务集成平台的日志量将会很大,而这也正好符合了分布式计算的适用场景(日志分析和
索引建立就 是两大应用场景)。
当前没有正式确定使用,所以也是自己业余摸索,后续所写的相关内容,都是一个新手的学习过程,难免会有一些错误,只是希望记录下来可
以分享给更多志同道合的朋友。
什么是Hadoop?
搞什么东西之前,第一步是要知道What(是什么),然后是Why(为什么),最后才是How(怎么做)。但很多开发的朋友在做了多年项目以后
,都习惯是先How,然后What,最后才是Why,这样只会让自己变得浮躁,同时往往会将技术误用于不适合的场景。
Hadoop框架中最核心的设计就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇论文所提及而被广为流传的, 简单的一句话解释
MapReduce就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存
储提供了底层支持。
MapReduce从它名字上来看就大致可以看出个缘由,两个动词Map和Reduce,“Map(展开)”就是将一个任务分解成为多个任 务,“Reduce”
就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。这不是什么新思想,其实在前面提到的多线程,多任务的设计就可以找到这
种思想的影子。不论是现实社会,还是在程序设计中,一项工作往往可以被拆分成为多个任务,任务之间的关系可以分为两种:一种是不相关
的任务,可以并行执 行;另一种是任务之间有相互的依赖,先后顺序不能够颠倒,这类任务是无法并行处理的。回到大学时期,教授上课时
让大家去分析关键路径,无非就是找最省时的 任务分解执行方式。在分布式系统中,机器集群就可以看作硬件资源池,将并行的任务拆分,
然后交由每一个空闲机器资源去处理,能够极大地提高计算效率,同时 这种资源无关性,对于计算集群的扩展无疑提供了最好的设计保证。
(其实我一直认为Hadoop的卡通图标不应该是一个小象,应该是蚂蚁,分布式计算就好比 蚂蚁吃大象,廉价的机器群可以匹敌任何高性能的
计算机,纵向扩展的曲线始终敌不过横向扩展的斜线)。任务分解处理以后,那就需要将处理以后的结果再汇总起 来,这就是Reduce要做的
工作。
图1:MapReduce结构示意图
上图就是MapReduce大致的结构图,在Map前还可能会对输入的数据有Split(分割)的过程,保证任务并行效率,在Map之后还会有Shuffle(
混合)的过程,对于提高Reduce的效率以及减小数据传输的压力有很大的帮助。后面会具体提及这些部分的细节。
HDFS是分布式计算的存储基石,Hadoop的分布式文件系统和其他分布式文件系统有很多类似的特质。分布式文件系统基本的几个特点:
对于整个集群有单一的命名空间。
数据一致性。适合一次写入多次读取的模型,客户端在文件没有被成功创建之前无法看到文件存在。
文件会被分割成多个文件块,每个文件块被分配存储到数据节点上,而且根据配置会由复制文件块来保证数据的安全性。
图2:HDFS结构示意图
上图中展现了整个HDFS三个重要角色:NameNode、DataNode和Client。NameNode可以看作是分布式文件系统中的管理 者,主要负责管理文件
系统的命名空间、集群配置信息和存储块的复制等。NameNode会将文件系统的Meta-data存储在内存中,这些信息主要包括 了文件信息、每一
个文件对应的文件块的信息和每一个文件块在DataNode的信息等。DataNode是文件存储的基本单元,它将Block存储在本地 文件系统中,保存
了Block的Meta-data,同时周期性地将所有存在的Block信息发送给NameNode。Client就是需要获取分布式文 件系统文件的应用程序。这里通
过三个操作来说明他们之间的交互关系。
文件写入:
Client向NameNode发起文件写入的请求。
NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。
文件读取:
Client向NameNode发起文件读取的请求。
NameNode返回文件存储的DataNode的信息。
Client读取文件信息。
文件Block复制:
NameNode发现部分文件的Block不符合最小复制数或者部分DataNode失效。
通知DataNode相互复制Block。
DataNode开始直接相互复制。
最后再说一下HDFS的几个设计特点(对于框架设计值得借鉴):
Block的放置:默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在 与指定DataNode非同一Rack上的
DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。备份无非就是为了 数据安全,考虑同一Rack的失败情况以及不同Rack之
间数据拷贝性能问题就采用这种配置方式。
心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。
数 据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和需要平衡DataNode数据交互压力等情况):这里先说一下,使用 HDFS的
balancer命令,可以配置一个Threshold来平衡每一个DataNode磁盘利用率。例如设置了Threshold为10%,那么 执行balancer命令的时候,首
先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode的磁盘利用率超过这个均值 Threshold以上,那么将会把这个
DataNode的block转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。
数据交验:采用CRC32作数据交验。在文件Block写入的时候除了写入数据还会写入交验信息,在读取的时候需要交验后再读入。
NameNode是单点:如果失败的话,任务处理信息将会纪录在本地文件系统和远端的文件系统中。
数 据管道性的写入:当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个 DataNode传
递到备份的DataNode上,一直到所有需要写入这个Block的NataNode都成功写入,客户端才会继续开始写下一个 Block。
安全模式:在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文 件系统中的内容不允许
修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必 要的复
制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改
的出错提示,只 需要等待一会儿即可。
下面综合MapReduce和HDFS来看Hadoop的结构:
图3:Hadoop结构示意图
在Hadoop的系统中,会有一台Master,主要负责NameNode的工作以及JobTracker的工作。JobTracker的主要职责 就是启动、跟踪和调度各个
Slave的任务执行。还会有多台Slave,每一台Slave通常具有DataNode的功能并负责TaskTracker的 工作。TaskTracker根据应用要求来结合本
地数据执行Map任务以及Reduce任务。
说到这里,就要提到分布式计算最重要的一个设计点:Moving Computation is Cheaper than Moving Data。就是在分布式处理中,移动数据
的代价总是高于转移计算的代价。简单来说就是分而治之的工作,需要将数据也分而存储,本地任务处理本地数据然后归 总,这样才会保证
分布式计算的高效性。
为什么要选择Hadoop?
说完了What,简单地说一下Why。官方网站已经给了很多的说明,这里就大致说一下其优点及使用的场景(没有不好的工具,只用不适用的工
具,因此选择好场景才能够真正发挥分布式计算的作用):
可扩展:不论是存储的可扩展还是计算的可扩展都是Hadoop的设计根本。
经济:框架可以运行在任何普通的PC上。
可靠:分布式文件系统的备份恢复机制以及MapReduce的任务监控保证了分布式处理的可靠性。
高效:分布式文件系统的高效数据交互实现以及MapReduce结合Local Data处理的模式,为高效处理海量的信息作了基础准备。
使用场景:个人觉得最适合的就是海量数据的分析,其实Google最早提出MapReduce也就是为了海量数 据分析。同时HDFS最早是为了搜索引擎
实现而开发的,后来才被用于分布式计算框架中。海量数据被分割于多个节点,然后由每一个节点并行计算,将得出的结 果归并到输出。同
时第一阶段的输出又可以作为下一阶段计算的输入,因此可以想象到一个树状结构的分布式计算图,在不同阶段都有不同产出,同时并行和串
行结 合的计算也可以很好地在分布式集群的资源下得以高效的处理。
相关阅读:
Hadoop中的集群配置和使用技巧――分布式计算开源框架Hadoop入门实践(二)。
Hadoop基本流程与应用开发――分布式计算开源框架Hadoop入门实践(三)。
安装:
Hadoop官方网站:http://hadoop.apache.com,上面有中文的版块,可以很方面大家学习。
按照官方网站的配置手册,http://hadoop.apache.org/common/docs/current/cluster_setup.html,首先下载hadoop和java,我下载的是
0.20.1版的,不同的版本配置文件的名字会不一样。
1.安装java,并解压hadoop到指定目录,我解压到/root/hadoop目录下。
2.配置环境变量,在/etc/profile文件中加入
export HADOOP_HOME=/root/hadoop/hadoop-0.20.1
export JAVA_HOME=/usr/java/jdk1.6.0_18
export JRE_HOME=/usr/java/jdk1.6.0_18/jre
export PATH=$PATH:$HADOOP_HOME/bin
执行 $ source /etc/profile
3.设置无密码登陆,在你想作为hadoop系统的几个结点中配置无密码登陆,怎么配置大家可以参考官网的说明。
4.配置hadoop配置文件,网上很多人说只用配置hdfs-site.xml文件,但是根据我的经验,core-site.xml和mapred-site.xml文件也得配置。
我的三个文件:
hdfs-site.xml
<property>
<name>fs.default.name</name>
<value>localhost:9000</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/temp</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/root/hadoop/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/root/hadoop/data</value>
</property>
</property>
core-site.xml
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000/</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://localhost:9001/</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
mapred-site.xml
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000/</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://localhost:9001/</value>
</property>
配置完后,在hadoop-env.sh中加入JAVA_HOME的环境变量,然后再masters和slaves中添加结点
5.执行 $ hadoop namenode -format
$ start-all.sh
执行完后如果不报错误,查看log文件也没错误,文件系统就安装完成了。
执行 $hadoop dfs -mkdir testdir
$hadoop dfs -ls
输出类似你直接执行ls命令。
开发例子:
下载MapReduce Tools for Eclipse插件。http://www.alphaworks.ibm.com/tech/mapreducetools。
3.查找eclipse安装路径,看插件放在哪里。打开eclipse,Help->About Fedora Eclipse->Configuration Details,,,安装路
径:/usr/share/eclipse,下面有个plugins,插件放这里。
4.重启eclipse。
5.设置hadoop路径。Windows->Preferences->Hadoop Home Directory,填写hadoop路径。
6.建MapReduce项目。File->New->Project,选择MapReduce Project,,,,填写项目名,如wordcount
7.写代码。可以new file,也可以右键点击wordcount->import->general->FileSystem,,,导入文件到workspace/wordcount/src,,,主要是
写Map,Reduce类,main函数。
WordCount:http://hadoop.apache.org/common/docs/r0.20.1/cn/mapred_tutorial,(WordCount v1.0)。
8.设置运行时参数。Run->Open Run Dialog,选中要运行的项目,->Arguments。
这里的路径是相对于workspace的,不是相对于hadoop安装路径的。shit。run。。。当然hadoop要start。
WordCount:
1. package org.myorg;
2.
3. import java.io.IOException;
4. import java.util.*;
5.
6. import org.apache.hadoop.fs.Path;
7. import org.apache.hadoop.conf.*;
8. import org.apache.hadoop.io.*;
9. import org.apache.hadoop.mapred.*;
10. import org.apache.hadoop.util.*;
11.
12. public class WordCount {
13.
14. public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
15. private final static IntWritable one = new IntWritable(1);
16. private Text word = new Text();
17.
18. public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter)
throws IOException {
19. String line = value.toString();
20. StringTokenizer tokenizer = new StringTokenizer(line);
21. while (tokenizer.hasMoreTokens()) {
22. word.set(tokenizer.nextToken());
23. output.collect(word, one);
24. }
25. }
26. }
27.
28. public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
29. public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter
reporter) throws IOException {
30. int sum = 0;
31. while (values.hasNext()) {
32. sum += values.next().get();
33. }
34. output.collect(key, new IntWritable(sum));
35. }
36. }
37.
38. public static void main(String[] args) throws Exception {
39. JobConf conf = new JobConf(WordCount.class);
40. conf.setJobName("wordcount");
41.
42. conf.setOutputKeyClass(Text.class);
43. conf.setOutputValueClass(IntWritable.class);
44.
45. conf.setMapperClass(Map.class);
46. conf.setCombinerClass(Reduce.class);
47. conf.setReducerClass(Reduce.class);
48.
49. conf.setInputFormat(TextInputFormat.class);
50. conf.setOutputFormat(TextOutputFormat.class);
51.
52. FileInputFormat.setInputPaths(conf, new Path(args[0]));
53. FileOutputFormat.setOutputPath(conf, new Path(args[1]));
54.
55. JobClient.runJob(conf);
56. }
57. }
参考:
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2/
...
public class WordCount extends Configured implements Tool {
代码清单1
代码清单2
代码清单3
}
为了您的安全,请只打开来源可靠的网址
打开网站 取消
来自: http://hi.baidu.com/zhizhesky/blog/item/289a2d974f5f9e6654fb9600.html
发表评论
-
bike1
2015-12-07 17:10 0rt -
GPRS打印机的原理
2015-07-31 09:09 753一、什么是GPRS无线打印 ... -
关于 expression="execution(* com.xy.service.*.*(..))"
2015-05-21 09:22 2661先来看看这个spring的配 ... -
md5 sha1 java和javascript实现
2015-05-21 08:11 878<%@ page language="ja ... -
RSA帮助类
2014-11-21 09:36 925package com.cmb.fmserver.passp ... -
src2014-2-17
2014-02-17 21:55 0rt -
springmvc例子
2014-02-11 11:09 0rt -
qhdescjyw
2014-02-11 10:33 0rt -
按字节截取含有中文汉字的字符串
2013-05-07 18:55 3103要求实现一个按字节截取字符串的方法,比如对于字符串&quo ... -
SSL多线程安全问题
2013-04-23 15:44 1760项目原因,代码实现 ... -
wait notify 对象锁
2013-03-14 15:21 1162通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的 ... -
eclipse下配置hadoop环境
2012-12-05 11:44 1415按照http://smallbee.iteye.com ... -
centos虚拟机上安装运行hadoop(伪分布)
2012-11-15 15:28 19611、先在确认能否不输入口令就用ssh登录localhost: ... -
nio 远程主机强迫关闭了一个现有的连接 解决方案
2012-10-17 12:37 4603nio编程过程中会出现: Exception in thre ... -
java nio过程
2012-10-17 11:32 12371、服务端:ServerSocketChannel进行监听,注 ... -
socket 客户端连接池实现
2012-10-15 16:58 6716本文参考:http://cache.baidu.com/c?m ... -
java dom 解析xml例子
2012-08-02 14:09 1560XML格式如下: <?xml version=&quo ... -
DM5 java 例子
2012-08-02 10:38 1247package com.cmb.fbcbcserver; ... -
HTTP短连接模拟长连接 连接数不能超过2个
2012-08-01 15:47 2029项目中有用到服务器推技术,也是由于环境因素,银行系统,行内机房 ... -
java注解使用例子
2012-07-30 11:50 11821、注解定义: import java.lang.annot ...
相关推荐
在大数据处理领域,Hadoop是一个不可或缺的开源框架,它提供了分布式存储和计算的能力。Eclipse作为Java开发的主流集成开发环境(IDE),也是编写和调试Hadoop程序的重要工具。"Eclipse Hadoop 例子源代码"是一个...
1. **Hadoop简介**:Hadoop是一个开源框架,主要用于处理和存储大量数据。它的核心组件包括Hadoop Distributed File System (HDFS)和MapReduce,这两个组件共同实现了分布式计算。 2. **Eclipse IDE**:Eclipse是一...
Hadoop是Apache软件基金会开发的一个开源分布式计算框架,主要用于处理和存储海量数据。在Hadoop 1.x时代,为了方便开发者在Eclipse这样的集成开发环境中编写、测试和调试Hadoop MapReduce程序,官方提供了专门的...
在Windows操作系统中,Eclipse是一款广泛使用的Java集成开发环境(IDE),它对于开发分布式计算框架如Hadoop、Spark以及数据仓库工具Hive来说,是非常有用的。本教程将深入讲解如何在Eclipse中集成这些组件,以创建...
3. **Hadoop 1.1.2**:Hadoop是一个开源的分布式计算框架,由Apache软件基金会维护。Hadoop 1.1.2是Hadoop的一个早期版本,它支持大规模数据处理和分析,尤其适合处理存储在HDFS(Hadoop Distributed File System)...
Hadoop是一个开源的分布式计算框架,由Apache基金会维护。它的核心包括HDFS(Hadoop Distributed File System)和MapReduce。HDFS提供了高容错性的分布式存储,而MapReduce则用于处理和生成大规模数据集。Hadoop的这...
Hadoop是一个开源框架,用于处理和存储大量数据,而MapReduce是Hadoop的核心计算模型,它将大数据集分割成小块并在集群中并行处理。 首先,确保你的开发环境已准备就绪。在这个例子中,操作系统是通过Wubi在Windows...
MapReduce是Google的一种分布式计算框架,Hadoop MapReduce是其开源实现,包含Mapper和Reducer两个阶段,适用于大规模数据处理。 5.3 HBase HBase是Google Bigtable的开源实现,是一个分布式的、面向列的NoSQL...
Hadoop是一个开源的分布式计算框架,由Apache基金会维护,专门设计用于处理和存储大规模数据。Hadoop基于Java语言实现,它允许应用程序在大量的计算机节点(集群)上并行处理数据,极大地提高了数据处理效率。对于想...
在Windows环境下使用Eclipse开发Hadoop应用程序,主要是为了利用Java编程语言实现分布式计算任务。Hadoop是一个开源的框架,主要用于处理和存储大量数据,而Eclipse则是一个流行的Java集成开发环境(IDE)。以下是...
在大数据处理领域,Hadoop是不可或缺的开源框架,它提供了分布式文件系统HDFS(Hadoop Distributed File System)和计算模型MapReduce。本教程将详细探讨HDFS的API操作,MapReduce的基本概念,以及如何重写...
在当今大数据时代,Hadoop作为开源分布式计算框架,已经成为处理海量数据的关键技术。本资源“cloud_book-example”是针对Hadoop MapReduce的一份详尽示例,旨在帮助读者深入理解并掌握这一核心技术。 “cloud book...
Hadoop是一个开源框架,由Apache基金会维护,它允许分布式存储和处理大规模数据集。以下是关于Hadoop在Eclipse中配置及使用的详细知识点: 1. **Eclipse集成开发环境**:Eclipse是一款广泛使用的Java IDE,支持多种...
Hadoop环境的搭建包括配置HDFS、YARN(资源调度器)和MapReduce(分布式计算框架)。 2. Scala:Scala是一种多范式编程语言,它兼容Java并具有函数式编程特性。GeoSpark是用Scala编写的,因此你需要安装Scala的运行...