英文原文:cloudera,编译:ImportNew – Royce Wong

Hadoop从这里开始!和我一起学习下使用Hadoop的基本知识,下文将以Hadoop Tutorial为主体带大家走一遍如何使用Hadoop分析数据!

这个专题将描述用户在使用Hadoop MapReduce(下文缩写成MR)框架过程中面对的最重要的东西。Mapreduce由client APIs和运行时(runtime)环境组成。其中client APIs用来编写MR程序,运行时环境提供MR运行的环境。API有2个版本,也就是我们通常说的老api和新api。运行时有两个版本:MRv1和MRv2。该教程将会基于老api和MRv1。

其中:老api在org.apache.hadoop.mapred包中,新api在 org.apache.hadoop.mapreduce中。

前提

首先请确认已经正确安装、配置了CDH,并且正常运行。

MR概览

Hadoop MapReduce 是一个开源的计算框架,运行在其上的应用通常可在拥有几千个节点的集群上并行处理海量数据(可以使P级的数据集)。

MR作业通常将数据集切分为独立的chunk,这些chunk以并行的方式被map tasks处理。MR框架对map的输出进行排序,然后将这些输出作为输入给reduce tasks处理。典型的方式是作业的输入和最终输出都存储在分布式文件系统(HDFS)上。

通常部署时计算节点也是存储节点,MR框架和HDFS运行在同一个集群上。这样的配置允许框架在集群的节点上有效的调度任务,当然待分析的数据已经在集群上存在,这也导致了集群内部会产生高聚合带宽现象(通常我们在集群规划部署时就需要注意这样一个特点)。

MapReduce框架由一个Jobracker(通常简称JT)和数个TaskTracker(TT)组成(在cdh4中如果使用了Jobtracker HA特性,则会有2个Jobtracer,其中只有一个为active,另一个作为standby处于inactive状态)。JobTracker负责在所有tasktracker上调度任务,监控任务并重新执行失败的任务。所有的tasktracker执行jobtracker分配过来的任务。

应用至少需要制定输入、输出路径,并提供实现了适当接口和(或)抽象类的map和reduce函数。这些路径和函数以及其他的任务参数组成了任务配置对象(job configuration)。Hadoop 任务客户端提交任务(jar包或者可执行程序等)和配置对象到JT。JT将任务实现和配置对象分发到数个TT(由JT分配),调度、监控任务,并向客户端返回状态和检测信息。

Hadoop由JavaTM实现,用户可以使用java、基于JVM的其他语言或者以下的方式开发MR应用:

  • Hadoop Streaming- 允许用户以任何一种可执行程序(如shell脚本)实现为mapper和(或)reducer来创建和运行MR任务。
  • Hadoop Pigs – 一种兼容SWIG(不基于JNITM)的C++ API,用来实现MapReduce应用。

输入和输出

MapReuce框架内部处理的是kv对(key-value pair),因为MR将任务的输入当做一个kv对的集合,将输出看做一个kv对的集合。输出kv对的类型可以不同于输入对。

key和vaue的类型必须在框架内可序列化(serializable),所以key value 必须实现Writable接口。同时,key 类必须实现WritableComparable以便框架对key进行排序。

典型的MR任务输入和输出类型转换图为:
(input) k1-v1 -> map -> k2-v2 -> combine -> k2-v2 -> reduce -> k3-v3 (output)

经典的WordCount1.0

玩Hadoop不得不提WordCount,CDH原文里也以这为例,当然这里也以它为例:)

简单说下WordCount,它是计算输入数据中每个word的出现次数。因为足够简单所以经典,和Hello World有的一拼!

上源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package org.myorg;
 
    import java.io.IOException;
    import java.util.*;
 
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.conf.*;
    import org.apache.hadoop.io.*;
    import org.apache.hadoop.mapred.*;
    import org.apache.hadoop.util.*;
 
    public class WordCount {
 
      public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
 
        public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
          String line = value.toString();
          StringTokenizer tokenizer = new StringTokenizer(line);
          while (tokenizer.hasMoreTokens()) {
            word.set(tokenizer.nextToken());
            output.collect(word, one);
          }
        }
      }
 
      public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
        public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
          int sum = 0;
          while (values.hasNext()) {
            sum += values.next().get();
          }
          output.collect(key, new IntWritable(sum));
        }
      }
 
      public static void main(String[] args) throws Exception {
        JobConf conf = new JobConf(WordCount.class);
        conf.setJobName("wordcount");
 
        conf.setOutputKeyClass(Text.class);
        conf.setOutputValueClass(IntWritable.class);
 
        conf.setMapperClass(Map.class);
        conf.setCombinerClass(Reduce.class);
        conf.setReducerClass(Reduce.class);
 
        conf.setInputFormat(TextInputFormat.class);
        conf.setOutputFormat(TextOutputFormat.class);
 
        FileInputFormat.setInputPaths(conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(conf, new Path(args[1]));
 
        JobClient.runJob(conf);
      }
    }

首先编译WordCount.java

$ mkdir wordcount_classes $ javac -cp classpath -d wordcount_classes WordCount.java

其中classpath为:

  • CDH4 /usr/lib/hadoop/:/usr/lib/hadoop/client-0.20/
  • CDH3 /usr/lib/hadoop-0.20/hadoop-0.20.2-cdh3u4-core.jar

打成jar包:

1
$ jar -cvf wordcount.jar -C wordcount_classes/ .

假定:

  • /user/cloudera/wordcount/input 输入HDFS路径
  • /user/cloudera/wordcount/output 输出HDFS路径

创建文本格式的数据并移动到HDFS:

1
2
3
4
$ echo "Hello World Bye World" > file0
$ echo "Hello Hadoop Goodbye Hadoop" > file1
$ hadoop fs -mkdir /user/cloudera /user/cloudera/wordcount /user/cloudera/wordcount/input
$ hadoop fs -put file* /user/cloudera/wordcount/input

运行wordcount:

1
$ hadoop jar wordcount.jar org.myorg.WordCount /user/cloudera/wordcount/input /user/cloudera/wordcount/output

运行完毕后查看输出:

1
2
3
4
5
6
$ hadoop fs -cat /user/cloudera/wordcount/output/part-00000
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2

MR应用可以用-files参数指定在当前工作目录下存在的多个文件,多个文件使用英文逗号分隔。-libjars参数可以将多个jar包添加到map和reduce的classpath。-archive参数可以将工作路径下的zip或jar包当做参数传递,而zip或jar包名字被当做一个链接(link)。更加详细的命令信息可以参考Hadoop Command Guide.

使用-libjars和-files参数运行wordcount的命令:

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

详细看下wordcount应用

14-26行实现了Mapper,通过map方法(18-25行)一次处理一行记录,记录格式为指定的TextInputFormat(行49)。然后将一条记录行根据空格分隔成一个个单词。分隔使用的是类StringTokenizer,然后以<word,1>形式发布kv对。

在前面给定的输入中,第一个map将会输出:< Hello, 1> < World, 1> < Bye, 1> < World, 1>

第二个map输出: < Hello, 1> < Hadoop, 1> < Goodbye, 1> < Hadoop, 1>

我们会在本篇文章中深入学习该任务中map的大量输出的数目,并研究如何在更细粒度控制输出。

WordCount 在46行指定了combiner。因此每个map的输出在根据key排序后会通过本地的combiner(实现和reducer一致)进行本地聚合。

第一个map的最终输出:< Bye, 1> < Hello, 1> < World, 2>

第二个map输出:< Goodbye, 1> < Hadoop, 2> < Hello, 1>

Reducer实现(28-36行)通过reduce方法(29-35)仅对值进行叠加,计算每个单词的出现次数。

所以wordcount的最终输出为: < Bye, 1> < Goodbye, 1> < Hadoop, 2> < Hello, 2> < World, 2>

run方法通过JobConf对象指定了该任务的各种参数,例如输入/输出路径,kv类型,输入输出格式等等。程序通过调用 JobClient.runJob (55行)提交并开始监测任务的执行进度。

后面我们将对JobConf、JobClient、Tool做进一步学习。

英文原文:cloudera,编译:ImportNew – Royce Wong

本文链接:http://www.importnew.com/4248.html

相关文章

Hadoop教程(一)的更多相关文章

  1. 在 Windows 上安装 Hadoop 教程(转)

    在 Windows 上安装 Hadoop 教程 一见 2010.1.6 www.hadoopor.com/hadoopor@foxmail.com 1. 安装 JDK 不建议只安装 JRE,而是建议直 ...

  2. Hadoop教程(五)Hadoop分布式集群部署安装

    Hadoop教程(五)Hadoop分布式集群部署安装 1 Hadoop分布式集群部署安装 在hadoop2.0中通常由两个NameNode组成,一个处于active状态,还有一个处于standby状态 ...

  3. 单节点部署Hadoop教程

    搭建HDFS 增加主机名 我这里仅仅增加了master主机名 [root@10 /xinghl/hadoop/bin]$ cat /etc/hosts 127.0.0.1 localhost 10.0 ...

  4. Hadoop教程之编写HelloWorld(2)

    前面我们写了一个Hadoop程序,并让它跑起来了.但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce.没错,上一节我们写了一个MapReduce的HelloWorld程序,那这一节 ...

  5. hadoop教程

    http://www.yiibai.com/hadoop/hadoop_enviornment_setup.html 改网站讲解详细,还有源码,值得借阅

  6. hadoop是什么?新手自学hadoop教程【附】大数据系统学习教程

    Hadoop是一个由Apache基金会所开发的分布式系统基础架构. Hadoop是一个专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式. Hadoop=HDFS(文件 ...

  7. 转载:Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04

    原文 http://www.powerxing.com/install-hadoop/ 当开始着手实践 Hadoop 时,安装 Hadoop 往往会成为新手的一道门槛.尽管安装其实很简单,书上有写到, ...

  8. Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS

    摘自:http://www.powerxing.com/install-hadoop-cluster/ 本教程讲述如何配置 Hadoop 集群,默认读者已经掌握了 Hadoop 的单机伪分布式配置,否 ...

  9. Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04

    摘自: http://www.cnblogs.com/kinglau/p/3796164.html http://www.powerxing.com/install-hadoop/ 当开始着手实践 H ...

随机推荐

  1. 1 producer — n consumers 模型 实现

    #include<stdio.h> #include<string.h> #include<pthread.h> #include<stdlib.h> ...

  2. Knockout v3.4.0 中文版教程-4-通过监控数组工作

    2.通过监控数组工作 1. 监控数组 如果你想检测或者响应一个对象的改变,你用observables.如果你想检测和响应一个集合的改变,使用observableArray.这个在很多情况下都非常有用, ...

  3. Java-确定字符串是否包含子字符串

    利用String自带的函数和正则来实现 package com.tj; public class MyClass implements Cloneable { public static void m ...

  4. HDU-1392 Surround the Trees,凸包入门!

    Surround the Trees 此题讨论区里大喊有坑,原谅我没有仔细读题还跳过了坑点. 题意:平面上有n棵树,选一些树用绳子围成一个包围圈,使得所有的树都在这个圈内. 思路:简单凸包入门题,凸包 ...

  5. 九度oj 题目1096:日期差值

    题目描述: 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天 输入: 有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD 输出: 每组数据输出一行, ...

  6. [UOJ#223][BZOJ4654][Noi2016]国王饮水记

    [UOJ#223][BZOJ4654][Noi2016]国王饮水记 试题描述 跳蚤国有 n 个城市,伟大的跳蚤国王居住在跳蚤国首都中,即 1 号城市中.跳蚤国最大的问题就是饮水问题,由于首都中居住的跳 ...

  7. POJ 1330:Nearest Common Ancestors【lca】

    题目大意:唔 就是给你一棵树 和两个点,问你这两个点的LCA是什么 思路:LCA的模板题,要注意的是在并查集合并的时候并不是随意的,而是把叶子节点合到父节点上 #include<cstdio&g ...

  8. KS求有向图强连通分量模板

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; *maxn; struct no ...

  9. 如何快速下载maven依赖jar包

    找到settings.xml文件.在mirrors里面添加下面的代码: <mirror> <id>alimaven</id> <mirrorOf>cen ...

  10. UVa1363 Joseph's Problem

    把整个序列进行拆分成[k,k/2),[k/2, k/3), [k/3,k/4)...k[k/a, k/b)的形式,对于k/i(整除)相同的项,k%i成等差数列. /*by SilverN*/ #inc ...