当前位置:文档之家› Hadoop MapReduce教程

Hadoop MapReduce教程

Hadoop MapReduce教程
Hadoop MapReduce教程

Hadoop Map/Reduce教程

目的

这篇教程从用户的角度出发,全面地介绍了Hadoop Map/Reduce框架的各个方面。先决条件

请先确认Hadoop被正确安装、配置和正常运行中。更多信息见:?Hadoop快速入门对初次使用者。

?Hadoop集群搭建对大规模分布式集群。

概述

Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。

一个Map/Reduce 作业(job)通常会把输入的数据集切分为若干独立的数据块,由map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已经失败的任务。通常,Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。

Map/Reduce框架由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。

应用程序至少应该指明输入/输出的位置(路径),并通过实现合适的接口或抽象类提供map和reduce函数。再加上其他作业的参数,就构成了作业配置(job configuration)。然后,Hadoop的job client提交作业(jar包/可执行程序等)和配置信息给JobTracker,后者负责分发这些软件和配置信息给slave、调度任务并监控它们的执行,同时提供状态和诊断信息给job-client。

虽然Hadoop框架是用Java TM实现的,但Map/Reduce应用程序则不一定要用 Java 来写。

?Hadoop Streaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序(例如:Shell工具)来做为mapper和reducer。

?Hadoop Pipes是一个与SWIG兼容的C++ API (没有基于JNI TM技术),它也可用于实现Map/Reduce应用程序。

输入与输出

Map/Reduce框架运转在 键值对上,也就是说,框架把作业的输入看为是一组 键值对,同样也产出一组 键值对做为作业的输出,这两组键值对的类型可能不同。

框架需要对key和value的类(classes)进行序列化操作,因此,这些类需要实现Writable接口。另外,为了方便框架执行排序操作,key类必须实现WritableComparable接口。

一个Map/Reduce 作业的输入和输出类型如下所示:

(input) -> map -> -> combine -> -> reduce -> (output)

例子:WordCount v1.0

在深入细节之前,让我们先看一个Map/Reduce的应用示例,以便对它们的工作方式有一个初步的认识。

WordCount是一个简单的应用,它可以计算出指定数据集中每一个单词出现的次数。

这个应用适用于单机模式,伪分布式模式或完全分布式模式三种Hadoop

安装方式。

源代码

WordCount.java

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 {

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 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 {

29. public void reduce(Text key, Iterator values, OutputCollector 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);

57. }

58. }

59.

用法

假设环境变量HADOOP_HOME对应安装时的根目录,HADOOP_VERSION对应Hadoop 的当前安装版本,编译WordCount.java来创建jar包,可如下操作:

$ mkdir wordcount_classes

$ javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar -d wordcount_classes WordCount.java

$ jar -cvf /usr/joe/wordcount.jar -C wordcount_classes/ .

假设:

?/usr/joe/wordcount/input - 是HDFS中的输入路径

?/usr/joe/wordcount/output - 是HDFS中的输出路径

用示例文本文件做为输入:

$ bin/hadoop dfs -ls /usr/joe/wordcount/input/

/usr/joe/wordcount/input/file01

/usr/joe/wordcount/input/file02

$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file01

Hello World Bye World

$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file02

Hello Hadoop Goodbye Hadoop

运行应用程序:

$ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount

/usr/joe/wordcount/input /usr/joe/wordcount/output

输出是:

$ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000

Bye 1

Goodbye 1

Hadoop 2

Hello 2

World 2

应用程序能够使用-files选项来指定一个由逗号分隔的路径列表,这些路径是task的当前工作目录。使用选项-libjars可以向map和reduce的classpath

中添加jar包。使用-archives选项程序可以传递档案文件做为参数,这些档案文件会被解压并且在task的当前工作目录下会创建一个指向解压生成的目录的符号链接(以压缩包的名字命名)。有关命令行选项的更多细节请参考Commands manual。

使用-libjars和-files运行wordcount例子:

hadoop jar hadoop-examples.jar wordcount -files cachefile.txt -libjars mylib.jar input output

解释

WordCount应用程序非常直截了当。

Mapper(14-26行)中的map方法(18-25行)通过指定的 TextInputFormat(49行)一次处理一行。然后,它通过StringTokenizer 以空格为分隔符将一行切分为若干tokens,之后,输出< , 1> 形式的键值对。

对于示例中的第一个输入,map输出是:

< Hello, 1>

< World, 1>

< Bye, 1>

< World, 1>

第二个输入,map输出是:

< Hello, 1>

< Hadoop, 1>

< Goodbye, 1>

< Hadoop, 1>

关于组成一个指定作业的map数目的确定,以及如何以更精细的方式去控制这些map,我们将在教程的后续部分学习到更多的内容。

WordCount还指定了一个combiner (46行)。因此,每次map运行之后,会对输出按照key进行排序,然后把输出传递给本地的combiner(按照作业的配置与Reducer一样),进行本地聚合。

第一个map的输出是:

< Bye, 1>

< Hello, 1>

< World, 2>

第二个map的输出是:

< Goodbye, 1>

< Hadoop, 2>

< Hello, 1>

Reducer(28-36行)中的reduce方法(29-35行) 仅是将每个key(本例中就是单词)出现的次数求和。

因此这个作业的输出就是:

< Bye, 1>

< Goodbye, 1>

< Hadoop, 2>

< Hello, 2>

< World, 2>

代码中的run方法中指定了作业的几个方面,例如:通过命令行传递过来的输入/输出路径、key/value的类型、输入/输出的格式等等JobConf中的配置信息。随后程序调用了JobClient.runJob(55行)来提交作业并且监控它的执行。

我们将在本教程的后续部分学习更多的关于JobConf, JobClient, Tool和其他接口及类(class)。

Map/Reduce - 用户界面

这部分文档为用户将会面临的Map/Reduce框架中的各个环节提供了适当的细节。这应该会帮助用户更细粒度地去实现、配置和调优作业。然而,请注意每个类/接口的javadoc文档提供最全面的文档;本文只是想起到指南的作用。

我们会先看看Mapper和Reducer接口。应用程序通常会通过提供map和reduce 方法来实现它们。

然后,我们会讨论其他的核心接口,其中包括: JobConf,JobClient,Partitioner, OutputCollector,Reporter, InputFormat,OutputFormat等等。

最后,我们将通过讨论框架中一些有用的功能点(例如:DistributedCache,IsolationRunner等等)来收尾。

核心功能描述

应用程序通常会通过提供map和reduce来实现 Mapper和Reducer接口,它们组成作业的核心。

Mapper

Mapper将输入键值对(key/value pair)映射到一组中间格式的键值对集合。

Map是一类将输入记录集转换为中间格式记录集的独立任务。这种转换的中间格式记录集不需要与输入记录集的类型一致。一个给定的输入键值对可以映射成0个或多个输出键值对。

Hadoop Map/Reduce框架为每一个InputSplit产生一个map任务,而每个InputSplit是由该作业的InputFormat产生的。

概括地说,对Mapper的实现者需要重写JobConfigurable.configure(JobConf)方法,这个方法需要传递一个JobConf参数,目的是完成Mapper的初始化工作。然后,框架为这个任务的InputSplit中每个键值对调用一次

map(WritableComparable, Writable, OutputCollector, Reporter)操作。应用程序可以通过重写Closeable.close()方法来执行相应的清理工作。

输出键值对不需要与输入键值对的类型一致。一个给定的输入键值对可以映射成0个或多个输出键值对。通过调用

OutputCollector.collect(WritableComparable,Writable)可以收集输出的键值对。

应用程序可以使用Reporter报告进度,设定应用级别的状态消息,更新Counters (计数器),或者仅是表明自己运行正常。

框架随后会把与一个特定key关联的所有中间过程的值(value)分成组,然后把它们传给Reducer以产出最终的结果。用户可以通过

JobConf.setOutputKeyComparatorClass(Class)来指定具体负责分组的Comparator。

Mapper的输出被排序后,就被划分给每个Reducer。分块的总数目和一个作业的reduce任务的数目是一样的。用户可以通过实现自定义的 Partitioner来控制哪个key被分配给哪个 Reducer。

用户可选择通过 JobConf.setCombinerClass(Class)指定一个combiner,它负责对中间过程的输出进行本地的聚集,这会有助于降低从Mapper到 Reducer数据传输量。

这些被排好序的中间过程的输出结果保存的格式是(key-len, key, value-len, value),应用程序可以通过JobConf控制对这些中间结果是否进行压缩以及怎么压缩,使用哪种 CompressionCodec。

需要多少个Map?

Map的数目通常是由输入数据的大小决定的,一般就是所有输入文件的总块(block)数。

Map正常的并行规模大致是每个节点(node)大约10到100个map,对于CPU 消耗较小的map任务可以设到300个左右。由于每个任务初始化需要一定的时间,因此,比较合理的情况是map执行的时间至少超过1分钟。

这样,如果你输入10TB的数据,每个块(block)的大小是128MB,你将需要大约82,000个map来完成任务,除非使用setNumMapTasks(int)(注意:这里仅

仅是对框架进行了一个提示(hint),实际决定因素见这里)将这个数值设置得更高。

Reducer

Reducer将与一个key关联的一组中间数值集归约(reduce)为一个更小的数值集。

用户可以通过 JobConf.setNumReduceTasks(int)设定一个作业中reduce任务的数目。

概括地说,对Reducer的实现者需要重写JobConfigurable.configure(JobConf)方法,这个方法需要传递一个JobConf参数,目的是完成Reducer的初始化工作。然后,框架为成组的输入数据中的每个对调用一次reduce(WritableComparable, Iterator, OutputCollector, Reporter)方法。之后,应用程序可以通过重写Closeable.close()来执行相应的清理工作。

Reducer有3个主要阶段:shuffle、sort和reduce。

Shuffle

Reducer的输入就是Mapper已经排好序的输出。在这个阶段,框架通过HTTP为每个Reducer获得所有Mapper输出中与之相关的分块。

Sort

这个阶段,框架将按照key的值对Reducer的输入进行分组(因为不同mapper 的输出中可能会有相同的key)。

Shuffle和Sort两个阶段是同时进行的;map的输出也是一边被取回一边被合并的。

Secondary Sort

如果需要中间过程对key的分组规则和reduce前对key的分组规则不同,那么可以通过 JobConf.setOutputValueGroupingComparator(Class)来指定一个Comparator。再加上JobConf.setOutputKeyComparatorClass(Class)可用于控制中间过程的key如何被分组,所以结合两者可以实现按值的二次排序。

Reduce

在这个阶段,框架为已分组的输入数据中的每个 对调用一次reduce(WritableComparable, Iterator, OutputCollector, Reporter)方法。

Reduce任务的输出通常是通过调用

OutputCollector.collect(WritableComparable, Writable)写入文件系统的。

应用程序可以使用Reporter报告进度,设定应用程序级别的状态消息,更新Counters(计数器),或者仅是表明自己运行正常。

Reducer的输出是没有排序的。

需要多少个Reduce?

Reduce的数目建议是0.95或1.75乘以 ( *

mapred.tasktracker.reduce.tasks.maximum)。

用0.95,所有reduce可以在maps一完成时就立刻启动,开始传输map的输出结果。用1.75,速度快的节点可以在完成第一轮reduce任务后,可以开始第二轮,这样可以得到比较好的负载均衡的效果。

增加reduce的数目会增加整个框架的开销,但可以改善负载均衡,降低由于执行失败带来的负面影响。

上述比例因子比整体数目稍小一些是为了给框架中的推测性任务

(speculative-tasks)或失败的任务预留一些reduce的资源。

无Reducer

如果没有归约要进行,那么设置reduce任务的数目为零是合法的。

这种情况下,map任务的输出会直接被写入由setOutputPath(Path)指定的输出路径。框架在把它们写入FileSystem之前没有对它们进行排序。

Partitioner

Partitioner用于划分键值空间(key space)。

Partitioner负责控制map输出结果key的分割。Key(或者一个key子集)被用于产生分区,通常使用的是Hash函数。分区的数目与一个作业的reduce任务的数目是一样的。因此,它控制将中间过程的key(也就是这条记录)应该发送给m个reduce任务中的哪一个来进行reduce操作。

HashPartitioner是默认的 Partitioner。

Reporter

Reporter是用于Map/Reduce应用程序报告进度,设定应用级别的状态消息,更新Counters(计数器)的机制。

Mapper和Reducer的实现可以利用Reporter 来报告进度,或者仅是表明自己运行正常。在那种应用程序需要花很长时间处理个别键值对的场景中,这种机制是很关键的,因为框架可能会以为这个任务超时了,从而将它强行杀死。另一个避免这种情况发生的方式是,将配置参数mapred.task.timeout设置为一个足够高的值(或者干脆设置为零,则没有超时限制了)。

应用程序可以用Reporter来更新Counter(计数器)。

OutputCollector

OutputCollector是一个Map/Reduce框架提供的用于收集 Mapper或Reducer

输出数据的通用机制(包括中间输出结果和作业的输出结果)。

Hadoop Map/Reduce框架附带了一个包含许多实用型的mapper、reducer和partitioner 的类库。

作业配置

JobConf代表一个Map/Reduce作业的配置。

JobConf是用户向Hadoop框架描述一个Map/Reduce作业如何执行的主要接口。框架会按照JobConf描述的信息忠实地去尝试完成这个作业,然而:

?一些参数可能会被管理者标记为 final,这意味它们不能被更改。

?一些作业的参数可以被直截了当地进行设置(例如:

setNumReduceTasks(int)),而另一些参数则与框架或者作业的其他参数之间微妙地相互影响,并且设置起来比较复杂(例如:

setNumMapTasks(int))。

通常,JobConf会指明Mapper、Combiner(如果有的话)、 Partitioner、Reducer、InputFormat和 OutputFormat的具体实现。JobConf还能指定一组输入文件(setInputPaths(JobConf, Path...) /addInputPath(JobConf, Path)) 和(setInputPaths(JobConf, String) /addInputPaths(JobConf, String)) 以及输出文件应该写在哪儿 (setOutputPath(Path))。

JobConf可选择地对作业设置一些高级选项,例如:设置Comparator;放到DistributedCache上的文件;中间结果或者作业输出结果是否需要压缩以及怎么压缩;利用用户提供的脚本

(setMapDebugScript(String)/setReduceDebugScript(String)) 进行调试;作业是否允许预防性(speculative)任务的执行(setMapSpeculativeExecution(boolean))/(setReduceSpeculativeExecution( boolean)) ;每个任务最大的尝试次数

(setMaxMapAttempts(int)/setMaxReduceAttempts(int)) ;一个作业能容忍的任务失败的百分比

(setMaxMapTaskFailuresPercent(int)/setMaxReduceTaskFailuresPercent(in t)) ;等等。

当然,用户能使用set(String, String)/get(String, String)来设置或者取得应用程序需要的任意参数。然而,DistributedCache的使用是面向大规模只读数据的。

任务的执行和环境

TaskTracker是在一个单独的jvm上以子进程的形式执行 Mapper/Reducer任务(Task)的。

子任务会继承父TaskTracker的环境。用户可以通过JobConf中的

mapred.child.java.opts配置参数来设定子jvm上的附加选项,例如:通过

-Djava.library.path=<> 将一个非标准路径设为运行时的链接用以搜索共享库,等等。如果mapred.child.java.opts包含一个符号@taskid@,它会被替换成map/reduce的taskid的值。

下面是一个包含多个参数和替换的例子,其中包括:记录jvm GC日志; JVM JMX 代理程序以无密码的方式启动,这样它就能连接到jconsole上,从而可以查看子进程的内存和线程,得到线程的dump;还把子jvm的最大堆尺寸设置为512MB,并为子jvm的java.library.path添加了一个附加路径。

mapred.child.java.opts

-Xmx512M -Djava.library.path=/home/mycompany/lib -verbose:gc

-Xloggc:/tmp/@taskid@.gc

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

用户或管理员也可以使用mapred.child.ulimit设定运行的子任务的最大虚拟内存。mapred.child.ulimit的值以(KB)为单位,并且必须大于或等于-Xmx参数传给JavaVM的值,否则VM会无法启动。

注意:mapred.child.java.opts只用于设置task tracker启动的子任务。为守护进程设置内存选项请查看cluster_setup.html

${mapred.local.dir}/taskTracker/是task tracker的本地目录,用于创建本地缓存和job。它可以指定多个目录(跨越多个磁盘),文件会半随机的保存到本地路径下的某个目录。当job启动时,task tracker根据配置文档创建本地job目录,目录结构如以下所示:

?${mapred.local.dir}/taskTracker/archive/ :分布式缓存。这个目录保存本地的分布式缓存。因此本地分布式缓存是在所有task和job间共享的。

?${mapred.local.dir}/taskTracker/jobcache/$jobid/ : 本地job目录。

o${mapred.local.dir}/taskTracker/jobcache/$jobid/work/: job指定的共享目录。各个任务可以使用这个空间做为暂存空间,

用于它们之间共享文件。这个目录通过job.local.dir 参数暴露

给用户。这个路径可以通过API JobConf.getJobLocalDir()来访

问。它也可以被做为系统属性获得。因此,用户(比如运行

streaming)可以调用System.getProperty("job.local.dir")获

得该目录。

o${mapred.local.dir}/taskTracker/jobcache/$jobid/jars/: 存放jar包的路径,用于存放作业的jar文件和展开的jar。job.jar

是应用程序的jar文件,它会被自动分发到各台机器,在task启

动前会被自动展开。使用api JobConf.getJar() 函数可以得到

job.jar的位置。使用JobConf.getJar().getParent()可以访问存

放展开的jar包的目录。

o${mapred.local.dir}/taskTracker/jobcache/$jobid/job.xml:一个job.xml文件,本地的通用的作业配置文件。

o${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid:每个任务有一个目录task-id,它里面有如下的目录结构:

?${mapred.local.dir}/taskTracker/jobcache/$jobid/$ta skid/job.xml:一个job.xml文件,本地化的任务作业配

置文件。任务本地化是指为该task设定特定的属性值。这

些值会在下面具体说明。

?${mapred.local.dir}/taskTracker/jobcache/$jobid/$ta skid/output 一个存放中间过程的输出文件的目录。它保存

了由framwork产生的临时map reduce数据,比如map的输

出文件等。

?${mapred.local.dir}/taskTracker/jobcache/$jobid/$ta skid/work: task的当前工作目录。

?${mapred.local.dir}/taskTracker/jobcache/$jobid/$ta skid/work/tmp: task的临时目录。(用户可以设定属性

mapred.child.tmp 来为map和reduce task设定临时目录。

缺省值是./tmp。如果这个值不是绝对路径,它会把task

的工作路径加到该路径前面作为task的临时文件路径。如

果这个值是绝对路径则直接使用这个值。如果指定的目录

不存在,会自动创建该目录。之后,按照选项

-Djava.io.tmpdir='临时文件的绝对路径'执行java子任

务。 pipes和streaming的临时文件路径是通过环境变量

TMPDIR='the absolute path of the tmp dir'设定的)。如

果mapred.child.tmp有./tmp值,这个目录会被创建。

下面的属性是为每个task执行时使用的本地参数,它们保存在本地化的任务作业配置文件里:

名称类型描述

mapred.job.id String job id

mapred.jar String job目录下job.jar的位置

job.local.dir String job指定的共享存储空间

mapred.tip.id String task id

mapred.task.id String task尝试id

mapred.task.is.map boolean 是否是map task

mapred.task.partition int task在job中的id

map.input.file String map读取的文件名

map.input.start long map输入的数据块的起始位置偏移

map.input.length long map输入的数据块的字节数

mapred.work.output.dir String task临时输出目录

task的标准输出和错误输出流会被读到TaskTracker中,并且记录到${HADOOP_LOG_DIR}/userlogs

DistributedCache可用于map或reduce task中分发jar包和本地库。子jvm 总是把当前工作目录加到 java.library.path 和 LD_LIBRARY_PATH。因此,可以通过System.loadLibrary或System.load装载缓存的库。有关使用分布式缓存加载共享库的细节请参考native_libraries.html

作业的提交与监控

JobClient是用户提交的作业与JobTracker交互的主要接口。

JobClient 提供提交作业,追踪进程,访问子任务的日志记录,获得Map/Reduce 集群状态信息等功能。

作业提交过程包括:

1.检查作业输入输出样式细节

2.为作业计算InputSplit值。

3.如果需要的话,为作业的DistributedCache建立必须的统计信息。

4.拷贝作业的jar包和配置文件到FileSystem上的Map/Reduce系统目录

下。

5.提交作业到JobTracker并且监控它的状态。

作业的历史文件记录到指定目录的"_logs/history/"子目录下。这个指定目录由https://www.doczj.com/doc/fb1478399.html,er.location设定,默认是作业输出的目录。因此默认情况下,文件会存放在mapred.output.dir/_logs/history目录下。用户可以设置https://www.doczj.com/doc/fb1478399.html,er.location为none来停止日志记录。

用户使用下面的命令可以看到在指定目录下的历史日志记录的摘要。

$ bin/hadoop job -history output-dir

这个命令会打印出作业的细节,以及失败的和被杀死的任务细节。

要查看有关作业的更多细节例如成功的任务、每个任务尝试的次数(task attempt)等,可以使用下面的命令

$ bin/hadoop job -history all output-dir

用户可以使用OutputLogFilter从输出目录列表中筛选日志文件。

一般情况,用户利用JobConf创建应用程序并配置作业属性,然后用 JobClient 提交作业并监视它的进程。

作业的控制

有时候,用一个单独的Map/Reduce作业并不能完成一个复杂的任务,用户也许要链接多个Map/Reduce作业才行。这是容易实现的,因为作业通常输出到分布式文件系统上的,所以可以把这个作业的输出作为下一个作业的输入实现串联。

然而,这也意味着,确保每一作业完成(成功或失败)的责任就直接落在了客户身上。在这种情况下,可以用的控制作业的选项有:

?runJob(JobConf):提交作业,仅当作业完成时返回。

?submitJob(JobConf):只提交作业,之后需要你轮询它返回的RunningJob 句柄的状态,并根据情况调度。

?JobConf.setJobEndNotificationURI(String):设置一个作业完成通知,可避免轮询。

作业的输入

InputFormat为Map/Reduce作业描述输入的细节规范。

Map/Reduce框架根据作业的InputFormat来:

1.检查作业输入的有效性。

2.把输入文件切分成多个逻辑InputSplit实例,并把每一实例分别分发给

一个 Mapper。

3.提供RecordReader的实现,这个RecordReader从逻辑InputSplit中获

得输入记录,这些记录将由Mapper处理。

基于文件的InputFormat实现(通常是FileInputFormat的子类)默认行为是按照输入文件的字节大小,把输入数据切分成逻辑分块(logical InputSplit )。其中输入文件所在的FileSystem的数据块尺寸是分块大小的上限。下限可以设置mapred.min.split.size 的值。

考虑到边界情况,对于很多应用程序来说,很明显按照文件大小进行逻辑分割是不能满足需求的。在这种情况下,应用程序需要实现一个RecordReader来处理记录的边界并为每个任务提供一个逻辑分块的面向记录的视图。

TextInputFormat是默认的InputFormat。

如果一个作业的Inputformat是TextInputFormat,并且框架检测到输入文件的后缀是.gz和.lzo,就会使用对应的CompressionCodec自动解压缩这些文件。但是需要注意,上述带后缀的压缩文件不会被切分,并且整个压缩文件会分给一个mapper来处理。

InputSplit

InputSplit是一个单独的Mapper要处理的数据块。

一般的InputSplit 是字节样式输入,然后由RecordReader处理并转化成记录样式。

FileSplit是默认的InputSplit。它把 map.input.file 设定为输入文件的路径,输入文件是逻辑分块文件。

RecordReader

RecordReader从InputSlit读入对。

一般的,RecordReader 把由InputSplit 提供的字节样式的输入文件,转化成由Mapper处理的记录样式的文件。因此RecordReader负责处理记录的边界情况和把数据表示成keys/values对形式。

作业的输出

OutputFormat描述Map/Reduce作业的输出样式。

Map/Reduce框架根据作业的OutputFormat来:

1.检验作业的输出,例如检查输出路径是否已经存在。

2.提供一个RecordWriter的实现,用来输出作业结果。输出文件保存在

FileSystem上。

TextOutputFormat是默认的 OutputFormat。

任务的Side-Effect File

在一些应用程序中,子任务需要产生一些side-file,这些文件与作业实际输出结果的文件不同。

在这种情况下,同一个Mapper或者Reducer的两个实例(比如预防性任务)同时打开或者写 FileSystem上的同一文件就会产生冲突。因此应用程序在写文件的时候需要为每次任务尝试(不仅仅是每次任务,每个任务可以尝试执行很多次)选取一个独一无二的文件名(使用attemptid,例如

task_200709221812_0001_m_000000_0)。

为了避免冲突,Map/Reduce框架为每次尝试执行任务都建立和维护一个特殊的${mapred.output.dir}/_temporary/_${taskid}子目录,这个目录位于本次尝试执行任务输出结果所在的FileSystem上,可以通过 ${mapred.work.output.dir}来访问这个子目录。对于成功完成的任务尝试,只有

${mapred.output.dir}/_temporary/_${taskid}下的文件会移动到${mapred.output.dir}。当然,框架会丢弃那些失败的任务尝试的子目录。这种处理过程对于应用程序来说是完全透明的。

在任务执行期间,应用程序在写文件时可以利用这个特性,比如通过FileOutputFormat.getWorkOutputPath()获得${mapred.work.output.dir}目录,并在其下创建任意任务执行时所需的side-file,框架在任务尝试成功时

会马上移动这些文件,因此不需要在程序内为每次任务尝试选取一个独一无二的名字。

注意:在每次任务尝试执行期间,${mapred.work.output.dir} 的值实际上是${mapred.output.dir}/_temporary/_{$taskid},这个值是Map/Reduce框架创建的。所以使用这个特性的方法是,在 FileOutputFormat.getWorkOutputPath() 路径下创建side-file即可。

对于只使用map不使用reduce的作业,这个结论也成立。这种情况下,map的

输出结果直接生成到HDFS上。

RecordWriter

RecordWriter生成 对到输出文件。

RecordWriter的实现把作业的输出结果写到 FileSystem。

其他有用的特性

Counters

Counters 是多个由Map/Reduce框架或者应用程序定义的全局计数器。每一个Counter可以是任何一种 Enum类型。同一特定Enum类型的Counter可以汇集到一个组,其类型为Counters.Group。

应用程序可以定义任意(Enum类型)的Counters并且可以通过 map 或者 reduce 方法中的Reporter.incrCounter(Enum, long)或者

Reporter.incrCounter(String, String, long)更新。之后框架会汇总这些全局counters。

DistributedCache

DistributedCache可将具体应用相关的、大尺寸的、只读的文件有效地分布放置。

DistributedCache 是Map/Reduce框架提供的功能,能够缓存应用程序所需的文件(包括文本,档案文件,jar文件等)。

应用程序在JobConf中通过url(hdfs://)指定需要被缓存的文件。DistributedCache假定由hdfs://格式url指定的文件已经在 FileSystem上了。

Map-Redcue框架在作业所有任务执行之前会把必要的文件拷贝到slave节点上。它运行高效是因为每个作业的文件只拷贝一次并且为那些没有文档的slave节点缓存文档。

DistributedCache 根据缓存文档修改的时间戳进行追踪。在作业执行期间,当前应用程序或者外部程序不能修改缓存文件。

distributedCache可以分发简单的只读数据或文本文件,也可以分发复杂类型的文件例如归档文件和jar文件。归档文件(zip,tar,tgz和tar.gz文件)在slave节点上会被解档(un-archived)。这些文件可以设置执行权限。

用户可以通过设置mapred.cache.{files|archives}来分发文件。如果要分发多个文件,可以使用逗号分隔文件所在路径。也可以利用API来设置该属性:DistributedCache.addCacheFile(URI,conf)/

DistributedCache.addCacheArchive(URI,conf) and

DistributedCache.setCacheFiles(URIs,conf)/

DistributedCache.setCacheArchives(URIs,conf)其中URI的形式是

hdfs://host:port/absolute-path#link-name 在Streaming程序中,可以通过命令行选项 -cacheFile/-cacheArchive 分发文件。

用户可以通过 DistributedCache.createSymlink(Configuration)方法让DistributedCache 在当前工作目录下创建到缓存文件的符号链接。或者通过设置配置文件属性mapred.create.symlink为yes。分布式缓存会截取URI的片段作为链接的名字。例如,URI是 hdfs://namenode:port/lib.so.1#lib.so,

则在task当前工作目录会有名为lib.so的链接,它会链接分布式缓存中的lib.so.1。

DistributedCache可在map/reduce任务中作为一种基础软件分发机制使用。它可以被用于分发jar包和本地库(native libraries)。DistributedCache.addArchiveToClassPath(Path, Configuration)和DistributedCache.addFileToClassPath(Path, Configuration) API能够被用于缓存文件和jar包,并把它们加入子jvm的classpath。也可以通过设置配置文档里的属性 mapred.job.classpath.{files|archives}达到相同的效果。缓存文件可用于分发和装载本地库。

Tool

Tool接口支持处理常用的Hadoop命令行选项。

Tool 是Map/Reduce工具或应用的标准。应用程序应只处理其定制参数,要把标准命令行选项通过ToolRunner.run(Tool, String[])委托给GenericOptionsParser处理。

Hadoop命令行的常用选项有:

-conf

-D

-fs

-jt

IsolationRunner

IsolationRunner是帮助调试Map/Reduce程序的工具。

使用IsolationRunner的方法是,首先设置 keep.failed.tasks.files属性为true (同时参考keep.tasks.files.pattern)。

然后,登录到任务运行失败的节点上,进入 TaskTracker的本地路径运行IsolationRunner:

$ cd /taskTracker/${taskid}/work

$ bin/hadoop org.apache.hadoop.mapred.IsolationRunner ../job.xml

IsolationRunner会把失败的任务放在单独的一个能够调试的jvm上运行,并且采用和之前完全一样的输入数据。

Profiling

Profiling是一个工具,它使用内置的java profiler工具进行分析获得(2-3个)map或reduce样例运行分析报告。

用户可以通过设置属性mapred.task.profile指定系统是否采集profiler信息。利用api JobConf.setProfileEnabled(boolean)可以修改属性值。如果设为true,则开启profiling功能。profiler信息保存在用户日志目录下。缺省情况,profiling功能是关闭的。

如果用户设定使用profiling功能,可以使用配置文档里的属性

mapred.task.profile.{maps|reduces} 设置要profile map/reduce task的范围。设置该属性值的api是JobConf.setProfileTaskRange(boolean,String)。范围的缺省值是0-2。

用户可以通过设定配置文档里的属性mapred.task.profile.params 来指定profiler配置参数。修改属性要使用api JobConf.setProfileParams(String)。当运行task时,如果字符串包含%s。它会被替换成profileing的输出文件名。这些参数会在命令行里传递到子JVM中。缺省的profiling 参数是

-agentlib:hprof=cpu=samples,heap=sites,force=n,thread=y,verbose=n,fil e=%s。

调试

Map/Reduce框架能够运行用户提供的用于调试的脚本程序。当map/reduce任务失败时,用户可以通过运行脚本在任务日志(例如任务的标准输出、标准错误、系统日志以及作业配置文件)上做后续处理工作。用户提供的调试脚本程序的标准输出和标准错误会输出为诊断文件。如果需要的话这些输出结果也可以打印在用户界面上。

在接下来的章节,我们讨论如何与作业一起提交调试脚本。为了提交调试脚本,首先要把这个脚本分发出去,而且还要在配置文件里设置。

如何分发脚本文件:

用户要用DistributedCache机制来分发和链接脚本文件

如何提交脚本:

一个快速提交调试脚本的方法是分别为需要调试的map任务和reduce任务设置"mapred.map.task.debug.script" 和 "mapred.reduce.task.debug.script" 属性的值。这些属性也可以通过JobConf.setMapDebugScript(String) 和JobConf.setReduceDebugScript(String) API来设置。对于streaming,可以分别为需要调试的map任务和reduce任务使用命令行选项-mapdebug 和

-reducedegug来提交调试脚本。

脚本的参数是任务的标准输出、标准错误、系统日志以及作业配置文件。在运行map/reduce失败的节点上运行调试命令是:

$script $stdout $stderr $syslog $jobconf

Hadoop快速入门

?项目 ?维基 ?Hadoop 0.18文档 Last Published: 07/01/2009 00:38:20 文档 概述 快速入门 集群搭建 HDFS构架设计 HDFS使用指南 HDFS权限指南 HDFS配额管理指南 命令手册 FS Shell使用指南 DistCp使用指南 Map-Reduce教程 Hadoop本地库 Streaming Hadoop Archives Hadoop On Demand API参考 API Changes 维基 常见问题 邮件列表 发行说明 变更日志 PDF Hadoop快速入门 ?目的 ?先决条件 o支持平台 o所需软件 o安装软件 ?下载 ?运行Hadoop集群的准备工作 ?单机模式的操作方法 ?伪分布式模式的操作方法

o配置 o免密码ssh设置 o执行 ?完全分布式模式的操作方法 目的 这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop 分布式文件系统(HDFS)和Map-Reduce框架有所体会,比如在HDFS上运行示例程序或简单作业等。 先决条件 支持平台 ?GNU/Linux是产品开发和运行的平台。 Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证。 ?Win32平台是作为开发平台支持的。由于分布式操作尚未在Win32平台上充分测试,所以还不作为一个生产平台被支持。 所需软件 Linux和Windows所需软件包括: 1.Java TM1.5.x,必须安装,建议选择Sun公司发行的Java版本。 2.ssh必须安装并且保证sshd一直运行,以便用Hadoop 脚本管理远端 Hadoop守护进程。 Windows下的附加软件需求 1.Cygwin - 提供上述软件之外的shell支持。 安装软件 如果你的集群尚未安装所需软件,你得首先安装它们。 以Ubuntu Linux为例: $ sudo apt-get install ssh $ sudo apt-get install rsync

黑马程序员 Java教程:告诉你Hadoop是什么

Hadoop是一种分析和处理大数据的软件平台,是Appach的一个用Java语言所实现的开源软件的加框,在大量计算机组成的集群当中实现了对于海量的数据进行的分布式计算。 Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算. 大数据在Hadoop处理的流程可以参照下面简单的图来进行理解:数据是通过了Hadoop的集群处理后得到的结果。 HDFS:Hadoop Distributed File System,Hadoop的分布式文件系统。 大文件被分成默认64M一块的数据块分布存储在集群机器中。如下图中的文件data1被分成3块,这3块以冗余镜像的方式分布在不同的机器中。

MapReduce:Hadoop为每一个input split创建一个task调用Map计算,在此task中依次处理此split中的一个个记录(record),map会将结果以key–value 的形式输出,hadoop负责按key值将map的输出整理后作为Reduce的输入,Reduce Task的输出为整个job的输出,保存在HDFS上。

Hadoop的集群主要由NameNode,DataNode,Secondary NameNode,JobTracker,TaskTracker组成。如下图所示: NameNode中记录了文件是如何被拆分成block以及这些block都存储到了那些DateNode节点.NameNode同时保存了文件系统运行的状态信息. DataNode中存储的是被拆分的blocks.Secondary NameNode帮助NameNode收集文件系统运行的状态信息。JobTracker当有任务提交到Hadoop集群的时候负责Job的运行,负责调度多个TaskTracker.TaskTracker负责某一个map或者reduce任务。

(完整word版)hadoop安装教程

1、VMware安装 我们使用Vmware 14的版本,傻瓜式安装即可。(只要) 双击 如过 2.安装xshell 双击 3.安装镜像: 解压centos6.5-empty解压 双击打开CentOS6.5.vmx 如果打不开,在cmd窗口中输入:netsh winsock reset 然后重启电脑。 进入登录界面,点击other 用户名:root 密码:root 然后右键open in terminal 输入ifconfig 回车 查看ip地址

打开xshell

点击链接 如果有提示,则接受 输入用户名:root 输入密码:root 4.xshell连接虚拟机 打开虚拟机,通过ifconfig查看ip

5.安装jkd 1.解压Linux版本的JDK压缩包 mkdir:创建目录的命令 rm -rf 目录/文件删除目录命令 cd 目录进入指定目录 rz 可以上传本地文件到当前的linux目录中(也可以直接将安装包拖到xshell窗口) ls 可以查看当前目录中的所有文件 tar 解压压缩包(Tab键可以自动补齐文件名)

pwd 可以查看当前路径 文档编辑命令: vim 文件编辑命令 i:进入编辑状态 Esc(左上角):退出编辑状态 :wq 保存并退出 :q! 不保存退出 mkdir /home/software #按习惯用户自己安装的软件存放到/home/software目录下 cd /home/software #进入刚刚创建的目录 rz 上传jdk tar包 #利用xshell的rz命令上传文件(如果rz命令不能用,先执行yum install lrzsz -y ,需要联网) tar -xvf jdk-7u51-linux-x64.tar.gz #解压压缩包 2.配置环境变量 1)vim /etc/profile 2)在尾行添加 #set java environment JAVA_HOME=/home/software/jdk1.8.0_65 JAVA_BIN=/home/software/jdk1.8.0_65/bin PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH Esc 退出编辑状态 :wq #保存退出 注意JAVA_HOME要和自己系统中的jdk目录保持一致,如果是使用的rpm包安

hadoop平台搭建 多节点详细教程 一次就能搭建成功

Hadoop平台搭建说明 1.Hadoop节点规划 本次安装规划使用三个节点,每个节点都使用centos系统。 三个节点的hostname分别规划为:centoshadoop1、centoshadoop2、centoshadoop3(此处为本教程参数,可根据实际环境情况修改) 三个节点的ip地址分别规划为:192.168.65.57、192.168.65.58、192.168.65.59(此处为本教程参数,根据实际环境情况修改) 2.平台搭建使用的软件 下载如下软件 操作系统安装包:Centos6.3_x64 Jdk安装包:jdk-6u37-linux-x64.bin Hadoop安装包:hadoop-1.1.2.tar.gz 3.安装centos操作系统 安装三个节点的操作系统,安装过程省略。 4.配置centoshadoop1节点 4.1.修改节点hostname [root@localhost ~]# vi /etc/sysconfig/network HOSTNAME=centoshadoop1 [root@localhost ~]# vi /etc/hosts …… 192.168.65.57 centoshadoop1 192.168.65.58centoshadoop2 192.168.65.59centoshadoop3 [root@localhost ~]#reboot

4.2.关闭iptables防火墙 [root@centoshadoop1~]#service iptables stop 注意每次操作系统重启后都要操作 4.3.建立无ssh密码登陆 生成签名文件 [root@centoshadoop1~]#cd /root [root@centoshadoop1~]#ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa [root@centoshadoop1~]#cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys [root@centoshadoop1~]# 测试本地SSH无密码登录 [root@centoshadoop1~]#sshcentoshadoop1 4.4.安装jdk 上传jdk-6u37-linux-x64.bin到/root目录下 [root@centoshadoop1~]#chmod 777 jdk-6u37-linux-x64.bin [root@centoshadoop1~]#./jdk-6u37-linux-x64.bin [root@centoshadoop1~]#ll 查看生成jdk-6u37-linux-x64目录 4.5.安装hadoop软件 上传hadoop-1.1.2.tar.gz到/root目录下 [root@centoshadoop1~]#tar -zvxf hadoop-1.1.2.tar.gz [root@centoshadoop1~]#ll 查看生成hadoop-1.1.2目录 [root@centoshadoop1~]#vi /conf/core-site.xml https://www.doczj.com/doc/fb1478399.html, hdfs://192.168.65.57:9000

CentOS6.6安装hadoop2.7.3教程

CentOS6.6安装Hadoop2.7.3教程大胡子工作室

目录 1 前言 (1) 2 安装准备 (1) 2.1 所需软件 (1) 2.1.1 CentOS6.6minimal (1) 2.1.2 Hadoop 2.7.3 (1) 2.2 安装规划 (1) 3 安装步骤 (2) 3.1 安装操作系统 (2) 3.2 操作系统基本配置 (13) 3.2.1 配置IP地址 (13) 3.2.2 配置hostname及网关 (14) 3.2.3 关闭selinux (15) 3.2.4 设置limit最大连接数 (15) 3.2.5 配置DNS (16) 3.2.6 配置本地hosts (17) 3.2.7 添加hadoop用户 (17) 3.2.8 关闭防火墙 (18) 3.3 安装jdk (19) 3.4 配置ssh免密码登录 (19) 3.4.1 切换hadoop用户 (20) 3.4.2 生成免登陆ssh证书 (20) 3.4.3 追加授权 (20) 3.5 配置master计算机的hadoop (22) 3.5.1 解压缩hadoop文件 (23) 3.5.2 创建存储hadoop数据文件的目录 (23) 3.5.3 设置hadoop的环境变量 (23) 3.5.4 配置core-site.xml文件 (26) 3.5.5 配置hdfs-site.xml文件 (28) 3.5.6 配置mapred-site.xml文件 (30) 3.5.7 配置yarn-site.xml文件 (32) 3.5.8 配置slaves文件 (34) 3.5.9 格式化HDFS文件系统 (34) 3.6 配置slave计算机的hadoop (34) 3.6.1 创建hadoop文件夹 (35) 3.6.2 将文件分发给slave计算机 (35) 3.6.3 设置hadoop的环境变量 (35) 4 hadoop的控制 (36) 4.1 hadoop的启动 (36) 4.2 hadoop的关闭 (36)

hadoop环境配置入门教程

ubuntu 下安装配置hadoop 1.0.4 第一次搞hadoop,折腾我2天,功夫不负有心人,终于搞好了,现在来分享下, 我的环境 操作系统:wmv虚拟机中的ubuntu12.04 hadoop版本:hadoop-1.0.4(听说是稳定版就下了) eclipse版本:eclipse-jee-indigo-SR2-win32 1.先安装好jdk,然后配置好jdk的环境变量,在这里我就不累赘了!网上多的是 2.安装ssh这个也不用说了 2.把hadoop-1.0.4.tar.gz拖到虚拟机中,解压,比如: /home/wys/Documents/hadoop-1.0.4/ (有的还单独建了个用户,为了舍去不必要的麻烦我都是用root用户来操作的) 3.修改hadoop-1.0.4/conf 下面的core-site.xml文件,如下: https://www.doczj.com/doc/fb1478399.html, hdfs://192.168.116.128:9000 hadoop.tmp.dir /home/wys/Documents/tmp

192.168.116.128这个是虚拟机中ubuntu的ip,听说用localhost,127.0.0.1都不行,我没试过,直接写上ip地址了 tmp是预先创建的一个目录 4.修改hadoop-env.sh 把export JAVA_HOME=xxxxxx 这行的#号去掉,写上jdk的目录路径 5.修改hdfs-site.xml如下: dfs.replication 1 dfs.permissions false 说明:为了以后用eclipse开发出现各种问题,就把权限关了!

Hadoop全套视频教程免费下载

Hadoop全套视频教程免费下载 Hadoop全套视频教程全套免费下载,尽在千锋教育官方网站,海量的学习资料等你来领,其专业的大数据视频教程让你在学习大数据的路上走的更加轻松;其幽默的讲师风格让你在学习枯燥的大数据时更加轻松,学习效率倍增。 除此之外,千锋小编还为你带来了学习Hadoop的技巧,让你轻松掌握Hadoop技术。 Hadoop框架自身是由Java语言编写,天生支持使用Java语言编写作业。在实际生产环境中也多使用其他语言如Python,此时需要借助Hadoop自带的一些工具。 Hadoop运行在Linux环境中,想在本地安装Hadoop需要先安装Linux 系统。为了节省学习成本我们使用虚拟机在本地电脑模拟多台硬件搭建集群。应该选择哪种语言进行作业? Java Hadoop本身由Java编写,对Java语言支持很好,但使用Java代码写起来非常繁琐冗长。

Python 在大数据的实际生产中,使用Python进行作业开发也非常普遍。Python 语法结构清晰、开发迅速、维护成本低是它的优势。 假如使用Python进行作业开发,可借助Hadoop Streaming或者Pydoop。 具体需要掌握哪些基础技能? Linux 1、熟练使用linux常用命令及网络配置; 2、熟悉用户以及权限管理操作; 3、熟悉软件包以及系统命令管理; 4、掌握shell编程。 虚拟机 1、虚拟机的安装; 2、linux系统的安装; 3、虚拟机网络的配置。 1、掌握javaSE的基础技能; 2、不需要掌握java Web及各种框架知识。 掌握Python的基础语句、语法、函数等。 对于java和python的选择上,大家根据自身情况或者目标企业使用的语言来选择。学习Hadoop首先要了解一下这3种搭建方式:单机模式、分布式模式和伪分布式模式,其中伪分布和完全分布要能够熟练掌握。 之后再学习Hadoop生态圈中各个组件的知识,包括MapReduce、Yarn、hdfs、hive、HBase、Flume、sqoop、zookeepe、Mahout等。

自学Hadoop HDFS实例教程

自学Hadoop HDFS实例教程 HDFS(Hadoop Distribute File System)是一个分布式文件系统,是Hadoop的重要成员。这次千锋教育就HDFS给大家带来实例教程。 实例:文件系统的问题 文件系统是操作系统提供的磁盘空间管理服务,只需要我们制定把文件放到哪儿,从哪个路径读取文件就可以了,不用关心文件在磁盘上是如何存放的。 当文件所需空间大于本机磁盘空间时,如何处理呢? 一是加磁盘,但是加到一定程度就有限制了;二是加机器,用远程共享目录的方式提供网络化的存储,这种方式可以理解为分布式文件系统的雏形,可以把不同文件放入不同的机器中,空间不足了可继续加机器,突破了存储空间的限制。但这个方式有多个问题: 1.单机负载可能极高 2.某个文件是热门,很多用户经常读取这个文件,就使得次文件所在机器的访问压力极高。 3.数据不安全 4.如果某个文件所在的机器出现故障,这个文件就不能访问了,可靠性很差。 文件整理困难 5.想把一些文件的存储位置进行调整,就需要看目标机器的空间是否够用,并且需要自己维护文件位置,如果机器非常多,操作就极为复杂。

HDFS的解决思路: HDFS是个抽象层,底层依赖很多独立的服务器,对外提供统一的文件管理功能,对于用户来讲,感觉就像在操作一台机器,感受不到HDFS下面的多台服务器。 例如用户访问HDFS中的/a/b/c.mpg这个文件,HDFS负责从底层相应服务器中读取,然后返回给用户,这样用户只需和HDFS打交道,不关心这个文件是怎么存储的。 例如用户需要保存一个文件/a/b/xxx.avi。 HDFS首先会把这个文件进行分割,例如分为4块,然后分别放到不同服务器上。 这样做有个好处,不怕文件太大,并且读文件的压力不会全部集中在一台服务器上。但如果某台服务器坏了,文件就读不全了。 HDFS为保证文件可靠性,会把每个文件块进行多个备份: 块1:A B C 块2:A B D 块3:B C D 块4:A C D 这样文件的可靠性就大大增强了,即使某个服务器坏了,也可以完整读取文件。 同时还带来一个很大的好处,就是增加了文件的并发访问能力,比如多个用户读取这个文件时,都要读块1,HDFS可以根据服务器的繁忙程度,选择从那台服务器读块1。

(完整版)hadoop安装教程

1、VMware 安装 我们使用Vmware 14的版本,傻瓜式安装即可。(只要) 双击如过 2.安装xshell 双击 3.安装镜像: 解压centos6.5-empty 解压双击打开 CentOS6.5.vmx 如果打不开,在cmd 窗口中输入:netsh winsock reset 然后重启电脑。

进入登录界面,点击other 用户名:root 密码:root 然后右键open in terminal 输入ifconfig回车 查看ip地址 xshell 打开

点击链接 如果有提示,则接受

输入用户名:root 输入密码:root 4.xshell 连接虚拟机 打开虚拟机,通过ifconfig 查看 ip 5.安装jkd

1. 解压Linux版本的JDK压缩包 mkdir:创建目录的命令 rm -rf 目录/文件删除目录命令 cd 目录进入指定目录 rz可以上传本地文件到当前的linux目录中(也可以直接将安装包拖到xshell窗口) ls可以查看当前目录中的所有文件 tar解压压缩包(Tab键可以自动补齐文件名) pwd可以查看当前路径 文档编辑命令: vim文件编辑命令 i:进入编辑状态 Esc(左上角):退出编辑状态 :wq保存并退出 :q!不保存退出 mkdir /home/software#按习惯用户自己安装的软件存放到 /home/software目录下 cd /home/software #进入刚刚创建的目录

rz 上传jdk tar包#利用xshell的rz命令上传文件(如果rz 命令不能用,先执行yum install lrzsz -y ,需要联网) tar -xvf jdk-7u51-linux-x64.tar.gz#解压压缩包 2. 配置环境变量 1)vim /etc/profile 2)在尾行添加 #set java environment JAVA_HOME=/home/software/jdk1.8.0_65 JAVA_BIN=/home/software/jdk1.8.0_65/bin PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH Esc退出编辑状态 :wq#保存退出 注意JAVA_HOME要和自己系统中的jdk目录保持一致,如果是使用的rpm包安 装的jdk,安装完之后jdk的根目录为:/usr/java/jdk1.8.0_111,也可 以通过命令:rpm -qal|grep jdk 来查看目录 3)source /etc/profile使更改的配置立即生效 4)java -version查看JDK版本信息。如显示版本号则证明成功。

Hadoop搭建全过程

Hadoop搭建全过程【千锋】 Hadoop主要应用于数据量大、海量计算、数据挖掘、一次写入多次读取、非高实时性要求的场景。Hadoop可以作为分布式存储框架存储大规模数据,数据的价值越来越被企业重视,被称为是21世纪的石油。下面是千锋教育给出的Hadoop搭建教程: 1、安装虚拟机环境 VMware,收费产品,占内存较大。 2、安装操作系统 Ubuntu,操作简单,方便,界面友好。 3、安装一些常用的软件 在每台linux虚拟机上,安装:vim,ssH sudo apt-get install vim sudo apt-get install ssH 在客户端,也就是win7上,安装SecureCRT,Winscp或putty,这几个程序,都是依靠ssH服务来操作的,所以前提必须安装ssH服务。

service ssH status 查看ssH状态。如果关闭使用service ssH start开启服务。 SecureCRT,可以通过ssH远程访问linux虚拟机。 winSCP或putty,可以从win7向linux上传文件。 4、修改主机名和网络配置 主机名分别为:master,Host2,Host3,Host4。 sudo vim /etc/Hostname 网络配置,包括ip地址,子网掩码,DNS服务器。 5、修改/etc/Hosts文件。 修改每台电脑的Hosts文件。 Hosts文件和windows上的功能是一样的。存储主机名和ip地址的映射。 在每台linux上,sudo vim /etc/Hosts 编写Hosts文件。将主机名和ip 地址的映射填写进去。 6、配置ssH,实现无密码登陆 无密码登陆,效果也就是在master上,通过ssH Host2 或ssH Host3 或ssH Host4 就可以登陆到对方计算机上。而且不用输入密码。 四台虚拟机上,使用ssH-keygen -t rsa 一路按回车就行了 7、上传jdk,并配置环境变量。 通过winSCP将文件上传到linux中。将文件放到/usr/lib/java中,四个linux都要操作。 解压缩:tar -zxvf jdk1.7.0_21.tar 设置环境变量sudo vim ~/.basHrc

虚拟机和hadoop安装(超详细)

第1节:环境准备 1.1.VirtualBox的安装 VirtualBox简介 VirtualBox号称是免费虚拟机软件中最强的,拥有丰富的特色和出色的性能,在虚拟机市场占用重要地位。 我们选择它的理由是: *安装程序体积小。相对于同类产品VMWare的四五百兆的体积,VirtualBox只有几十兆的安装程序,安装完成后也只有120多兆,太小巧了。 *功能简单实用。配置简单、克隆系统、共享文件、虚拟化等一样不缺 *免费。这是最大的诱惑。 安装 读者根据自己的电脑情况下载适合自己操作系统的安装程序,作者的系统是Windows XP 32位,以下截图是来自Windows XP的。 VirtualBox的安装非常简单,只需要根据提示一步步选择“Next”即可,遇到回答“Yes”还是“No”的地方,选择“Yes”。在安装过程中,会出现暂时的网络中断,不要惊慌,一会就会恢复。 安装完成后,在电脑的“网络连接”中,会多出一个网络连接,如图2-1所示。

图2-1 点击桌面上的VirtualBox图标,就可以打开了,如图2-2所示。 图2-2 我们现在对虚拟机进行一些优化设置。点击菜单栏中的“管理”菜单项,选择“全局设定”命令,如图2-3 所示。 图2-3 出现一个弹出对话框[d1],在“常规”设置中,可以修改“默认虚拟电脑位置”,设定一个磁盘空间较大的位置,如图2-4所示。

图2-4 选择“热键”选项,可以修改什么按键作为热键。如图2-5所示,当用鼠标选中热键的时候,可以接收键盘输入。作者根据自己的习惯修改为组合键“Ctrl”+“Alt”。 图2-5 选择“扩展”选项,点击安装符号,选择一个扩展包进行安装,如图2-6所示。

配置Hadoop详细教程

VM下配置Hadoop详细教程 前言: Hadoop是一个分布式系统基础架构,主要是由HDFS、MapReduce和Hbase组成,分别为Google集群系统GFS、MapReduce、BigTable的开源实现。具有扩容能力强,效率高,成本低,可靠性好等特点。配置前最好熟悉一下Linux常用命令的使用,遇到问题时善于利用收索引擎,本教程的Linux 版本选择比较常用的Ubuntu。 一、Hadoop安装 1.首先将hadoop-0.20. 2.tar.gz安装包拷贝到虚拟机中,放于/home/xiami/目录 下,用tar命令进行解压: [xiami@dw_mstr ~]$ tar -zvxf hadoop-0.20.2.tar.gz 2.默认的解压路径是在/home/xiami/hadoop-0.20.2下,接着再使用 sudo gedit /etc/profile命令将以下Hadoop的环境变量添加到profile文件中:export HADOOP_HOME=/home/xiami/hadoop-0.20.22 export PATH=$HADOOP_HOME/bin:$PATH 3.然后用source命令使profile文件立即生效: PS:JDK与Hadoop的PATH变量可整合为如下: export PATH=.:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH 二、Hadoop配置 Hadoop的主要配置都在/home/xiami/hadoop-0.20.2/conf目录下进行: 1.配置HDFS (1)修改hadoop-env.sh文件 1)在本文件里设置环境变量JAVA_HOME: export JAVA_HOME=/home/xiami/jdk1.6.0_21 2)并将变量JAVA_HOME与HADOOP_OPTS前面的注释符“#”去掉,使变量 生效:

零基础学习hadoop(编程篇)

1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如何编译hadoop源码? 阅读此篇文章,需要些基础下面两篇文章 零基础学习hadoop到上手工作线路指导(初级篇) 零基础学习hadoop到上手工作线路指导(中级篇) 如果看过的话,看这篇不成问题,此篇讲hadoop编程篇。 hadoop编程,hadoop是一个Java框架,同时也是编程的一次革命,使得传统开发运行程序由单台客户端(单台电脑)转换为可以由多个客户端运行(多台机器)运行,使得任务得以分解,这大大提高了效率。

hadoop既然是一个Java框架,因为我们必须要懂Java,网上有大量的资料,所以学习Java 不是件难事。但是学到什么程度,可能是我们零基础同学所关心的。 语言很多情况下都是相通的,如果你是学生,还处于打基础的阶段,那么难度对于你来说还是不小的。 1.初学者要求必须有理论基础,并且能够完成一个小项目,最起码能够完成几个小例子,例如图书馆里等。 初学者基本的要求: (1)懂什么是对象、接口、继续、多态 (2)必须熟悉Java语法 (3)掌握一定的常用包 (4)会使用maven下载代码 (5)会使用eclipse,包括里面的快捷键,如何打开项目 传统程序员,因为具有丰富的编程经验,因此只要能够掌握开发工具: (1)会使用maven下载代码 (2)会使用eclipse,包括里面的快捷键,如何打开项目 (3)简单熟悉Java语法 上面的只是基础,如果想开发hadoop,还需要懂得下面内容 (1)会编译hadoop (2)会使用hadoop-eclipse-plugin插件,远程连接集群 (3)会运行hadoop程序。 上面列出大概的内容,下面我们具体说一些需要学习的内容。 无论是传统开发人员还是学生,零基础下面都是需要掌握的: 我们就需要进入开发了。开发零基础,该如何,咱们提供了相关的内容分别介绍下面文章 学习hadoop----java零基础学习线路指导视频(1) 这一篇我们使用什么开发工具,甚至考虑使用什么操作系统。然后就是Java基础知识篇,包括变量、函数等。 学习hadoop---Java初级快读入门指导(2) 第一篇是属于思想篇,那么这一篇属于实战篇,通过不同的方式,交给你怎么编写第一个小

Hadoop教程—光环大数据培训

Hadoop教程 Hadoop是一个开源框架,它允许在整个集群使用简单编程模型计算机的分布式环境存储并处理大数据。它的目的是从单一的服务器到上千台机器的扩展,每一个台机都可以提供本地计算和存储。 “90%的世界数据在过去的几年中产生”。 由于新技术,设备和类似的社交网站通信装置的出现,人类产生的数据量每年都在迅速增长。美国从一开始的时候到2003年产生的数据量为5十亿千兆字节。如果以堆放的数据磁盘的形式,它可以填补整个足球场。在2011年创建相同数据量只需要两天,在2013年该速率仍在每十分钟极大地增长。虽然生产的所有这些信息是有意义的,处理起来有用的,但是它被忽略了。 大数据是不能用传统的计算技术处理的大型数据集的集合。它不是一个单一的技术或工具,而是涉及的业务和技术的许多领域。 大数据包括通过不同的设备和应用程序所产生的数据。下面给出的是一些在数据的框架下的领域。 ?黑匣子数据:这是直升机,飞机,喷气机的一个组成部分,它捕获飞行机组的声音,麦克风和耳机的录音,以及飞机的性能信息。 ?社会化媒体数据:社会化媒体,如Facebook和Twitter保持信息发布的数百万世界各地的人的意见观点。 ?证券交易所数据:交易所数据保存有关的“买入”和“卖出”,客户由不同的公司所占的份额决定的信息。 ?电网数据:电网数据保持相对于基站所消耗的特定节点的信息。 ?交通运输数据:交通数据包括车辆的型号,容量,距离和可用性。 ?搜索引擎数据:搜索引擎获取大量来自不同数据库中的数据。

因此,大数据包括体积庞大,高流速和可扩展的各种数据。它的数据为三种类型。 ?结构化数据:关系数据。 ?半结构化数据:XML数据。 ?非结构化数据:Word, PDF, 文本,媒体日志。 ?通过保留了社交网络如Facebook的信息,市场营销机构了解可以他们的活动,促销等广告媒介的响应。 ?利用信息计划生产在社会化媒体一样喜好并让消费者对产品的认知,产品企业和零售企业。 ?使用关于患者以前的病历资料,医院提供更好的和快速的服务。 大数据的技术是在提供更准确的分析,这可能影响更多的具体决策导致更大的运行效率,降低成本,并减少了对业务的风险。 为了利用大数据的力量,需要管理和处理的实时结构化和非结构化的海量数据,可以保护数据隐私和安全的基础设施。 目前在市场上的各种技术,从不同的供应商,包括亚马逊,IBM,微软等来处理大数据。尽管找到了处理大数据的技术,我们研究了以下两类技术:

Hadoop的项目有哪些

Hadoop的项目有哪些? 作为大数据解决方案中的一种核心技术,而Hadoop项目则是所有大数据人才努力的结果,下面为大家介绍一下Hadoop当中最常见的几个项目。 一:数据整合 称之为“企业级数据中心”或“数据湖”,这个想法是你有不同的数据源,你想对它们进行数据分析。这类项目包括从所有来源获得数据源(实时或批处理)并且把它们存储在hadoop中。有时,这是成为一个“数据驱动的公司”的第一步;有时,或许你仅仅需要一份漂亮的报告。“企业级数据中心”通常由HDFS文件系统和HIVE或IMPALA中的表组成。真实的原因是一个数据湖比Teradata 和Netezza公司有更强的水平扩展性和低得多的成本。许多人在做前端分析时使用Tabelu和Excel。许多复杂的公司以“数据科学家”用Zeppelin或IPython 笔记本作为前端。 二:专业分析 许多数据整合项目实际上是从你特殊的需求和某一数据集系统的分析开始的。这些往往是令人难以置信的特定领域,如在银行领域的流动性风险/蒙特卡

罗模拟分析。在过去,这种专业的分析依赖于过时的,专有的软件包,无法扩大数据的规模经常遭受一个有限的功能集(大部分是因为软件厂商不可能像专业机构那样了解的那么多)。在Hadoop和Spark的世界,看看这些系统大致相同的数据整合系统,但往往有更多的HBase,定制非SQL代码,和更少的数据来源(如果不是唯一的)。他们越来越多地以Spark为基础。 三:Hadoop作为一种服务 在“专业分析”项目的任何大型组织(讽刺的是,一个或两个“数据整理”项目)他们会不可避免地开始感觉“快乐”(即,疼痛)管理几个不同配置的Hadoop 集群,有时从不同的供应商。接下来,他们会说,“也许我们应该整合这些资源池,”而不是大部分时间让大部分节点处于资源闲置状态。它们应该组成云计算,但许多公司经常会因为安全的原因(内部政治和工作保护)不能或不会。这通常意味着很多Docker容器包。 我没有使用它,但最近Bluedata(蓝色数据国际中心)似乎有一个解决方案,这也会吸引小企业缺乏足够的资金来部署Hadoop作为一种服务。 四:流分析 很多人会把这个“流”,但流分析是不同的,从设备流。通常,流分析是一个组织在批处理中的实时版本。以反洗钱和欺诈检测:为什么不在交易的基础上,抓住它发生而不是在一个周期结束?同样的库存管理或其他任何。 在某些情况下,这是一种新的类型的交易系统,分析数据位的位,因为你将它并联到一个分析系统中。这些系统证明自己如Spark或Storm与Hbase作为常用的数据存储。请注意,流分析并不能取代所有形式的分析,对某些你从未考虑过的事情而言,你仍然希望分析历史趋势或看过去的数据。

Hadoop云计算平台搭建最详细过程共

H a d o o p云计算平台及相关组件搭建安装过程详细教程 ——Hbase+Pig+Hive+Zookeeper+Ganglia+Chukwa+Eclipse等 一.安装环境简介 根据官网,Hadoop已在linux主机组成的集群系统上得到验证,而windows平台是作为开发平台支持的,由于分布式操作尚未在windows平台上充分测试,所以还不作为一个生产平台。Windows下还需要安装Cygwin,Cygwin是在windows平台上运行的UNIX模拟环境,提供上述软件之外的shell支持。 实际条件下在windows系统下进行Hadoop伪分布式安装时,出现了许多未知问题。在linux系统下安装,以伪分布式进行测试,然后再进行完全分布式的实验环境部署。Hadoop完全分布模式的网络拓补图如图六所示: (1)网络拓补图如六所示: 图六完全分布式网络拓补图 (2)硬件要求:搭建完全分布式环境需要若干计算机集群,Master和Slaves 处理器、内存、硬盘等参数要求根据情况而定。 (3)软件要求 操作系统64位版本:

并且所有机器均需配置SSH免密码登录。 二.Hadoop集群安装部署 目前,这里只搭建了一个由三台机器组成的小集群,在一个hadoop集群中有以下角色:Master和Slave、JobTracker和TaskTracker、NameNode和DataNode。下面为这三台机器分配IP地址以及相应的角色: ——master,namenode,jobtracker——master(主机名) ——slave,datanode,tasktracker——slave1(主机名) ——slave,datanode,tasktracker——slave2(主机名) 实验环境搭建平台如图七所示: 图七hadoop集群实验平台 并且,Hadoop要求集群上每台的用户账户名和密码相同。具体安装步骤如下:1.下载和安装JDK,版本为 (1)JDK的安装目录为/usr/lib/jvm,创建此文件夹,在终端输入命令:mkdir/usr/lib/jvm (2)权限不够的话重新改下用户密码就可以了,命令:sudopasswd,之后重

Hadoop云计算平台架构搭建详解

Hadoop云计算平台及相关组件搭建安装过程详细教程 (Hbase+Pig+Hive+Zookeeper+Ganglia+Chukwa+Eclipse)

一.安装环境简介 根据官网,Hadoop已在linux主机组成的集群系统上得到验证,而windows平台是作为开发平台支持的,由于分布式操作尚未在windows平台上充分测试,所以还不作为一个生产平台。Windows下还需要安装Cygwin,Cygwin是在windows平台上运行的UNIX模拟环境,提供上述软件之外的shell支持。 实际条件下在windows系统下进行Hadoop伪分布式安装时,出现了许多未知问题。在linux系统下安装,以伪分布式进行测试,然后再进行完全分布式的实验环境部署。Hadoop完全分布模式的网络拓补图如图六所示: (1)网络拓补图如六所示: 图六完全分布式网络拓补图 (2)硬件要求:搭建完全分布式环境需要若干计算机集群,Master和Slaves 处理器、内存、硬盘等参数要求根据情况而定。 (3)软件要求 操作系统64位Ubuntu12.04.4 JDK版本:jdk-7u51-linux-x64.tar.gz

并且所有机器均需配置SSH免密码登录。 二.Hadoop集群安装部署 目前,这里只搭建了一个由三台机器组成的小集群,在一个hadoop集群中有以下角色:Master和Slave、JobTracker和TaskTracker、NameNode和DataNode。下面为这三台机器分配IP地址以及相应的角色: 192.168.100.90——master,namenode,jobtracker——master(主机名) 192.168.100.105——slave,datanode,tasktracker——slave1(主机名) 192.168.100.106——slave,datanode,tasktracker——slave2(主机名) 实验环境搭建平台如图七所示:

相关主题
文本预览
相关文档 最新文档