随着捕获的数量的数量每年每度净增,大家的寄放也急需扩充。比超多商铺正留意识到“数据为王”这大器晚成道理,不过大家怎么着解析那些数据吧?答案正是“通过Hadoop”。在本类别的第二篇文章中,java编制程序行家StevenHaines将会解释怎么样是MapReduce应用,甚至怎么样构建一个粗略的MapReduce应用。

使用Hadoop构建MapReduce应用。  谷歌对其的定义:MapReduce是黄金时代种变成模型,用于大面积数据集(以T为级其他数额)的相互作用运算。顾客定义五个map函数来拍卖一群Key-Value对以生成另一堆中间的Key-Value对,再定义多少个reduce函数将具有那一个中级的有同等Key的value归并起来。“Map”(映射)和“Reduce”(简化)的概念和它们的关键观念都以从函数式编制程序语言借用而来的,还会有从矢量编制程序语言借来的风味。在落实进程中,需点名多少个map函数,用来把生龙活虎组键值对映射成后生可畏组新的键值对,再钦点并发的reduce函数,用来保证全体映射的每一个键值对分享相像的键组。在函数式编制程序中认为,应当保持数据不可变性,防止再七个经过或线程间分享数据,那就表示,map函数即便很简短,却得以经过八个或多个线程再同三个列表上同期奉行,由于列表自个儿并未退换,线程之间互不影响。

Hadoop数据类型

流量相当的大的日志假使直接写入Hadoop对Namenode负载过大,所以入库前统风姿罗曼蒂克,能够把各种节点的日记凑并成三个文件写入HDFS。
依照景况准时合成,写入到hdfs里面。

本类别中的第风度翩翩篇小说描述了Hadoop被设计用来消除的专门的工作难题领域,甚至赋予它消除这个主题素材本领的内部架构。运转在Hadoop内的施用被称作为MapReduce应用,因而那部小说将演示怎么着塑造多个简短的MapReduce应用。

  MapReduce模型:

为了能让MapReduce的key/value对能够在集群中活动,MapReduce框架提供了七个种类化key/value对的艺术

亚洲城579官方网站 1

动用MapReduce与Hadoop实行大数据深入解析 
http://www.linuxidc.com/Linux/2013-07/87312.htm

  Hadoop
MapReduce模型首要有Mapper和Reducer三个抽象类。Mapper首要担当对数码的剖析管理,最终转变为Key-Value的数据结构;Reducer首要肩负获取Mapper出来的结果,对结果进行进一层总计。Hadoop
MapReduce
达成有储的平均,但为落到实处总计的均衡,那是其原来的样子的败笔,由此,平日使用规避的办法来解决此主题材料,由技士来保险。

但MapReduce并分歧意私自的类都能做为key,独有完毕了WriableComparable也许Wirable接口(表明,Wriable也兑现了WriableComparable接口卡塔尔国的类才干做为键,因为在reduce阶段要基于key来进行排序,并将一直以来key的值进行合併。

大家看看日志的大小,200G的dns日志文件,小编压缩到了18G,要是用awk
perl当然也足以,不过管理速度确定未有分布式那样的给力。

亚洲城579官方网站,搭建开辟条件

在您可见利用Hadoop从前,你必要安装Java
6(或然更新版本),你能够从Oracle的网站上下载对应你的平台的本子。其它,若是你是运营在Windows上,由于Hadoop运维的正经开拓和布局平台是Linux,所以你要求接纳Cygwin来运作Hadoop。Mac
OXS客商能够无难点地原生态运营Hadoop。

Hadoop能够从它的Releases页面下载,不过它的版本号结构解释起来具备一些儿挑衅性。说来讲去,1.x的代码分支蕴含当前的安定团结发行版,2.x.x分层包括用于版本2的Hadoop的阿尔法代码,0.22.x的代码分支与2.x.x的平等,除了未有security,0.23的代码分支去除了高可用性(high
availability)。0.20.x的代码分支是历史遗留难点,你能够忽视。对于本文中的例子,作者将动用0.23.x代码分支,写那篇小说是该支行的新颖版本是0.23.5,可是对于分娩景况,你可能会想下载1.x本子或2.x.x本子。

下载并解压文件到您的地点机械上。如若你安顿要做较长期的Hadoop开荒,你最佳将解压的bin文件夹增加到你的PATH情状变量中。你能够经过试行bin目录中的hadoop命令来测量检验你的设置:

   bin/hadoop

实行该命令而从未其他参数的话会展现以下输出:

Usage:
hadoop [–config confdir] COMMAND

     
where COMMAND is one of:

  fs  
                run a generic filesystem user client

 
version              print the version

  jar
<jar>            run a jar file

 
distcp <srcurl> <desturl> copy file or directories
recursively

 
archive -archiveName NAME -p <parent path> <src>*
<dest> create a hadoop archive

 
classpath            prints the class path needed to get
the

     
                Hadoop jar and the required libraries

 
daemonlog            get/set the log level for each daemon

 or

 
CLASSNAME            run the class named CLASSNAME

 

Most
commands print help when invoked w/o parameters.

 

虽说有为数不菲指令可以传递给Hadoop,不过出于本文中我们将关爱在支付处境中奉行Hadoop应用程序,因而大家唯生龙活虎感兴趣的是底下的授命:

hadoop
jar <jar-file-name>

 

亚洲城579官方网站 2

就此要想和谐写的类能做为key的话,则此类必得兑现Comparable接口。

亚洲城579官方网站 3

Hello,MapReduce

亚洲城579官方网站 4

下边大家来写三个这么的类代表七个都市里面包车型客车航

Hadoop Streaming原理

在此外编制程序语言中,你编写的首先段程序日常都以二个“Hello,World”程序。对Hadoop和MapReduce来讲,每种人编写的正经程序是Word Count应用程序。Word Count应用程序计算在大气的文书中各样单词现身的次数。它是五个读书MapReduce的全面例子,因为它的mapping和reducing步骤很琐细,但却指点你使用MapReduce的措施思谋。上面是对Word Count应用程序中逐大器晚成零部件及其作用的总结:

  • FileInputFormat:大家定义二个FileInputFormat去读取钦赐目录下(作为第二个参数字传送递给MapReduce应用程序)的装有文件,并传递那一个文件给多个TextInputFormat(见Listing
    1)以便分发给我们的mappers。
  • TextInputFormat:Hadoop暗中认可的InputFormat是TextInputFormat,它每一趟读取风流洒脱行,并把字节偏移作为key(LongWritable),将那行文本作为value(Text),并重返key。
  • Word Count
    Mapper
    :那是贰个大家写的类用来把InputFormat传给它的单行文本标志化成单词,然后把单词本人和叁个用于表示大家见过这么些词的数字“1”绑在一同
  • Combiner:在支付条件中大家不需求combiner,不过combiner(或combiner的功能)是由reducer(在本文前面会有描述)落成的,在传递(键/值)对(key/value
    pair)到reducer在此以前运转在本地节点上。应用combiner可以大幅地晋升品质,可是你供给确定保障combining你的结果不会破坏你的reducer:为了能让reducer承受combiner的意义,它的操作必得是可整合的(即reducer应与combiner同样能与map结合),不然,发送到reducer的map将不会爆发不利的结果。
  • Word Count Reducer: word count 
    reducer选取多个映射(map),它映射各种单词到记录该单词全部被mapper观望到的次数的列表。未有combiner,reducer将会选用一个单词和二个全为”1”的联谊,可是出于大家让reducer承受combiner的效果与利益,大家选择到得将是二个挨家挨户待被相加到联合的数字的集纳。
  • TextOutputFormat:本例中,大家利用TextOutputFormat类,并报告它key为Text类型,value为IntWritable类型。
  • FileOutputFormat:TextOutputFormat发送它的格式化输出到FileOutputFormat,后面一个将结果写入到温馨创设的”output”目录中。

您恐怕会嫌疑为啥大家把String叫做“Text”,把number叫做“IntWritable”和“LongWritable”。原因是为着能够让value接收布满式的章程在Hadoop文件系统(HDFS)传递,存在一些概念体系化的法则。幸运的是,Hadoop为平时等级次序提供了打包(wrapper),不过要是你供给本人支付,那么它提供了Writable接口,你能够经过达成该接口来完毕团结的急需。

Listing 1
呈现了笔者们的第二个MapReduce应用程序的源代码。

 

package com.geekcap.hadoopexamples;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.KeyValueTextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

/**
 * Created by IntelliJ IDEA.
 * User: shaines
 * Date: 12/9/12
 * Time: 9:25 PM
 * To change this template use File | Settings | File Templates.
 */
public class WordCount extends Configured implements Tool {

    public static class MapClass extends MapReduceBase
            implements Mapper<LongWritable, Text, Text, IntWritable>
    {
        private Text word = new Text();
        private final static IntWritable one = new IntWritable( 1 );

        public void map( LongWritable key, // Offset into the file
                         Text value,
                         OutputCollector<Text, IntWritable> output,
                         Reporter reporter) throws IOException
        {
            // Get the value as a String
            String text = value.toString().toLowerCase();

            // Replace all non-characters
            text = text.replaceAll( "'", "" );
            text = text.replaceAll( "[^a-zA-Z]", " " );

            // Iterate over all of the words in the string
            StringTokenizer st = new StringTokenizer( text );
            while( st.hasMoreTokens() )
            {
                // Get the next token and set it as the text for our "word" variable
                word.set( st.nextToken() );

                // Output this word as the key and 1 as the value
                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
        {
            // Iterate over all of the values (counts of occurrences of this word)
            int count = 0;
            while( values.hasNext() )
            {
                // Add the value to our count
                count += values.next().get();
            }

            // Output the word with its count (wrapped in an IntWritable)
            output.collect( key, new IntWritable( count ) );
        }
    }


    public int run(String[] args) throws Exception
    {
        // Create a configuration
        Configuration conf = getConf();

        // Create a job from the default configuration that will use the WordCount class
        JobConf job = new JobConf( conf, WordCount.class );

        // Define our input path as the first command line argument and our output path as the second
        Path in = new Path( args[0] );
        Path out = new Path( args[1] );

        // Create File Input/Output formats for these paths (in the job)
        FileInputFormat.setInputPaths( job, in );
        FileOutputFormat.setOutputPath( job, out );

        // Configure the job: name, mapper, reducer, and combiner
        job.setJobName( "WordCount" );
        job.setMapperClass( MapClass.class );
        job.setReducerClass( Reduce.class );
        job.setCombinerClass( Reduce.class );

        // Configure the output
        job.setOutputFormat( TextOutputFormat.class );
        job.setOutputKeyClass( Text.class );
        job.setOutputValueClass( IntWritable.class );

        // Run the job
        JobClient.runJob(job);
        return 0;
    }

    public static void main(String[] args) throws Exception
    {
        // Start the WordCount MapReduce application
        int res = ToolRunner.run( new Configuration(),
                new WordCount(),
                args );
        System.exit( res );
    }
}

 

 

 

注解

您会小心到我们把Mapper类和Reducer类包涵在与WordCount类本人相仿的文书内。固然不设有一定准则须要必得定义你的mapper和reducer在平等的公文内,然则惯举例此,除非您的mapper或reducer极其复杂。

亚洲城579官方网站 5

亚洲城579官方网站 6

  1. package csdn.jtlyuan;  
  2. import java.io.DataInput;  
  3. import java.io.DataOutput;  
  4. import java.io.IOException;  
  5. import org.apache.hadoop.io.WritableComparable;  
  6. public class Edge implements WritableComparable<Edge>{  
  7.     private String startNode;  
  8.     private String endNode;  
  9.     @Override  
  10.     public void readFields(DataInput in) throws IOException {  
  11.         this.startNode=in.readUTF();  
  12.         this.endNode=in.readUTF();    
  13.     }  
  14.   
  15.     @Override  
  16.     public void write(DataOutput out) throws IOException {  
  17.         out.writeUTF(this.startNode);  
  18.         out.writeUTF(this.endNode);  
  19.     }  
  20.   
  21.     @Override  
  22.     public int compareTo(Edge o) {  
  23.         return (this.startNode.compareTo(o.startNode) != 0)?  
  24.                 this.startNode.compareTo(o.startNode):  
  25.                     this.endNode.compareTo(o.endNode);  
  26.     }  
  27.   
  28. }  

mapper和reducer会从行业内部输入中读取客户数据,生龙活虎行生龙活虎行管理后发送给规范输出。Streaming工具会创设MapReduce作业,发送给各种tasktracker,同一时候监察和控制全部作业的实践进度。

  MapReduce框框架结构成:

MapReduce程序的各个阶段:

其余语言,只借使造福选拔规范输入输出就足以做mapreduce~

  亚洲城579官方网站 7

亚洲城579官方网站 8

再搞早先我们先轻松测验下shell模拟mapreduce的性质速度~

 

Mapper:把输入映射为key value情势

亚洲城579官方网站 9

相关文章