MapReduce

Hadoop之MapReduce的计数器

ぐ巨炮叔叔 提交于 2020-01-30 17:09:01
代码存于github: https://github.com/zuodaoyong/Hadoop Hadoop作业在运行时维护了若干个内置计数器,方便用户监控已处理数据量和已产生的输出数据量 1、采用枚举的方式统计计数 Counter getCounter(Enum<?> var1); enum CustomCounter{ normal,abnormal } context.getCounter(CustomCounter.normal).increment(1); 2、采用计数器组,计数器名称的方式统计 Counter getCounter(String var1, String var2); context.getCounter("logMapper","parseLog_true").increment(1); 3、实例 public class LogMapper extends Mapper<LongWritable,Text,Text,NullWritable>{ String[] splits=null; Text k=new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException,

Hadoop学习笔记(二):MapReduce的特性-计数器、排序

痴心易碎 提交于 2020-01-30 14:38:01
计数器 计数器是一种收集作业统计信息的有效手段,用于质量控制或应用级统计。说白了就是统计整个mr作业所有数据行中符合某个if条件的数量,(除某些内置计数器之外)。仅当一个作业执行成功之后,计数器的值才是完整可靠的。如果一个任务在作业执行期间失败,则相关计数器值会减小,计数器是全局的。 计数器分为以下几种: 1)内置计数器,内置的作业计数器实际上由jobtracker维护,而不必在整个网络中发送; 2)用户自定义的java计数器,由其关联任务维护,并定期传到tasktracker,再由tasktracker传给jobtracker,可以定义多个枚举类型,每个枚举类型有多个字段,枚举类型名称即为组名,枚举字段名称即为计数器名称。 Reporter对象的incrCounter()方法重载: public void incrCounter(enum,long amout) 3)动态计数器,不由java枚举类型定义的计数器,由于在编译阶段就已指定java枚举类型的字段,故无法使用枚举类型动态新建计数器。 Reporter对象的incrCounter()方法重载: public void incrCounter(String group,String counter,long amout) 自定义java计数器由于使用枚举类型,默认名称为(枚举名称)$(枚举字段名称),可读性较差

大数据系列之分布式计算批处理引擎MapReduce实践-排序

人走茶凉 提交于 2020-01-30 13:55:20
清明刚过,该来学习点新的知识点了。 上次说到关于MapReduce对于文本中词频的统计使用WordCount。如果还有同学不熟悉的可以参考博文 大数据系列之分布式计算批处理引擎MapReduce实践 。 博文发表后很多同学私下反映对于MapReduce的处理原理没有了解到。在这篇博文中楼主与大家交流下MapReduce的数据处理原理及MR中各角色的职责。 文末还有示例代码讲解。。 1.MapReduce中的数据流动 最简单的过程: map - reduce 定制了partitioner以将map的结果送往指定reducer的过程: map - partition - reduce 增加了在本地先进行一次reduce(优化)的过程: map - combine - partition - reduce 2.Partition的概念和使用 得到map产生的记录后,他们该分配给哪些reducer来处理呢?hadoop默认是根据散列值来派发,但是实际中,这并不能很高效或者按照我们要求的去执行任务。例如,经过partition处理后,一个节点的reducer分配到了20条记录,另一个却分配到了10W万条,试想,这种情况效率如何。又或者,我们想要处理后得到的文件按照一定的规律进行输出,假设有两个reducer,我们想要最终结果中part-00000中存储的是”h”开头的记录的结果,part

MapReduce-深度剖析

隐身守侯 提交于 2020-01-30 13:37:00
1.概述   在接触了第一代MapReduce和第二代MapReduce之后,或许会有这样的疑惑,我们从一些书籍和博客当中获取MapReduce的一些原理和算法,在第一代当中会有JobTrack,TaskTrack之类的术语,在第二代会有ResourceManager,NodeManager,ApplicationMaster等等术语。然又有Shuffle、Partitioner、Sort、Combiner等关键字,如何区分它们,理顺其之间的联系。   在Hadoop2.x大行其道的年代,其优秀的资源管理框架(系统),高可用的分布式存储系统,备受企业青睐。然因上述之惑,往往不能尽得其中之深意。此篇博客笔者为大家一一解惑。 2.计算模型   在阅读和研究第一代MapReduce和第二代MapReduce之后,我们可以发现MapReduce其实由两部分组成,一者为其计算模型,二者为其运行环境。到这里,就不难解释为何在第一代MapReduce里面由Shuffle、Sort等内容,而在第二代MapReduce中也同样存在其相关内容。原因很简单,在Hadoop2.x中,MapReduce的变化,只有其运行环境变化了,然其计算模型依旧不变。   在MapReduce的计算模型当中,对方法进行了高阶抽象,其精华为Map Task和Reduce Task,在Map阶段完成对应的map函数的逻辑实现

MapReduce数据流向分析

家住魔仙堡 提交于 2020-01-30 13:36:36
MR数据流向示意图 步骤 1 输入文件从HDFS流向Mapper节点。在一般情况下,map所需要的数据就存在本节点,这就是数据本地化计算的优势,但是往往集群中数据分布不均衡(1000台节点,数据冗余度是10,每个文件并不能均匀分布在每个节点上),而MR的计算槽位是均匀分布在节点上的(配置文件中指定的map和reduce数量),所以势必有些计算节点需要通过数据传输从别的节点获取计算数据。 步骤 2 Mapper输出到内存缓冲区。Mapper的计算结果并不是立即写入本地的文件系统,而是首先写入内存缓冲区,并且 Partitioner 也发生在这个阶段,就是map的计算结果写入到内存缓冲区的时候会进行 Partitioner 操作对输出键值对进行分区。 步骤 3 从内存缓冲区到本地磁盘。当内存缓冲区达到一定的阈值的时候就会将数据以临时文件的形式写入本地磁盘,这个过程称为spill,spill的是还会按照key的序列化字节做排序。当整个map任务结束的时候,会对这些临时文件以Partitioner为单位进行合并操作,对于同一个分区将进行多次合并,排序后生成一个大的R egion文件。内存缓冲区的默认大小是100M,溢写比例默认是0.8(可以通过spill.percent参数来调节)。 如果用户作业设置了 Combiner ,那么spill之前会对map的输出键值对调用 Combiner

Hadoop集群大数据解决方案之核心组件MapReduce(四)

时光总嘲笑我的痴心妄想 提交于 2020-01-30 08:26:08
前言    当今天下,大数据组件百花齐放,满足不同应用场景的计算框架层出不穷,mapreduce似乎早已很难有一席之地,但是天下武功,殊途同归,不管怎么变化,都离不开mapreduce的基础,今天,就一起揭开下最原始的计算框架mapreduce的面纱。 核心设计理念    分布式计算,即移动计算 而不移动数据。 原理剖析    如图1,官方给出的mapreduce剑谱,一招一式,尽显奥妙无穷,整体个人觉得分为4部分,split阶段,map阶段,shuffle阶段,reduce阶段,具体如下: 图1 官方mapreduce原理图谱 Split阶段    Map阶段之前还有个准备,就是split,中文意思就是分片,顾名思义就是当一个大文件要进行mapreduce计算时,假设2T,不可能把2T文件全部加载到内存,先要对文件进行切割,就是对应的split操作,那切割成多大才合理呢?split有个原理公式: long minSize = Math . max ( getFormatMinSplitSize ( ) , getMinSplitSize ( job ) ) ; long maxSize = getMaxSplitSize ( job ) ; long blockSize = file . getBlockSize ( ) ; long splitSize =

Hadoop之MapReduce的Combiner解析

情到浓时终转凉″ 提交于 2020-01-30 07:07:19
Combiner 是MapReduce程序中Mapper和Reducer之外的一种组件,其父类是Reducer。 Combiner和Reducer的区别在于运行的位置 (1)Combiner是在每一个MapTask所在的节点运行 (2)Reducer是接受全局所有的Mapper端的输出结果 注意: (1)Combiner对每一个MapTask的输出进行局部汇总,减少网络传输量 (2)Combiner不能影响业务逻辑,Combiner输出KV应该和Reducer的输入KV类型对于起来 不适用Combiner的例子: Mapper 3 5 7->(3+5+7)/3=5 2 6 ->(2+6)/2=4 Reducer (3+5+7+2+6)/5=23/5 不等于(5+4)/2=9/2 自定义Combiner (1)自定义一个 Combiner 继承 Reducer ,重写 Reduce 方法 public class WordcountCombiner extends Reducer<Text, IntWritable,Text,IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,

Why hadoop does not recognize my Map class?

☆樱花仙子☆ 提交于 2020-01-30 05:55:06
问题 I am trying to run my PDFWordCount map-reduce program on hadoop 2.2.0 but I get this error: 13/12/25 23:37:26 INFO mapreduce.Job: Task Id : attempt_1388041362368_0003_m_000009_2, Status : FAILED Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class PDFWordCount$MyMap not found at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1720) at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186) at org.apache.hadoop.mapred

Error of start of hadoop of the program:PriviledgedActionException

↘锁芯ラ 提交于 2020-01-30 03:10:14
问题 I wrote following program using namespace std; #include "hadoop/Pipes.hh" #include "hadoop/TemplateFactory.hh" #include "hadoop/StringUtils.hh" #include "libpq-fe.h" extern "C" { #include "traverser.h" } class IndexMap:public HadoopPipes::Mapper { public: IndexMap(HadoopPipes::TaskContext & context) { } void map(HadoopPipes::MapContext & context) { std::vector<std::string> paths = HadoopUtils::splitString(context.getInputValue(), "rn"); unsigned int k = 4; unsigned int l = 0; string

day_03小笔记

≡放荡痞女 提交于 2020-01-29 22:18:32
HDFS的API操作 1.准备工作: 启动集群:start-all.sh 登录 http://hdp-1:50070/ 2.在idea里从hdfs下载文件到本地磁盘 package com.zpark.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.URI; public class HdfsClient { //如果这个上传成功了,说明hadoop环境配置成功 // 首先申请获得资源 // URI 统一资源标志符 @Test public void put()throws IOException,InterruptedException{ // FileSystem fileSystem =FileSystem.get(URI.create("hdfs://hdp-1:9000"),new Configuration(),"root"); // fileSystem.copyFromLocalFile(new