若是是MapReduce如何实现一个WordCount的?node
MapReduce程序执行分为两个主要阶段:为mapping和reducing,每一个阶段均定义为一个数据处理函数,分别被称为mapper和reducer。shell
运行逻辑数据库
在mapping阶段,MapReduce获取输入数据并将数据单元装入mapper。apache
在reducing阶段,reducer处理来自mapper的全部输出,并给出最终结果。编程
简而言之网络
mapper意味着将输入进行过滤与转换,使reducer能够完成聚合。架构
mapping、reducing、partitioning和shuffling在Hadoop都是什么玩意?他们是如何的无缝的工做在一块儿的?app
为了使他们无缝的工做在一块儿,咱们须要在通用结构上达成一致。负载均衡
MapReduce的数据原语是?框架
MapReduce使用列表和键/值对做为其主要的数据原语,键与值一般为整数或字符串,但也能够是可忽略的假值,或者是复杂的对象类型。
map和reduce函数必须遵循如下对键和值类型的约束?
在MapReduce框架中编写应用程序就是定制化mapper和reducer的过程。
完整的数据流是?
输入 |
输出 |
|
map |
<k1, v1> |
list(<k2, v2>) |
reduce |
<k2, list(v2)> |
list(<k3, v3>) |
1、应用的输入必须为一个键/值对的列表list(<k1, k2>)。
用于处理多个文件的输入格式一般为list(<String filename, String file_content>)。
用于处理日志文件这种大文件输入格式为list(<Integer line_number, String log_event>)
2、含有键/值对的列表被拆分,进而经过调用mapper的map函数对每一个单独的键/值对<k1,v1>进行处理。在这里,键k1常常被mapper所忽略。mapper转换每一个<k1, v1>对并将之放入<k2, v2>对的列表中。这种转换的细节很大程度上决定了MapReduce程序的行为,值得注意的是,处理键/值对能够采用任意的顺序。并且,这种转换必须是封闭的,使得输出仅依赖于一个单独的键/值对。
对2进行解释
对于单词统计,<String filename, String file_content>被输入mapper,而其中的filename被忽略。mapper能够输出一个<String word, Integer count>的列表。咱们发现计数值将在后续阶段聚合,是否能够提早合并?好比不是输出3次<"foo", 1>而是输出1次<"foo", 3>,能够看到,前者更容易编程,后者会得到性能上的优化。
3、全部的mapper的输出 (在概念上) 被聚合到一个包含<k2, v2>对的巨大列表中。全部共享相同k2的对被组织在一块儿造成一个新的键/值对<k2, list<v2>>。框架让reducer来分别处理每个被聚合起来的<k2, list(v2)>。
对3进行解释
一个文档的map输出的列表中可能出现三次<"foo", 1>,而另外一个文档的map输出列表可能出现两次<"foo", 1>。reducer所看到的聚合的对为<"foo", list(1, 1, 1, 1, 1)>。在单词统计中,reducer的输出为<"foo", 5>,表示"foo"在文档集合中总计出现的次数。每个reducer负责不一样的单词。MapReduce框架自动搜索全部的<k3, v3>并将之写入文件。
基于MapReduce重写单词统计程序:
map(String filename, String document) {
List<String> T = tokenize(document);
for each token in T {
emit((String)token, (Integer)1);
}
}
reduce(String token, List<Integer> values) {
Integer sum = 0;
for each value in values {
sum = sum + value;
}
emit((String)token, (Integer)sum)
}
Hadoop的开发平台和生产平台是什么?
Linux是Hadoop公认的开发和生产平台。其余,呵呵...
Hadoop须要Java支持?
固然,Java1.6或更高版本。
Hadoop 1.X的稳定版本是?
1.0.3和1.0.4目前我用过这两个版本,2.X没用过...
如何配置Hadoop与Java的链接,使得在运行hadoop时,它能够自动找到Java组件?
在$HADOOP_PREFIX/conf/hadoop-env.sh中, 输入export JAVA_HOME=/...
为何不用HADOOP_HOME,由于它废弃了。
Hadoop脚本有哪些?
在不启动hadoop时,也可使用该脚本。由于它是shell脚本。
在bin目录下,执行bin/hadoop获得:
Usage:hadoop [--config confdir] COMMAND |
|
这里COMMAND为下列其中一个 |
|
namenode -format |
格式化DFS文件系统 |
secondarynamenode |
运行DFS的secondarynamenode |
namenode |
运行DFS的namenode |
datanode |
运行DFS的datanode |
dfsadmin |
运行DFS的admin客户端 |
fsck |
运行DFS的文件系统检查工具 |
fs |
运行普通文件系统用户客户端 |
balancer |
集群负载均衡工具 |
jobtracker |
运行MapReduce的jobTracker节点 |
pipes |
运行一个Pipes做业 |
tasktracker |
运行MapReduce的tasktracker |
job |
处理MapReduce做业 |
version |
打印版本 |
jar |
运行一个jar文件 |
distcp <srcurl> <desturl> |
递归地复制文件或者目录 |
archive -archiveName NAME <src>* <dest> |
生成一个Hadoop档案 |
daemonlog或CLASSNAME |
获取或设置每一个daemon的log级别 运行名为CLASSNAME的类大多数命令会在使用w/o参数时打出帮助信息 |
Hadoop历史
Lucene、Nutch和Hadoop的关系
Hadoop开始时时Nutch的一个子项目,而Nutch又是Apache Lucene的一个子项目。这3个项目都是Doug Cutting所创立的,每一个项目在逻辑上都是前一个项目的演进。
Lucene是什么?
Lucene是一个功能全面的文本索引和查询库。给定一个文本集合,开发者就可使用Lucene引擎方便地在文档上添加搜索功能。桌面搜索、企业搜索,以及许多领域特定的搜索引擎使用都是Lucene。
Nutch是什么?
做为Luncene的扩展,Nutch的目标可谓雄心勃勃,它试图以Lucene为核心创建一个完整的Web搜索引擎。Nutch为HTML提供了解析器,还具备网页抓取工具、连接图形数据库和其余网络搜索引擎的额外组件。Doug Cutting所设想的Nutch是开放与民主的,能够替代Google等商业产品的垄断技术。
网络搜索引擎与基本的文档搜索引擎的区别是?
除了增长了像抓取器和解析器这样的组件,他俩最大区别就在于规模。
Nutch团队想要打破Google等商业产品的垄断技术,都面临哪些困难?
首先:Lucene的目标是索引数百万的文档,而Nutch应该可以处理十亿的网页,并且不能带来过分的操做开销,这在量级上已经不能相提并论。
其次:Nutch得运行在由商用硬件组成的分布式集群上,Nutch团队面临的挑战是解决软件可扩展性问题,即要在Nutch中创建一个层,来负责分布式处理、冗余、自动故障恢复和负载均衡。
以上这些挑战绝非易事。
Doug Cutting此时在干啥捏?
2004年左右,Google发表了两篇论文来论述Google文件系统(GFS)和MapReduce框架。Google称使用了这两项技术来扩展本身的搜索系统。Doug Cutting当即看到了这些技术能够适用于Nutch,接着他的团队实现了一个新的框架,将Nutch移植上去。这种新的实现立刻提高了Nutch可扩展性。它开始可以处理几亿个网页,并可以运行在几十个节点的集群上。
Doug认识到设计一个专门的项目能够充实两种网络扩展所需的技术,因而就有了Hadoop。
雅虎挺给力哈。
雅虎在2006年1月聘请Doug,让他和一个专项团队一块儿改进Hadoop,并将其做为一个开源项目。两年后Hadoop成为Apache的顶级项目。后来,在2008年2月19日,雅虎宣布其索引网页的生产系统采用了在10000多个核的Linux集群上运行的Hadoop。
资源
Hadoop的官方网站:http://hadoop.apache.org/.
Google文件系统和MapReduce的原始论文很值得一读,能够了解它们的底层设计和架构:
The Google File System
MapReduce: Simplified Data Processing on Large Clusters
原本有连接,可是失效了。童鞋本身搜搜吧。