当前位置:文档之家› Hadoop学习笔记

Hadoop学习笔记

Hadoop学习笔记
Hadoop学习笔记

Hadoop:The Definitive Guid学习笔记

mingyuan Email:cn.mingyuan@https://www.doczj.com/doc/fe11555031.html,

1.Meet Hadoop

1.1. D ata 数据

本节陈述了这样的事实:数据量越来越大,并且来源也越来越多,我们面临的问题是如何有效的存储和分析它们。

1.2. D ata Storage and Analysis 数据存储和分析

现在面临这这样的一个问题:当磁盘的存储量随着时间的推移越来越大的时候,对磁盘上的数据的读取速度却没有多大的增长。

读取硬盘上的全部数据会花费比较长的时间,如果是写操作的话则会更慢。一个解决的办法是同时读取多个硬盘上的数据。例如我们有100块硬盘,而他们分别存储整个数据的1%的话,若是用并行读取的方法操作,可以在两分钟之内搞定。只使用每块硬盘的1%当然是浪费的,但是我们可以存储100个数据集(dataset),每个1T,并且提供共享访问。有了更短的分析时间之后,这样的系统的用户应该是乐于接受共享访问模式的。他们的工作是按时间划分的,这样相互之间就不会有较大的影响。

从多个磁盘上进行并行读写操作是可行的,但是存在以下几个方面的问题:

1)第一个问题是硬件错误。使用的硬件越多出错的几率就越大。一种常用的解决方式是数据冗余,保留多分拷贝,即使一份数据处理出错,还有另外的数据。

HDFS使用的也是类似的方式,但稍有不同。

2)第二个问题是数据处理的相关性问题。例如很多分析工作在一快磁盘上处理出来的结果需要与其他磁盘上处理处理出来的结果合并才能完成任务。各种分布

式系统也都给出了合并的策略,但是做好这方面确实是一个挑战。MapReduce

提供了一种编程模型,他将从硬盘上读写数据的问题抽象出来,转化成对一系

列键值对的计算。

简而言之,Hadoop提供了一个可靠的存储和分析系统。存储又HDFS提供,分析由MapReduce提供。

1.3. 与其他系统比较

1.3.1. RDBMS

为什么我们不能使用大量的磁盘数据库做大规模的批量分析?为什么需要MapReduce?1)磁盘的寻道时间提高的速度低于数据的传输速度,如果数据访问模式由寻道时间支配的话,在读写数据集的一大部分的时候速度就会较流式读取慢很多,这样就出现了瓶

颈。

2)另一方面在更新数据集的少量数据的时候,传统的B-树工作的比较好,但是在更新数据集的大部分数据的时候B-树就显得比MapReduce方式慢了。MapReduce使用排序/合并操作去重建数据库(完成数据更新)。

在很多方面MapReduce可以看作是对传统关系数据库的补充。MapReduce比较适合于需要分析整个数据集,并且要使用批处理方式,特别是特定的分析的情况;RDBMS点查询方面占优势,或在已编制索引的数据集提供低延迟的检索和更新的数据,但是数据量不能太大。MapReduce适合一次写入,多次读取的操作,但是关系数据库就比较适合对数据集的持续更新。

还有一方面,MapReduce比较适合处理半结构化,非结构化的数据。

关系数据往往进行规则化以保证数据完整性,并删除冗余。这样做给MapReduce提出了新的问题:它使得读数据变成了非本地执行,而MapReduce的一个重要前提(假设)就是数据可以进行高速的流式读写。

MapReduce是可以进行线性扩展的编程模型。一个对集群级别的数据量而写的MapReduce可以不加修改的应用于小数据量或者更大数据量的处理上。更重要的是当你的输入数据增长一倍的时候,相应的处理时间也会增加一倍。但是如果你把集群也增长一倍的话,处理的速度则会和没有增加数据量时候的速度一样快,这方面对SQL查询来说不见得是正确的。

随着时间的推移,关系数据库和MapReduce之间的差别变得越来越不明显,很多数据库(例如Aster Data和Greenplum的数据)已经借用了一些MapReduce的思想。另一个方面,基于MapReduce的高层次查询语言使得MapReduce系统较传统的关系数据库来说,使程序员们更容易接受。

1.3.

2. Grid Compuing 网格计算

数据量大的时候网络带宽会成为网格计算的瓶颈。但是MapReduce使数据和计算在一个节点上完成,这样就变成了本地的读取。这是MapReduce高性能的核心。

MPI将控制权大大的交给了程序员,但是这就要求程序员明确的处理数据流等情况,而MapReduce只提供高层次的操作:程序员只需考虑处理键值对的函数,而对数据流则是比较隐晦的。

在分布式计算中,如何协调各个处理器是一项很大的挑战。最大的挑战莫过于如何很好的处理部分计算的失误。当你不知道是不是出现错误的时候,程序还在继续运行,这就比较麻烦了。由于MapReduce是一种非共享(Shared-nothing)的架构,当MapReduce实现检测到map或者reduce过程出错的时候,他可以将错误的部分再执行一次。MPI程序员则需要明确的考虑检查点和恢复,这虽然给程序员很大自由,但是也使得程序变得难写。

也许你会觉得mapreduce模式过于严格,程序员面对的都是些键值对,并且mapper和reducer之间很少来往,这样的模式能做一些有用的或者是非凡的事情吗?答案是肯定的,Google已经把Mapreduce使用在了很多方面——从图像分析到基于图的问题,再到机器学习,MapReduce工作的很好。虽然他不是万能的,但是他确是一种通用的数据处理工具。

1.3.3. Volunteer Computing志愿计算

志愿计算主要是让志愿者贡献CPU时间来完成计算。

MapReduce是针对在一个高聚合网络连接的数据中心中进行的可信的、使用专用的硬件工作持续数分钟或者数个小时而设计的。相比之下,志愿计算则是在不可信的、链接速度有很大差异的、没有数据本地化特性的,互联网上的计算机上运行永久的(超长时间的)计算,

1.4. H adoop简史(略)

1.5. T he Apache Hadoop Project(略)

2.MapReduce

2.1. A Weather Dataset 一个天气数据集

数据是NCDC的数据,我们关注以下特点:

1)数据是半格式化的

2)目录里面存放的是从1901-2001年一个世纪的记录,是gzip压缩过的文件。

3)以行为单位,使用ASCII格式存储,每行就是一条记录

4)每条记录我们关注一些基本的元素,比如温度,这些数据在每条数据中都会出现,并且宽度也是固定的。

下面是一条记录的格式,为了便于显示,做了一部分调整。

2.2.Analyzing the Data with Unix Tools 使用Unix

工具分析数据

以分析某年份的最高温度为例,下面是一段Unix的脚本程序:

这段脚本的执行过程如下:

脚本循环处理每一个压缩的年份文件,首先打印出年份,然后对每一个文件使用awk 处理。A wk脚本从数据中解析出两个字段:一个air temperature,一个quality code。air temperature值加0被转换成整形。接下来查看温度数据是否有效(9999表示在NCDC数据集

中丢失的值),并且检查quality code是不是可信并没有错误的。如果读取一切正常,temp 将与目前的最大值比较,如果出现新的最大值,则更新当前max的值。当文件中所有行的数据都被处理之后,开始执行End程序块,并且打印出最大值。

程序执行之后将产生如下样式的输出:

处理结果之中,温度的值被放大了10倍。所以,1901年的温度应该是31.7度,1902年的温度应该是24.4度……

所有的,一个世纪的气象记录在一台EC2 High-CPU Extra Large Instance上耗时42分钟。

为了加速处理速度,我们将程序的某些部分进行并行执行。这在理论上是比较简单的,我们可以按照年份来在不同的处理器上执行,使用所有可用的硬件线程,但是还是有些问题:

1)把任务切分成相同大小的块不总是那么容易的。这这种情况下,不同年份的文件大小有很大不同,这样就会导致一些过程较早的完成,尽管这些他们可以进行下一步的工作,但是总的运行时间是由耗费时间最长的文件所决定的。一种可供选择的尝试是将输入分成固定大小的块,并把它们分配给处理进程。

2)合并单独处理出来的结果还需要进一步的处理。在这种情况下,一个年份的结果对于其他年份来说是独立的,并且可能经过联接所有的结果,并按照年份进行排序之后被合并。如果使用固定大小块的方式,合并是很脆弱的。例如,某一年份的数据可能被分到不同的块中,并且被单独处理。我们最终也会得每块数据的最高温度,但是这时候我们最后一步变成了在这些最大值中,为每一个年份找出最大值。

3)人们仍旧被单机的处理能力所束缚。如果在一台拥有确定数量处理器的计算机上面执行程序的的开销是20分钟的话,你也不能可能再有所提高了。并且有些数据集的数据量已经超出了单台计算机的处理能力。当我们开始使用多台机器的时候,其它一大堆因素就跳了出来,主要是协调和可靠性的问题。谁掌控全局?怎么进行处理器的失效处理?

所以,尽管在理论上并行处理是可行的,但是实践上却是麻烦的。使用一个类似于Hadoop 的框架将会有很大的帮助。

2.3.Analyzing the Data with Hadoop 使用Hadoop

分析数据

为了使用Hadoop并行处理的长处,我们需要将程序做成MapReduce格式。经过一些本地的、小数据量的测试之后,我们将可以把程序放在集群上进行运行。

2.3.1. Map and Reduce

MapReduce将工作分为map阶段和reduce阶段,每个阶段都将键值对作为输入输入,键值对的类型可以由程序员选择。程序员还指定两个函数:map和reduce函数。

Map阶段的输入数据是NCDC的原始数据,我们选择文本格式输入,这样可以把记录中的每一行作为文本value。Key是当前行离开始行的偏移量,但是我们并不需要这个key,所以省去。

我们的Map函数比较简单,仅仅从输入中析取出temperature。从这个意义上来说,map 函数仅仅是完成了数据的准备阶段,这样使得reducer函数可以基于它查找历年的最高温度。Map函数也是一个很好的过滤阶段,这里可以过滤掉丢失、置疑、错误的temperature 数据。

形象化一点:下面是输入数据

下面的键值对给map函数处理,其中加粗的是有用的数据

处理之后的结果如下:

经过以上的处理之后还需要在mapreduce框架中进行进一步的处理,主要有排序和按照key给键值对给key-value排序。经过这一番处理之后的结果如下:

上面的数据将传递给reduce之后,reduce所需要做的工作仅仅是遍历这些数据,找出最大值,产生最终的输出结果:

以上过程可以用下图描述:

2.3.2. Java MapReduce

Map函数实现了mapper接口,此接口声明了一个map()函数。

下面是map实现

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.MapReduceBase;

import org.apache.hadoop.mapred.Mapper;

import org.apache.hadoop.mapred.OutputCollector;

import org.apache.hadoop.mapred.Reporter;

public class MaxTemperatureMapper extends MapReduceBase implements Mapper {

private static final int MISSING = 9999;

public void map(LongWritable key, Text value,

OutputCollector output, Reporter reporter)

throws IOException {

String line = value.toString();

String year = line.substring(15, 19);

int airTemperature;

if(line.charAt(87) == '+') { // parseInt doesn't like leading plus

// signs

airTemperature = Integer.parseInt(line.substring(88, 92));

} else {

airTemperature = Integer.parseInt(line.substring(87, 92));

}

String quality = line.substring(92, 93);

if (airTemperature != MISSING && quality.matches("[01459]")) { output.collect(new Text(year), new

IntWritable(airTemperature));

}

}

}

Mapper是一个泛型类型,有四个参数分别代表Map函数的input key, input value, output key, output value 的类型。对于本例来说,input key是一个long integer的偏移量,input value是一行文本,output key是年份,output value是气温(整形)。除了Java的数据类型之外,Hadoop也提供了他自己的基本类型,这些类型为网络序列化做了专门的优化。可以在org.apache.hadoop.io包中找到他们。比如LongWritable相当于Java中的Long,Text相当于String而IntWritable在相当于Integer。map()方法传入一个key和一个value。我们将Text 类型的value转化成Java的String,然后用String的substring方法取出我偶们需要的部分。map()方法也提供了OutputCollector的一个实例,用来写输出数据。在次情况下,我们将year封装成Text,而将temperature包装成IntWritable类型。只要在temperature值出现并且quality code表示temperature读取正常的情况下我们才进行数据的写入。

下面是Reduce函数的类似实现,仅用了一个Reducer接:

import java.io.IOException;

import java.util.Iterator;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.MapReduceBase;

import org.apache.hadoop.mapred.OutputCollector;

import org.apache.hadoop.mapred.Reducer;

import org.apache.hadoop.mapred.Reporter;

public class MaxTemperatureReducer extends MapReduceBase implements Reducer {

public void reduce(Text key, Iterator values,

OutputCollector output, Reporter reporter)

throws IOException {

int maxValue = Integer.MIN_VALUE;

while (values.hasNext()) {

maxValue = Math.max(maxValue, values.next().get());

}

output.collect(key, new IntWritable(maxValue));

}

}

类似的,Reducer也有四个参数来分别标记输入输出。Reduce函数的输入类型必须对应于Map函数的输出,拿本例来说,输入必须是:Text,IntWritable类型。Reduce在本例输出结果是Text和IntWritbale类型,year和与其对应的maxValue是经过遍历、比较之后得到的。

下面的一段代码执行了MapReduce工作:

import java.io.IOException;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.FileInputFormat;

import org.apache.hadoop.mapred.FileOutputFormat;

import org.apache.hadoop.mapred.JobClient;

import org.apache.hadoop.mapred.JobConf;

public class MaxTemperature {

public static void main(String[] args) throws IOException { if (args.length != 2) {

System.err

.println("Usage: MaxTemperature ");

System.exit(-1);

}

JobConf conf = new JobConf(MaxTemperature.class);

conf.setJobName("Max temperature");

FileInputFormat.addInputPath(conf, new Path(args[0]));

FileOutputFormat.setOutputPath(conf, new Path(args[1]));

conf.setMapperClass(MaxTemperatureMapper.class);

conf.setReducerClass(MaxTemperatureReducer.class);

conf.setOutputKeyClass(Text.class);

conf.setOutputValueClass(IntWritable.class);

JobClient.runJob(conf);

}

}

JobConf对象构成了mapReduce job的说明,给出了job的总体控制。当执行MapReduce工作的时候我们需要将代码打包成一个jar文件(这个文件将被Hadoop在集群中分发)。我们并没有指定jar文件,但是我们传递了一个class给JobConf的构造函数,Hadoop将利用它通过查找包含这个类的jar文件而去定位相关的jar件。之后我们指定input、output路径。

FileInputFormat.addInputPath(conf, new Path(args[0]));

FileInputFormat的静态方法addInputPath来添加input path,input path可以是文件名或者目录,如果是目录的话,在目录下面的文件都会作为输入。addInputPath可以调用多次。

FileOutputFormat.setOutputPath(conf, new Path(args[1]));

FileOutputFormat的setOutput Path()方法指定output path。这个目录在运行job之前是不应该存在的,这样可以阻止数据丢失。

conf.setMapperClass(MaxTemperatureMapper.class);

conf.setReducerClass(MaxTemperatureReducer.class);

指定了mapper和reducer类。

conf.setOutputKeyClass(Text.class);设置output key类型

conf.setOutputValueClass(IntWritable.class);设置output value类型

一般map和reduce的key、value类型都是一样的,如果不一样的话可以调用setMapOutputKeyClass() 和 setMapOutputValueClass()来设置。

输入类型由input format控制,本例使用的是默认的Text格式,所以没有显式指定。

JobClient.runJob(conf);提交工作,等待工作完成。

2.4. T he New Java MapReduce API

0.20.0版本的Hadoop新增了一个Context Object,为API将来进化做准备。新旧api不兼容,要想使用新api的特性,程序需要重写。

主要有以下几处重大改进:

1)The new API favors abstract classes over interfaces, since these are easier to evolve.

For example, you can add a method (with a default implementation) to an abstract

class without breaking old implementations of the class. In the new API, the

Mapper and Reducer interfaces are now abstract classes.

2)The new API is in the org.apache.hadoop.mapreduce package (and subpackages).

The old API is found in org.apache.hadoop.mapred.

3)The new API makes extensive use of context objects that allow the user code to communicate with the MapReduce system. The MapContext, for example, essentially

unifies the role of the JobConf, the OutputCollector, and the Reporter.

4)The new API supports both a ―push‖ and a ―pull‖ style of iteration. In both APIs,

key-value record pairs are pushed to the mapper, but in addition, the new API

allows a mapper to pull records from within the map() method. The same goes for

the reducer. An example of how the ―pull‖ style can be useful is processing records

in batches, rather than one by one.

5)Configuration has been unified. The old API has a special JobConf object for job configuration, which is an extension of Hadoop’s vanilla Configuration object

(used for configuring daemons; see ―The Configuration API‖ on page 116). In the

new API, this distinction is dropped, so job configuration is done through a

Configuration.

6)Job control is performed through the Job class, rather than JobClient, which no

longer exists in the new API.

使用新api重写的程序如下:

public class NewMaxTemperature {

static class NewMaxTemperatureMapper extends

Mapper { private static final int MISSING = 9999;

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

String line = value.toString();

String year = line.substring(15, 19);

int airTemperature;

if (line.charAt(87) == '+') { // parseInt doesn't like leading plus

// signs

airTemperature = Integer.parseInt(line.substring(88, 92));

} else {

airTemperature = Integer.parseInt(line.substring(87, 92));

}

String quality = line.substring(92, 93);

if (airTemperature != MISSING &&

quality.matches("[01459]")) {

context.write(new Text(year), new

IntWritable(airTemperature));

}

}

}

static class NewMaxTemperatureReducer extends

Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {

int maxValue = Integer.MIN_VALUE;

for (IntWritable value : values) {

maxValue = Math.max(maxValue, value.get());

}

context.write(key, new IntWritable(maxValue));

}

}

public static void main(String[] args) throws Exception { if (args.length != 2) {

System.err

.println("Usage: NewMaxTemperature ");

System.exit(-1);

}

Job job = new Job();

job.setJarByClass(NewMaxTemperature.class);

FileInputFormat.addInputPath(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setMapperClass(NewMaxTemperatureMapper.class);

job.setReducerClass(NewMaxTemperatureReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

System.exit(job.waitForCompletion(true) ? 0 : 1);

}

}

2.5. S caling Out

2.5.1. DataFlow数据流

1)MapReduce Job:客户端要处理的一批工作,包括input data、mapreduce程序、配置信息。

2)Hadoop工作分为map task和reduce task两种。

3)有两种节点控制job运行,一种是jobtracker,一种是tasktracker。Jobtracker通过调度tasktracker协调所有工作的执行。Tasktracker运行任务并将报告发送给jobtracker,jobtracker 所有工作的进度。如果一个任务失败,jobtracker再重新调度一个不同的tasktracker进行工作。

4)splits,input splits。Hadoop将输入划分成固定大小的块,这些块就叫splits。分块不能太大,也不能太小,一般是64MB,也就是HDFS默认的块大小。

5)data locality map处理本机HDFS的数据,不经过网络。

6)Map将输出写到本地磁盘,没有写到HDFS中。

7)reduce task没有data locality优势

下面是mapreduce的几种执行方式:

MapReduce data flow with a single reduce task

MapReduce data flow with multiple reduce tasks

MapReduce data flow with no reduce task

2.5.2. Combiner Functions

Combiner将map出来的中间数据进行处理,减少网络传输量。

指定combiner方法:conf.setCombinerClass(MaxT emperatureReducer.class);

2.6. H adoop streaming(略)

2.7. H adoop pipes(略)

3.The Hadoop Distributed File System

3.1. T he Design of HDFS

HDFS设计的针对对象:适合流式访问的超大文件、在使用便宜的硬件搭建的集群上运行。

HDFS不足:

低延迟数据访问(Hbase是个好选择)、小文件多的时候出现问题(HDFS将文件Meta信息存储在内存中,内存限制了可以控制的文件数量)、对文件的多个wirter进行写入或者任意位置的修改。

3.2. H DFS Concept

3.2.1. Blocks

HDFS中Block的大小默认是64M,小于块大小的的文件并不占据整个块的全部空间(而是将文件大小作为块的大小.比如要存放的文件是1k,但是系统的Block默认是64MB,存放之后块的大小是1k,不是64MB.文件若是大于64MB,则分多快进行存储.)

使用Blocks的好处:

1)可以存储大文件,一个文件的大小可以大于任何一个单块硬盘的容量

2)把存储单元抽象成块而不是文件,简化了存储子系统:简化了数据管理、取消元数据关注

3)能很好适应数据复制,数据复制保证系统的容错和可用性。

3.2.2. Namenodes and Datanodes

Namenode:master

Datanode:worker

Namenode管理文件系统名字空间(filesystem namespace),它维持了一个filesystem tree,所有文件的metadata和目录都在里面。信息被以两种文件的形式持久化在硬盘上,namespace image,edit log.

Hdfs提供了两种namenode的容错机制:

1)备份存储持久化状态的文件系统元数据的文件

2)提供secondary namenode。Secondary的主要角色是合并namespace image和edit log,防

止edit log过大。但是secondary namenode的数据较master namenode的数据有所延迟,所有数据恢复以后肯定会有数据丢失

3.3. T he Command-line Interface

以伪分布式为例

基本的文件系统操作:

1)将本地数据拷贝到hdfs上

% hadoop fs -copyFromLocal input/docs/quangle.txt hdfs://localhost/user/tom/quangle.txt

hdfs://可省去,这样变成

% hadoop fs -copyFromLocal input/docs/quangle.txt /user/tom/quangle.txt

也可以使用相对路径:

% hadoop fs -copyFromLocal input/docs/quangle.txt quangle.txt

2)将数据从hdfs上拷贝到本地硬盘并检查文件时候一致

% hadoop fs -copyToLocal quangle.txt quangle.copy.txt

% md5 input/docs/quangle.txt quangle.copy.txt

MD5 (input/docs/quangle.txt) = a16f231da6b05e2ba7a339320e7dacd9

MD5 (quangle.copy.txt) = a16f231da6b05e2ba7a339320e7dacd9

3)Hdfs文件列表

% hadoop fs -mkdir books

% hadoop fs -ls .

Found 2 items

drwxr-xr-x - tom supergroup 0 2009-04-02 22:41 /user/tom/books

-rw-r--r-- 1 tom supergroup 118 2009-04-02 22:29 /user/tom/quangle.txt

第一列:文件模式(类似posix)

第二列:文件被复制的份数

第三列:文件拥有者

第四列:文件拥有者的group

第五列:文件大小,目录显示为0

第六列:文件最后修改日期

第七列:文件最后修改时间

第八列:文件的绝对路径

3.4. H adoop Filesystems

Hadoop有一个对文件系统的抽象,HDFS只是其中的一个实现。Java的抽象类org.apache.hadoop.fs.FileSystem代表了Hadoop中的文件系统,还有其他的几种实现(48页):

3.4.1. Interfaces

Hadoop用Java写成,所有Hadoop文件的交互都通过Java api来完成。

还有另外的与Hadoop文件系统交互的库:Thrift、C、FUSE、WebDA V等

3.5. T he Java Interface

3.5.1. Reading Data from a Hadoop URL

最简单的方式是用https://www.doczj.com/doc/fe11555031.html,.URL对象打开一个流来读取。如下:

InputStream in = null;

try {

in = new URL("hdfs://host/path").openStream();

// process in

} finally {

IOUtils.closeStream(in);

}

这里需要进行一点额外的工作才能使得URL识别hdfs的uri。我们要使用https://www.doczj.com/doc/fe11555031.html,.URL的

setURLStreamHandlerFactory()方法设置URLStreamHandlerFactory,这里需要传递一个FsUrlStreamHandlerFactory。这个操作对一个jvm只能使用一次,我们可以在静态块中调用。

public class URLCat {

static {

URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());

}

public static void main(String[] args) throws Exception { InputStream in = null;

try {

in = new URL(args[0]).openStream();

IOUtils.copyBytes(in, System.out, 4096, false);

} finally {

IOUtils.closeStream(in);

}

}

}

IOUtils是一个工具类,用来在finally从句中关闭流,也可以用来拷贝数据到输出流中。copyBytes方法的四个参数代表的含义分别是:拷贝的来源,去处,拷贝的字节数已经在拷贝完成之后是否关闭流。本例会有如下结果呈现:

% hadoop URLCat hdfs://localhost/user/tom/quangle.txt

On the top of the Crumpetty Tree

The Quangle Wangle sat,

But his face you could not see,

On account of his Beaver Hat.

3.5.2. Reading Data Using the FileSystem API

在某些情况下设置URLStreamHandlerFactory的方式并不一定回生效。在这种情况下,需要用FileSystem API来打开一个文件的输入流。

文件的位置是使用Hadoop Path呈现在Hadoop中的,与java.io中的不一样。

有两种方式获取FileSystem的实例:

public static FileSystem get(Configuration conf) throws IOException public static FileSystem get(URI uri, Configuration conf) throws IOException

Configuration封装了client或者server的配置,这些配置从classpath中读取,比如被classpath指向的conf/core-site.xml文件.

第一个方法从默认位置(conf/core-site.xml)读取配置,第二个方法根据传入的uri查找适合的配置文件,若找不到则返回使用第一个方法,即从默认位置读取。

在获得FileSystem实例之后,我们可以调用open()方法来打开输入流:

public FSDataInputStream open(Path f) throws IOException

public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException

第一个方法的参数f是文件位置,第二个方法的bufferSize就是输入流的缓冲大小。

下面的代码是使用FileSystem打开输入流的示例:

public class FileSystemCat {

public static void main(String[] args) throws Exception { String uri = args[0];

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(uri), conf);

InputStream in = null;

try {

in = fs.open(new Path(uri));

IOUtils.copyBytes(in, System.out, 4096, false);

} finally {

IOUtils.closeStream(in);

}

}

}

输出结果如下:

% hadoop FileSystemCat hdfs://localhost/user/tom/quangle.txt

On the top of the Crumpetty Tree

The Quangle Wangle sat,

But his face you could not see,

On account of his Beaver Hat.

3.5.2.1. FSDataInputStream

FileSystem的open方法返回了FSDataInputStream对象,而不是标准的java.io。

package org.apache.hadoop.fs;

public class FSDataInputStream extends DataInputStream

implements Seekable, PositionedReadable {

// implementation elided

}

FSDataInputStream实现了Seekable接口,这样使其具有了随机访问的能力。

下面是Seekable接口的定义。

public interface Seekable {

void seek(long pos) throws IOException;

long getPos() throws IOException;

boolean seekToNewSource(long targetPos) throws IOException;

}

seek()方法提供了从文件开始查找某一位置的能力。getPos()方法则返回当前相对于文件起始位置的偏移量。seekToNewSource方法不常用。

下面的程序将hdfs中的文件显示了两次:

public class FileSystemDoubleCat {

public static void main(String[] args) throws Exception { String uri = args[0];

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(uri), conf);

FSDataInputStream in = null;

try {

in = fs.open(new Path(uri));

IOUtils.copyBytes(in, System.out, 4096, false);

in.seek(0); // go back to the start of the file

IOUtils.copyBytes(in, System.out, 4096, false);

} finally {

IOUtils.closeStream(in);

}

}

}

运行结果如下:

% hadoop FileSystemDoubleCat hdfs://localhost/user/tom/quangle.txt

On the top of the Crumpetty Tree

The Quangle Wangle sat,

But his face you could not see,

On account of his Beaver Hat.

On the top of the Crumpetty Tree

The Quangle Wangle sat,

But his face you could not see,

On account of his Beaver Hat.

FSDataInputStream也实现了PositionedReadable接口,从而能读取指定offset开始的数据。public interface PositionedReadable {

public int read(long position, byte[] buffer, int offset, int length) throws IOException;

public void readFully(long position, byte[] buffer, int offset, int length) throws IOException;

public void readFully(long position, byte[] buffer) throws IOException;

}

read()方法最多读取length bytes。Position是相对offset的偏移,buffer存放读取的数据。

readFully()方法读取length bytes的数据到buffer中,第二个readFully则是读取buffer.length bytes的数据到buffer中。以上的方法均不会改变offset的值。

最后,seek()是一个开销比较大的操作,注意节省使用。

3.5.3. Writing Data

创建文件的最简单方法:

public FSDataOutputStream create(Path f) throws IOException

这个方法有几个重载,实现了一些例如:文件复制多少份,buffer的大小等。

此方法将创建文件的任何不存在的上级目录。例如,要创建文件/usr/a/text.txt,但是/usr/a/这个目录不存在,这时候本方法将创建/usr/a/这个目录。

还有的重载函数传递了progressable接口,这使得我们可以获得写入过程的进度信息,progressable接口定义如下:

package org.apache.hadoop.util;

public interface Progressable {

public void progress();

}

下面的方法用于追加数据:

public FSDataOutputStream append(Path f) throws IOException

下面程序演示了如何拷贝一个本地文件到Hadoop filesystem中:

public class FileCopyWithProgress {

public static void main(String[] args) throws Exception {

String localSrc = args[0];

String dst = args[1];

InputStream in = new BufferedInputStream(new

FileInputStream(localSrc));

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(dst), conf);

OutputStream out = fs.create(new Path(dst), new Progressable() { public void progress() {

System.out.print(".");

}

});

IOUtils.copyBytes(in, out, 4096, true);

}

}

该程序每当写入64k数据之后就调用一次progress()方法。

结果如下:

3.5.3.1. FSDataOutPutStream

FileSystem的create()方法返回了一个FSDataOutPutStream。提供了获取当前位置的方法,但是没有提供seek方法。

package org.apache.hadoop.fs;

public class FSDataOutputStream extends DataOutputStream implements Syncable {

public long getPos() throws IOException {

// implementation elided

}

// implementation elided

hadoop学习课程介绍

云凡教育Hadoop网络培训第二期 开课时间:2014年1月20日 授课方式:YY在线教育+课程视频+资料、笔记+辅导+推荐就业 YY教育平台:20483828 课程咨询:1441562932 大胃 云凡教育Hadoop交流群:306770165 费用: 第二期优惠特价:999元; 授课对象: 对大数据领域有求知欲,想成为其中一员的人员 想深入学习hadoop,而不只是只闻其名的人员 基础技能要求: 具有linux操作一般知识(因为hadoop在linux下跑) 有Java基础(因为hadoop是java写的并且编程也要用java语言) 课程特色 1,以企业实际应用为向导,进行知识点的深入浅出讲解; 2,从零起步,循序渐进,剖析每一个知识; 3,萃取出实际开发中最常用、最实用的内容并以深入浅出的方式把难点化于无形之中 学习安排: Hadoop的起源与生态系统介绍(了解什么是大数据;Google的三篇论文;围绕Hadoop形成的一系列的生态系统;各个子项目简要介绍)

1_Linux系统环境搭建和基本命令使用 针对很多同学对linux命令不熟悉,在课程的学习中,由于命令不熟悉导致很多错误产生,所以特意增加一节linux基础课程,讲解一些常用的命令,对接下来的学习中做好入门准备; 02_Hadoop本地(单机)模式和伪分布式模式安装 本节是最基本的课程,属于入门级别,主要对Hadoop 介绍,集中安装模式,如何在linux上面单机(本地)和伪分布模式安装Hadoop,对HDFS 和MapReduce进行测试和初步认识。 03_HDFS的体系结构、Shell操作、Java API使用和应用案例 本节是对hadoop核心之一——HDFS的讲解。HDFS是所有hadoop操作的基础,属于基本的内容。对本节内容的理解直接影响以后所有课程的学习。在本节学习中,我们会讲述hdfs的体系结构,以及使用shell、java不同方式对hdfs 的操作。在工作中,这两种方式都非常常用。学会了本节内容,就可以自己开发网盘应用了。在本节学习中,我们不仅对理论和操作进行讲解,也会讲解hdfs 的源代码,方便部分学员以后对hadoop源码进行修改。 04_MapReduce入门、框架原理、深入学习和相关MR面试题 本节开始对hadoop核心之一——mapreduce的讲解。mapreduce是hadoop 的核心,是以后各种框架运行的基础,这是必须掌握的。在本次讲解中,掌握mapreduce执行的详细过程,以单词计数为例,讲解mapreduce的详细执行过程。还讲解hadoop的序列化机制和数据类型,并使用自定义类型实现电信日志信息的统计。最后,还要讲解hadoop的RPC机制,这是hadoop运行的基础,通过该节学习,我们就可以明白hadoop是怎么明白的了,就不必糊涂了,本节内容特别重要。 05_Hadoop集群安装管理、NameNode安全模式和Hadoop 1.x串讲复习 hadoop就业主要是两个方向:hadoop工程师和hadoop集群管理员。我们课程主要培养工程师。本节内容是面向集群管理员的,主要讲述集群管理的知

hadoop基本操作指令

Hadoop基本操作指令 假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop,默认认为Hadoop环境已经由运维人员配置好直接可以使用 启动与关闭 启动Hadoop 1. 进入HADOOP_HOME目录。 2. 执行sh bin/start-all.sh 关闭Hadoop 1. 进入HADOOP_HOME目录。 2. 执行sh bin/stop-all.sh 文件操作 Hadoop使用的是HDFS,能够实现的功能和我们使用的磁盘系统类似。并且支持通配符,如*。 查看文件列表 查看hdfs中/user/admin/aaron目录下的文件。 1. 进入HADOOP_HOME目录。 2. 执行sh bin/hadoop fs -ls /user/admin/aaron 这样,我们就找到了hdfs中/user/admin/aaron目录下的文件了。 我们也可以列出hdfs中/user/admin/aaron目录下的所有文件(包括子目录下的文件)。 1. 进入HADOOP_HOME目录。 2. 执行sh bin/hadoop fs -lsr /user/admin/aaron 创建文件目录 查看hdfs中/user/admin/aaron目录下再新建一个叫做newDir的新目录。 1. 进入HADOOP_HOME目录。 2. 执行sh bin/hadoop fs -mkdir /user/admin/aaron/newDir 删除文件 删除hdfs中/user/admin/aaron目录下一个名叫needDelete的文件 1. 进入HADOOP_HOME目录。 2. 执行sh bin/hadoop fs -rm /user/admin/aaron/needDelete 删除hdfs中/user/admin/aaron目录以及该目录下的所有文件

hadoop基本命令_建表-删除-导数据

HADOOP表操作 1、hadoop简单说明 hadoop 数据库中的数据是以文件方式存存储。一个数据表即是一个数据文件。hadoop目前仅在LINUX 的环境下面运行。使用hadoop数据库的语法即hive语法。(可百度hive语法学习) 通过s_crt连接到主机。 使用SCRT连接到主机,输入hive命令,进行hadoop数据库操作。 2、使用hive 进行HADOOP数据库操作

3、hadoop数据库几个基本命令 show datebases; 查看数据库内容; 注意:hadoop用的hive语法用“;”结束,代表一个命令输入完成。 usezb_dim; show tables;

4、在hadoop数据库上面建表; a1: 了解hadoop的数据类型 int 整型; bigint 整型,与int 的区别是长度在于int; int,bigint 相当于oralce的number型,但是不带小数点。 doubble 相当于oracle的numbe型,可带小数点; string 相当于oralce的varchar2(),但是不用带长度; a2: 建表,由于hadoop的数据是以文件有形式存放,所以需要指定分隔符。 create table zb_dim.dim_bi_test_yu3(id bigint,test1 string,test2 string)

row format delimited fields terminated by '\t' stored as textfile; --这里指定'\t'为分隔符 a2.1 查看建表结构: describe A2.2 往表里面插入数据。 由于hadoop的数据是以文件存在,所以插入数据要先生成一个数据文件,然后使用SFTP将数据文件导入表中。

Hadoop 学习笔记

Hadoop 在Hadoop上运行MapReduce命令 实验jar:WordCount.jar 运行代码:root/……/hadoop/bin/hadoop jar jar包名称使用的包名称input(输入地址) output(输出地址) 生成测试文件:echo -e "aa\tbb \tcc\nbb\tcc\tdd" > ceshi.txt 输入地址:/data2/u_lx_data/qiandongjun/eclipse/crjworkspace/input 输出地址:/data2/u_lx_data/qiandongjun/eclipse/crjworkspace/output 将测试文件转入输入文件夹:Hadoop fs -put ceshi.txt /data2/u_lx_data/qiandongjun/eclipse/crjworkspace/input/ceshi.txt 运行如下代码:hadoop jar /data2/u_lx_data/qiandongjun/eclipse/crjworkspace/WordCount.jar WordCount /data2/u_lx_data/qiandongjun/eclipse/crjworkspace/input/ceshi.txt /data2/u_lx_data/qiandongjun/eclipse/crjworkspace/output Hadoop架构 1、HDFS架构 2、MapReduce架构 HDFS架构(采用了Master/Slave 架构) 1、Client --- 文件系统接口,给用户调用 2、NameNode --- 管理HDFS的目录树和相关的的文件元数据信息以及监控DataNode的状 态。信息以“fsimage”及“editlog”两个文件形势存放 3、DataNode --- 负责实际的数据存储,并将数据定期汇报给NameNode。每个节点上都 安装一个DataNode 4、Secondary NameNode --- 定期合并fsimage和edits日志,并传输给NameNode (存储基本单位为block) MapReduce架构(采用了Master/Slave 架构) 1、Client --- 提交MapReduce 程序并可查看作业运行状态 2、JobTracker --- 资源监控和作业调度 3、TaskTracker --- 向JobTracker汇报作业运行情况和资源使用情况(周期性),并同时接 收命令执行操作 4、Task --- (1)Map Task (2)Reduce Task ——均有TaskTracker启动 MapReduce处理单位为split,是一个逻辑概念 split的多少决定了Map Task的数目,每个split交由一个Map Task处理 Hadoop MapReduce作业流程及生命周期 一共5个步骤 1、作业提交及初始化。JobClient将作业相关上传到HDFS上,然后通过RPC通知JobTracker,

入门大数据,需要学习哪些基础知识

大数据的发展历程总体上可以划分为三个重要阶段,萌芽期、成熟期和大规模应用期,20世纪90年至21世纪初,为萌芽期,随着,一批商业智能工具和知识管理技术的开始和应用,度过了数据萌芽。21世纪前十年则为成熟期,主要标志为,大数据解决方案逐渐走向成熟,形成了并行计算与分布式系统两大核心技,谷歌的GFS和MapReduce等大数据技术受到追捧,Hadoop平台开始大行期道,2010年以后,为大规模应用期,标志为,数据应用渗透各行各业,数据驱动决策,信息社会智能化程度快速提高。 数据时代的到来,也推动了数据行业的发展,包括企业使用数据获取价值,促使了大量人员从事于数据的学习,学习大数据需要掌握基础知识,接下从我的角度,为大家做个简要的阐述。 学习大数据需要掌握的知识,初期了解概念,后期就要学习数据技术,主要包括: 1.大数据概念 2.大数据的影响

3.大数据的影响 4.大数据的应用 5.大数据的产业 6.大数据处理架构Hadoop 7.大数据关键技术 8.大数据的计算模式 后三个牵涉的数据技技术,就复杂一点了,可以细说一下: 1.大数据处理架构Hadoop:Hadoop的特性、Hadoop生态系统、Hadoop 的安装与使用; 2.大数据关键技术技术:数据采集、数据存储与管理、数据处理与分析、数据隐私与安全; 3.大数据处理计算模式:批处理计算、流计算、图计算、查询分析计算

数据的核心技术就是获取数据价值,获取数据前提是,先要有数据,这就牵涉数据挖掘了。 本文内容由北大青鸟佳音校区老师于网络整理,学计算机技术就选北大青鸟佳音校区!了解校区详情可进入https://www.doczj.com/doc/fe11555031.html,网站,学校地址位于北京市西城区北礼士路100号!

(完整版)hadoop例题

选择题 1、关于MapReduce的描述错误的是() A、MapReduce框架会先排序map任务的输出 B、通常,作业的输入输出都会被存储在文件系统中 C、通常计算节点和存储节点是同一节点 D、一个Task通常会把输入集切分成若干独立的数据块 2、关于基于Hadoop的MapReduce编程的环境配置,下面哪一步是不必要的() A、安装linux或者在Windows下安装Cgywin B、安装java C、安装MapReduce D、配置Hadoop参数 3、关于基于Hadoop的MapReduce编程的环境配置,下面哪一步是不必要的() A、配置java环境变量 B、配置Hadoop环境变量 C、配置Eclipse D、配置ssh 4、下列说法错误的是() A、MapReduce中maperconbiner reducer 缺一不可 B、在JobConf中InputFormat参数可以不设 C、在JobConf中MapperClass参数可以不设

D、在JobConf中OutputKeyComparator参数可以不设 5、下列关于mapreduce的key/value对的说法正确的是() A、输入键值对不需要和输出键值对类型一致 B、输入的key类型必须和输出的key类型一致 C、输入的value类型必须和输出的value类型一致 D、输入键值对只能映射成一个输出键值对 6、在mapreduce任务中,下列哪一项会由hadoop系统自动排序() A、keys of mapper's output B、values of mapper's output C、keys of reducer's output D、values of reducer's output 7、关于mapreduce框架中一个作业的reduce任务的数目,下列说法正确的是() A、由自定义的Partitioner来确定 B、是分块的总数目一半 C、可以由用户来自定义,通过JobConf.setNumReducetTask(int)来设定一个作业中reduce的任务数目 D、由MapReduce随机确定其数目 8、MapReduce框架中,在Map和Reduce之间的combiner的作用是() A、对Map的输出结果排序 B、对中间过程的输出进行本地的聚集

Hadoop 集群基本操作命令-王建雄-2016-08-22

Hadoop 集群基本操作命令 列出所有Hadoop Shell支持的命令 $ bin/hadoop fs -help (注:一般手动安装hadoop大数据平台,只需要创建一个用户即可,所有的操作命令就可以在这个用户下执行;现在是使用ambari安装的dadoop大数据平台,安装过程中会自动创建hadoop生态系统组件的用户,那么就可以到相应的用户下操作了,当然也可以在root用户下执行。下面的图就是执行的结果,只是hadoop shell 支持的所有命令,详细命令解说在下面,因为太多,我没有粘贴。) 显示关于某个命令的详细信息 $ bin/hadoop fs -help command-name (注:可能有些命令,不知道什么意思,那么可以通过上面的命令查看该命令的详细使用信息。例子: 这里我用的是hdfs用户。) 注:上面的两个命令就可以帮助查找所有的haodoop命令和该命令的详细使用资料。

创建一个名为 /daxiong 的目录 $ bin/hadoop dfs -mkdir /daxiong 查看名为 /daxiong/myfile.txt 的文件内容$ bin/hadoop dfs -cat /hadoop dfs -cat /user/haha/part-m-00000 上图看到的是我上传上去的一张表,我只截了一部分图。 注:hadoop fs <..> 命令等同于hadoop dfs <..> 命令(hdfs fs/dfs)显示Datanode列表 $ bin/hadoop dfsadmin -report

$ bin/hadoop dfsadmin -help 命令能列出所有当前支持的命令。比如: -report:报告HDFS的基本统计信息。 注:有些信息也可以在NameNode Web服务首页看到 运行HDFS文件系统检查工具(fsck tools) 用法:hadoop fsck [GENERIC_OPTIONS] [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]] 命令选项描述 检查的起始目录。 -move 移动受损文件到/lost+found -delete 删除受损文件。 -openforwrite 打印出写打开的文件。 -files 打印出正被检查的文件。 -blocks 打印出块信息报告。 -locations 打印出每个块的位置信息。 -racks 打印出data-node的网络拓扑结构。 打印版本信息 用法:hadoop version 运行集群平衡工具。管理员可以简单的按Ctrl-C来停止平衡过程(balancer)

java 基础知识之hadoop源码阅读必备(一)

java 程序员你真的懂java吗? 一起来看下hadoop中的如何去使用java的 大数据是目前IT技术中最火热的话题,也是未来的行业方向,越来越多的人参与到大数据的学习行列中。从最基础的伪分布式环境搭建,再到分布式环境搭建,再进入代码的编写工作。这时候码农和大牛的分界点已经出现了,所谓的码农就是你让我做什么我就做什么,我只负责实现,不管原理,也不想知道原理。大牛就开始不听的问自己why?why?why?于是乎,很自然的去看源码了。然而像hadoop这样的源码N多人参与了修改和完善,看起来非常的吃力。然后不管如何大牛就是大牛,再硬的骨头也要啃。目前做大数据的80%都是从WEB开发转变过来的,什么spring mvc框架、SSH框架非常熟悉,其实不管你做了多少年的WEB开发,你很少接触到hadoop中java代码编写的风格,有些人根本就看不懂什么意思。下面我来介绍下hadoop源码怎么看。 hadoop体现的是分布式框架,因此所有的通信都基于RPC来操作,关于RPC的操作后续再介绍。hadoop源码怎么看系列分多个阶段介绍,下面重点介绍下JA V A基础知识。 一、多线程编程 在hadoop源码中,我们能看到大量的类似这样的代码 return executor.submit(new Callable() { @Override public String call() throws Exception { //方法类 } 下面简单介绍下java的多线程编程 启动一个线程可以使用下列几种方式 1、创建一个Runnable,来调度,返回结果为空。 ExecutorService executor = Executors.newFixedThreadPool(5); executor.submit(new Runnable() { @Override public void run() { System.out.println("runnable1 running."); } }); 这种方式启动一个线程后,在后台运行,不用等到结果,因为也不会返回结果 2、创建一个Callable,来调度,有返回结果 Future future1 = executor.submit(new Callable() { @Override public String call() throws Exception { // TODO Auto-generated method stub //具体执行一些内部操作 return "返回结果了!"; } }); System.out.println("task1: " + future1.get());

hadoop常用命令

启动Hadoop ?进入HADOOP_HOME目录。 ?执行sh bin/start-all.sh 关闭Hadoop ?进入HADOOP_HOME目录。 ?执行sh bin/stop-all.sh 1、查看指定目录下内容 hadoopdfs –ls [文件目录] eg: hadoopdfs –ls /user/wangkai.pt 2、打开某个已存在文件 hadoopdfs –cat [file_path] eg:hadoopdfs -cat /user/wangkai.pt/data.txt 3、将本地文件存储至hadoop hadoopfs –put [本地地址] [hadoop目录] hadoopfs –put /home/t/file.txt /user/t (file.txt是文件名) 4、将本地文件夹存储至hadoop hadoopfs –put [本地目录] [hadoop目录] hadoopfs –put /home/t/dir_name /user/t (dir_name是文件夹名) 5、将hadoop上某个文件down至本地已有目录下hadoopfs -get [文件目录] [本地目录] hadoopfs –get /user/t/ok.txt /home/t 6、删除hadoop上指定文件 hadoopfs –rm [文件地址] hadoopfs –rm /user/t/ok.txt 7、删除hadoop上指定文件夹(包含子目录等)hadoopfs –rm [目录地址] hadoopfs –rmr /user/t

8、在hadoop指定目录内创建新目录 hadoopfs –mkdir /user/t 9、在hadoop指定目录下新建一个空文件 使用touchz命令: hadoop fs -touchz /user/new.txt 10、将hadoop上某个文件重命名 使用mv命令: hadoop fs –mv /user/test.txt /user/ok.txt (将test.txt重命名为ok.txt) 11、将hadoop指定目录下所有内容保存为一个文件,同时down至本地hadoopdfs –getmerge /user /home/t 12、将正在运行的hadoop作业kill掉 hadoop job –kill [job-id] 1、列出所有Hadoop Shell支持的命令 $ bin/hadoopfs -help 2、显示关于某个命令的详细信息 $ bin/hadoopfs -help command-name 3、用户可使用以下命令在指定路径下查看历史日志汇总 $ bin/hadoop job -history output-dir 这条命令会显示作业的细节信息,失败和终止的任务细节。 4、关于作业的更多细节,比如成功的任务,以及对每个任务的所做的尝试次数等可以用下面的命令查看 $ bin/hadoop job -history all output-dir 5、格式化一个新的分布式文件系统: $ bin/hadoopnamenode -format 6、在分配的NameNode上,运行下面的命令启动HDFS: $ bin/start-dfs.sh bin/start-dfs.sh脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动DataNode守护进程。 7、在分配的JobTracker上,运行下面的命令启动Map/Reduce: $ bin/start-mapred.sh bin/start-mapred.sh脚本会参照JobTracker上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动TaskTracker守护进程。 8、在分配的NameNode上,执行下面的命令停止HDFS: $ bin/stop-dfs.sh

Hadoop命令大全

Hadoop命令大全 Hadoop配置: Hadoop配置文件core-site.xml应增加如下配置,否则可能重启后发生Hadoop 命名节点文件丢失问题: hadoop.tmp.dir /home/limingguang/hadoopdata 环境变量设置: 为了便于使用各种命令,可以在.bashrc文件中添加如下内容: export JAVA_HOME=/home/limingguang/jdk1.7.0_07 export HADOOP_HOME=/home/limingguang/hadoop-1.0.3 export HIVE_HOME=/home/limingguang/hive-0.9.0 export MAHOUT_HOME=/home/limingguang/mahout-distribution-0.7 export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$MAHOUT_HOME/bin: $PATH export HADOOP_HOME_WARN_SUPPRESS=1 具体目录请更改为安装目录,HADOOP_HOME_WARN_SUPPRESS变量为抑制HADOOP_HOME变量重复时的告警。 常用命令:

1、列出所有Hadoop Shell支持的命令 $ bin/hadoop fs -help 2、显示关于某个命令的详细信息 $ bin/hadoop fs -help command-name 3、用户可使用以下命令在指定路径下查看历史日志汇总 $ bin/hadoop job -history output-dir 这条命令会显示作业的细节信息,失败和终止的任务细节。 4、关于作业的更多细节,比如成功的任务,以及对每个任务的所做的尝试次数等可以用下面的命令查看 $ bin/hadoop job -history all output-dir 5、格式化一个新的分布式文件系统: $ bin/hadoop namenode -format 6、在分配的NameNode上,运行下面的命令启动HDFS: $ bin/start-dfs.sh bin/start-dfs.sh脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动DataNode守护进程。 7、在分配的JobTracker上,运行下面的命令启动Map/Reduce: $ bin/start-mapred.sh bin/start-mapred.sh脚本会参照JobTracker上${HADOOP_CONF_DIR}/slaves 文件的内容,在所有列出的slave上启动TaskTracker守护进程。 8、在分配的NameNode上,执行下面的命令停止HDFS: $ bin/stop-dfs.sh bin/stop-dfs.sh脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上停止DataNode守护进程。 9、在分配的JobTracker上,运行下面的命令停止Map/Reduce: $ bin/stop-mapred.sh bin/stop-mapred.sh脚本会参照JobTracker上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上停止TaskTracker守护进程。 10、启动所有 $ bin/start-all.sh 11、关闭所有 $ bin/stop-all.sh DFSShell 10、创建一个名为 /foodir 的目录 $ bin/hadoop dfs -mkdir /foodir 11、创建一个名为 /foodir 的目录 $ bin/hadoop dfs -mkdir /foodir 12、查看名为 /foodir/myfile.txt 的文件内容 $ bin/hadoop dfs -cat /foodir/myfile.txt

Hadoop题库

1. 以下哪一项不属于Hadoop可以运行的模式___C___。 A. 单机(本地)模式 B. 伪分布式模式 C. 互联模式 D. 分布式模式 2. Hadoop的作者是下面哪一位__B____。 A. Martin Fowler B. Doug cutting C. Kent Beck D. Grace Hopper 3. 下列哪个程序通常与 NameNode 在同一个节点启动__D___。 A. TaskTracker B. DataNode C. SecondaryNameNode D. Jobtracker 4. HDFS 默认 Block Size的大小是___B___。 5. 下列哪项通常是集群的最主要瓶颈____C__。 A. CPU B. 网络

C. 磁盘IO D. 内存 6. 下列关于MapReduce说法不正确的是_____C_。 A. MapReduce是一种计算框架 B. MapReduce来源于google的学术论文 C. MapReduce程序只能用java语言编写 D. MapReduce隐藏了并行计算的细节,方便使用 8. HDFS是基于流数据模式访问和处理超大文件的需求而开发的,具有高容错、高可靠性、高可扩展性、高吞吐率等特征,适合的读写任务是 __D____。 A.一次写入,少次读 B.多次写入,少次读 C.多次写入,多次读 D.一次写入,多次读 9. HBase依靠__A____存储底层数据。 A. HDFS B. Hadoop C. Memory D. MapReduce 10. HBase依赖___D___提供强大的计算能力。 A. Zookeeper B. Chubby C. RPC D. MapReduce

hadoop提交作业分析

Hadoop提交作业流程分析 bin/hadoop jar mainclass args …… 这样的命令,各位玩Hadoop的估计已经调用过NN次了,每次写好一个Project或对Project做修改后,都必须打个Jar包,然后再用上面的命令提交到Hadoop Cluster上去运行,在开发阶段那是极其繁琐的。程序员是“最懒”的,既然麻烦肯定是要想些法子减少无谓的键盘敲击,顺带延长键盘寿命。比如有的人就写了些Shell脚本来自动编译、打包,然后提交到Hadoop。但还是稍显麻烦,目前比较方便的方法就是用Hadoop eclipse plugin,可以浏览管理HDFS,自动创建MR程序的模板文件,最爽的就是直接Run on hadoop了,但版本有点跟不上Hadoop的主版本了,目前的MR模板还是的。还有一款叫Hadoop Studio的软件,看上去貌似是蛮强大,但是没试过,这里不做评论。那么它们是怎么做到不用上面那个命令来提交作业的呢不知道没关系,开源的嘛,不懂得就直接看源码分析,这就是开源软件的最大利处。 我们首先从bin/hadoop这个Shell脚本开始分析,看这个脚本内部到底做了什么,如何来提交Hadoop作业的。 因为是Java程序,这个脚本最终都是要调用Java来运行的,所以这个脚本最重要的就是添加一些前置参数,如CLASSPATH等。所以,我们直接跳到这个脚本的最后一行,看它到底添加了那些参数,然后再

逐个分析(本文忽略了脚本中配置环境参数载入、Java查找、cygwin 处理等的分析)。 #run it exec "$JAVA"$JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH"$CLASS "$@" 从上面这行命令我们可以看到这个脚本最终添加了如下几个重要参数:JAVA_HEAP_MAX、HADOOP_OPTS、CLASSPATH、CLASS。下面我们来一个个的分析(本文基于Cloudera Hadoop 分析)。 首先是JAVA_HEAP_MAX,这个就比较简单了,主要涉及代码如下:JAVA_HEAP_MAX=-Xmx1000m # check envvars which might override default args if [ "$HADOOP_HEAPSIZE" !="" ];then #echo"run with heapsize $HADOOP_HEAPSIZE" JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m" #echo$JAVA_HEAP_MAX fi

(完整版)hadoop常见笔试题答案

Hadoop测试题 一.填空题,1分(41空),2分(42空)共125分 1.(每空1分) datanode 负责HDFS数据存储。 2.(每空1分)HDFS中的block默认保存 3 份。 3.(每空1分)ResourceManager 程序通常与NameNode 在一个节点启动。 4.(每空1分)hadoop运行的模式有:单机模式、伪分布模式、完全分布式。 5.(每空1分)Hadoop集群搭建中常用的4个配置文件为:core-site.xml 、hdfs-site.xml 、mapred-site.xml 、yarn-site.xml 。 6.(每空2分)HDFS将要存储的大文件进行分割,分割后存放在既定的存储块 中,并通过预先设定的优化处理,模式对存储的数据进行预处理,从而解决了大文件储存与计算的需求。 7.(每空2分)一个HDFS集群包括两大部分,即namenode 与datanode 。一般来说,一 个集群中会有一个namenode 和多个datanode 共同工作。 8.(每空2分) namenode 是集群的主服务器,主要是用于对HDFS中所有的文件及内容 数据进行维护,并不断读取记录集群中datanode 主机情况与工作状态,并通过读取与写入镜像日志文件的方式进行存储。 9.(每空2分) datanode 在HDFS集群中担任任务具体执行角色,是集群的工作节点。文 件被分成若干个相同大小的数据块,分别存储在若干个datanode 上,datanode 会定期向集群内namenode 发送自己的运行状态与存储内容,并根据namnode 发送的指令进行工作。 10.(每空2分) namenode 负责接受客户端发送过来的信息,然后将文件存储位置信息发 送给client ,由client 直接与datanode 进行联系,从而进行部分文件的运算与操作。 11.(每空1分) block 是HDFS的基本存储单元,默认大小是128M 。 12.(每空1分)HDFS还可以对已经存储的Block进行多副本备份,将每个Block至少复制到 3 个相互独立的硬件上,这样可以快速恢复损坏的数据。 13.(每空2分)当客户端的读取操作发生错误的时候,客户端会向namenode 报告错误,并 请求namenode 排除错误的datanode 后,重新根据距离排序,从而获得一个新的的读取路径。如果所有的datanode 都报告读取失败,那么整个任务就读取失败。14.(每空2分)对于写出操作过程中出现的问题,FSDataOutputStream 并不会立即关闭。 客户端向Namenode报告错误信息,并直接向提供备份的datanode 中写入数据。备份datanode 被升级为首选datanode ,并在其余2个datanode 中备份复制数据。 NameNode对错误的DataNode进行标记以便后续对其进行处理。 15.(每空1分)格式化HDFS系统的命令为:hdfs namenode –format 。 16.(每空1分)启动hdfs的shell脚本为:start-dfs.sh 。 17.(每空1分)启动yarn的shell脚本为:start-yarn.sh 。 18.(每空1分)停止hdfs的shell脚本为:stop-dfs.sh 。 19.(每空1分)hadoop创建多级目录(如:/a/b/c)的命令为:hadoop fs –mkdir –p /a/b/c 。 20.(每空1分)hadoop显示根目录命令为:hadoop fs –lsr 。 21.(每空1分)hadoop包含的四大模块分别是:Hadoop common 、HDFS 、

hadoop入门学习资料大全

Hadoop是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。简单地说来,Hadoop是一个可以更容易开发和运行处理大规模数据的软件平台。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。 搜索了一些WatchStor存储论坛关于hadoop入门的一些资料分享给大家希望对大家有帮助 jackrabbit封装hadoop的设计与实现 https://www.doczj.com/doc/fe11555031.html,/thread-60444-1-1.html 用Hadoop进行分布式数据处理 https://www.doczj.com/doc/fe11555031.html,/thread-60447-1-1.html

Hadoop源代码eclipse编译教程 https://www.doczj.com/doc/fe11555031.html,/thread-60448-1-2.html Hadoop技术讲解 https://www.doczj.com/doc/fe11555031.html,/thread-60449-1-2.html Hadoop权威指南(原版) https://www.doczj.com/doc/fe11555031.html,/thread-60450-1-2.html Hadoop源代码分析完整版 https://www.doczj.com/doc/fe11555031.html,/thread-60451-1-2.html 基于Hadoop的Map_Reduce框架研究报告 https://www.doczj.com/doc/fe11555031.html,/thread-60452-1-2.html Hadoop任务调度 https://www.doczj.com/doc/fe11555031.html,/thread-60453-1-2.html Hadoop使用常见问题以及解决方法 https://www.doczj.com/doc/fe11555031.html,/thread-60454-1-2.html HBase:权威指南

Hadoop入门教程(四)MR作业的提交监控、输入输出控制及特性使用-北京尚学堂

北京尚学堂提供 上次课讲到MR重要运行参数,本次继续为大家讲解MapReduce相关 提交作业并监控 JobClient是用户作业与JobTracker交互的主要接口,它提供了提交作业,跟踪作业进度、访问任务报告及logs、以及获取MR集群状态信息等方法。 提交作业流程包括: ?检查作业的输入输出 ?计算作业的输入分片(InputSplit) ?如果需要,为DistributedCache设置必须的账户信息 ?将作业用到的jar包文件和配置信息拷贝至文件系统(一般为HDFS)上的MR系统路径中 ?提交作业到JobTracker,并可监控作业状态 作业历史(Job History)文件会记录在https://www.doczj.com/doc/fe11555031.html,er.location指定的位置,默认在作业输出路径下的logs/history/路径下。因此历史日志默认在mapred.output.dir/logs/history下。 用户可以将https://www.doczj.com/doc/fe11555031.html,er.location值设置为none来不记录作业历史。 使用命令来查看历史日志: 1 $hadoop job -history output-dir 上面命令会显示作业的详细信息、失败的被kill的任务(tip)的详细信息。使用下面命令可以查看作业更详细的信息: 1 $hadoop job -history all output-dir 可以使用OutputLogFilter从输出路径中过滤日志文件。 一般,我们创建应用,通过JobConf设置作业的各种属性,然后使用JobClient提交作业并监控进度。 作业控制 有时可能需要一个作业链完成复杂的任务。这点是可以轻松实现的,因为作业输出一般都在分布式文件系统上,作业输出可以当做下个作业的输入,这样就形成了链式作业。 这种作业成功是否依赖于客户端。客户端可以使用以下方式来控制作业的执行: ?runJob(JobConf):提交作业并仅在作业完成时返回 ?submitJob(JobConf):提交作业后立即返回一个RunningJob的引用,使用它可以查询作业状态并处理调度逻辑。 ?JobConf.setJobEndNotificationURI(String):设置作业完成时通知 你也可以使用Oozie来实现复杂的作业链。 作业输入 下面讲作业输入的内容。 InputFormat描述MR作业的输入信息。InputFormat有以下作用: 1.验证作业的输入信息

Hadoop最全面试题整理(附目录)

Hadoop面试题目及答案(附目录) 选择题 1.下面哪个程序负责HDFS 数据存储。 a)NameNode b)Jobtracker c)Datanode d)secondaryNameNode e)tasktracker 答案C datanode 2. HDfS 中的block 默认保存几份? a)3 份b)2 份c)1 份d)不确定 答案A 默认3 份 3.下列哪个程序通常与NameNode 在一个节点启动? a)SecondaryNameNode b)DataNode c)TaskTracker d)Jobtracker 答案D 分析:hadoop 的集群是基于master/slave 模式,namenode 和jobtracker 属于master,datanode 和tasktracker 属于slave,master 只有一个,而slave 有多个SecondaryNameNode 内存需求和NameNode 在一个数量级上,所以通常secondaryNameNode(运行在单独的物理机器上)和NameNode 运行在不同的机器上。 JobTracker 和TaskTracker JobTracker 对应于NameNode,TaskTracker 对应于DataNode,DataNode 和NameNode 是针对数据存放来而言的,JobTracker 和TaskTracker 是对于MapReduce 执行而言的。mapreduce 中几个主要概念,mapreduce 整体上可以分为这么几条执行线索:jobclient,JobTracker 与TaskTracker。 1、JobClient 会在用户端通过JobClient 类将应用已经配置参数打包成jar 文件存储到hdfs,并把路径提交到Jobtracker,然后由JobTracker 创建每一个Task(即MapTask 和ReduceTask)并将它们分发到各个TaskTracker 服务中去执行。 2、JobTracker 是一个master 服务,软件启动之后JobTracker 接收Job,负责调度Job 的每一个子任务task 运行于TaskTracker 上,并监控它们,如果发现有失败的task 就重新运行它。一般情况应该把JobTracker 部署在单独的机器上。 3、TaskTracker 是运行在多个节点上的slaver 服务。TaskTracker 主动与JobTracker 通信,接收作业,并负责直接执行每一个任务。TaskTracker 都需要运行在HDFS 的DataNode 上。 4. Hadoop 作者 a)Martin Fowler b)Kent Beck c)Doug cutting 答案C Doug cutting 5. HDFS 默认Block Size a)32MB b)64MB c)128MB 答案:B 6. 下列哪项通常是集群的最主要瓶颈 a)CPU b)网络c)磁盘IO d)内存 答案:C 磁盘 首先集群的目的是为了节省成本,用廉价的pc 机,取代小型机及大型机。小型机和大型机

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