程序员的自我修养
Home » 分类目录 » Apache Hadoop

mapreduce二次排序

0条评论1,092次浏览

之前离职的哥们的mr任务留了一堆的坑,他把value当成排序过的,于是reduce里面全部是如此统计dau、设备数的:

心好累,手动微笑。

正所谓前人挖坑后人填,我不入地狱谁入地狱。于是开始一个个mr的改代码。

方法一:用set统计

用set的好处就是改动极小,但存在oom的风险。实际跑了下线上的数据,果然oom了。摔!

方法二:bloom filter

好处是改动也不大,也不会oom,但就统计的结果可能会比实际的值要小。考虑到数据量也没有大到要用bloom filter的地步,且希望数据尽量的精准,放弃!

方法三:mr二次排序

(更多…)

标签:,

CDH集群调优:内存、Vcores和DRF

1条评论8,240次浏览

吐槽

最近“闲”来无事,通过CM把vcores使用情况调出来看了一眼,发现不论集群中有多少个任务在跑,已分配的VCores始终不会超过120。而集群的可用Vcores是360(15台机器×24虚拟核)。这就相当于CPU资源只用到了1/3,作为一个半强迫症患者绝对不能容忍这样的事情发生。

分析的过程不表,其实很简单就是几个参数的问题。本以为CM能智能的将这些东西配好,现在看来好像不行。以下记录结论。

DRF和相关参数

DRF: Dominant Resource Fairness,根据CPU和内存公平调度资源。CDH动态资源池默认采用的DRF计划策略。简单的理解就是内存不够的时候,多余的CPU就不会分配任务了,就让他空着;CPU不够的时候,多出来的内存也不会再启动任务了。

理解这个计划策略后,再查看Yarn启动任务时资源相关的参数,发现有以下几个参数可能会产生影响:

  • mapreduce.map.memory.mb,map任务内存,cdh默认1G
  • mapreduce.map.cpu.vcores,map任务虚拟CPU核数,cdh默认1
  • mapreduce.reduce.memory.mb,reduce任务内存,cdh默认1G
  • mapreduce.reduce.cpu.vcores,reduce任务虚拟CPU核数,cdh默认1
  • yarn.nodemanager.resource.memory-mb,容器内存,cdh默认8G
  • yarn.nodemanager.resource.cpu-vcores,容器虚拟CPU核数,cdh默认8,但CM会自动检测内核数并修改,我这里被自动改成了24。

可以看到默认配置下,CPU核数和内存是1:1G的比例来启动任务的。
(更多…)

分类:Apache Hadoop, CDH
标签:,

Hadoop集群搭建全过程

3条评论3,264次浏览

最近需要紧急搭建Hadoop集群,以前搭建都没留下文档和记录,导致这次忙的晕头转向。现在终于搞定了,决定将全部过程记录下来,方便下次使用。

软件环境

  • 操作系统:Centos 6.4
  • JDK:1.6.0_27
  • Hadoop:1.0.4
  • HBase:0.94.17
  • Zookeeper:3.4.5

前置步骤

范围:Hadoop集群所有机器

操作身份:root用户

创建Hadoop用户

关闭SELINUX

修改:

阅读全文>>

标签:,

MapReduce库类

0条评论2,009次浏览

FieldSelection

FieldSelection包含FieldSelectionMapper、FieldSelectionReducer和FieldSelectionHelper,根据字面意思就可以了解其作用:用于选择field。直接上示例:

测试数据

代码示例

其中第三行用于选择输出的field。冒号之前的为key的field,之后为value的field。"0,3:1,2,4-"的意思为:选择第1、4列为key,选择第2、3、5及其以后的列为value。此外还可以使用类似“4-7”这样的方式来选择一个范围。为了直观的区分key和value,第五行将key和value的分隔符设置为“|”。

阅读全文>>

标签:,

Hadoop的一些特性

0条评论6,323次浏览

分片、Block与Map数量

Block,即HDFS上的基本存储单元,默认大小是64MB。我们都知道一个block对应一个map任务,但实际过程是先将文件分片,然后每个分片启动一个map任务,只不过通常情况下分片的大小和Block是一致的。可以通过参数来将分片的大小进行改变,相应的启动的map数量也会改变,其对应关系如下:

最小分片大小 最大分片大小 块大小 分片大小 说明
1L(默认值) Long.MAX_VALUE(默认值) 64MB(默认值) 64MB
1L(默认值) Long.MAX_VALUE(默认值) 128MB 128MB
128MB Long.MAX_VALUE(默认值) 64MB(默认值) 128MB 通过设置最小分片值来改变分片大小
1L(默认值) 32MB 64MB(默认值) 32MB 通过设置最大分片值来改变分片大小

如上所示,当分片值是128MB而block大小是64MB时,这时启动的map数量比默认情况下要少一半,但本地开销会变大,因为涉及到数据的传输等过程。当分片值是32MB而block大小是64MB时,这时启动的map数量比默认情况下要多一倍,也就是一个block启动了2个map来进行处理。

若遇到一个文件分为多个block存放,但启动任务时候又必须放在一个map中进行处理,则可以通过将分片最小值设置成一个大于该文件的值来实现。

对应API和参数如下:

  • FileInputFormat.setMaxInputSplitSize(..),mapred.max.split.size,设置分片最大值
  • FileInputFormat.setMinInputSplitSize(..),mapred.min.split.size,设置分片最小值

处理未知的脏数据

一般而言,脏数据过滤是每个任务通过编码来实现的,例如过滤掉维度数量不符的数据,过滤掉某些维度为空的数据,等等。但还有一些脏数据却无法通过编码来处理,因为这类脏数据是无法预料的,例如因为网络传输出错而导致的超长行,或者特殊字符(EOF等等)。一个超长的行很大可能会造成序列化、网络传输等过程中内存溢出。

对于这样的情况,若能准确的分析出问题所在,也可以通过代码来实现脏数据的过滤。如,使用TextInputFormat、NLineInputFormat时,可以通过设置mapred.linerecordreader.maxlength参数来防止“超长“行类的脏数据。但对于客观原因上无法定位其原因的脏数据,则只能采用SkipBadRecords工具类来避免出错了。

阅读全文>>

分类:Apache Hadoop
标签:

战5渣系列——记一次排查MR程序逻辑错误

0条评论2,354次浏览

前言

战5渣,意思是战斗力只有5的渣渣。战斗力多少算高没有一般的定论,但战斗力只有5的肯定是渣渣,如下图所示。战5渣系列(真心希望这个系列的文章越少越好)用来记录工作中遇到的那些想抽自己脸的错误经历,并希望以此为戒。
战斗值

背景简介

出错部分的需求简介:统计某个时间范围内(范围A)新装的电话号码在某个时间范围内(范围B)的通话频率,并过滤出通话频率小于阀值的电话号码。

若是采用关系型数据库来处理,由于通话记录的量十分巨大,oracle基本上处于工作不能的状态。于是采用MR来进行处理,相当于一个非常简单的join操作。

由于时间范围A内的新装电话号码数量并不大,基本都在1W条以内,所以可以采用map端join来进行处理:map阶段处理的是每一条通话记录,在map的setup阶段将所有号码读出并放入hashmap中,遍历通话记录时若该记录的号码在hashmap中时,将相应的计数值加1。最后在map的cleanup阶段,遍历该hashmap,并输出所有的记录。

reduce阶段则统计每条记录的总频率,然后将小于阀值的记录输出。

阅读全文>>

标签:,

Java自动适配读取Hdfs和本地文件

1条评论3,071次浏览

开发MR程序通常是在本地跑local MapReduce进行测试,等测试完毕后则将mapred-site.xml放入src下打包成jar放在集群上进行测试。MR若需要读取文件作为数据源,则FileInputFormat.addInputPath(job, new Path(args[0]) );。但有时会出现需要读取Hdfs文件内容但又不能作为数据源输入的场景,比如写HBase MapReduce的时候,输入数据源为HBase的表,但是需要读取Hdfs上某文件的数据来进行操作。

单纯的读取本地文件内容实现起来十分简单,但读取本地文件内容的代码放在集群上是无法使用的。是否有方法能自动适配本地和集群两种模式下的文件读取?通过查找Hadoop API发现可通过FileSystem来实现。具体实现代码如下:

如是本地测试,项目中不包含mapred-site.xml文件(或将其中集群的配置信息注掉),则根据传入的conf则读取本地的文件;反之,添加mapred-site.xml文件,则读取Hdfs上的文件。本地测试时,getResult(conf, "/home/yurnom/data")将读取本地文件or文件夹/home/yurnom/data下面的内容;集群测试时,getResult(conf, "/home/yurnom/data")将读取hdfs://master:9000/home/yurnom/data文件or文件夹下面的内容。

标签:,
11
profile
  • 文章总数:81篇
  • 评论总数:241条
  • 分类总数:32个
  • 标签总数:45个
  • 运行时间:1253天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论
  • Anonymous: :?: :razz: :sad:
  • Anonymous: 牛
  • Anonymous: 楼主你好,我偶尔也会 遇到Reconnect due to socket error: java.nio.channels.ClosedCha...
  • Anonymous: sdfs
  • Anonymous: :arrow: :neutral: :cry:
  • Anonymous: java.io.NotSerializableExcepti on: DStream checkpointing has been enabled but the DStreams with their...
  • wick: HI,请问一下,U,S,V得到 ,怎么得到近似矩阵 (用spark java),谢谢。
  • Michael Whitaker: Thank you for this blog, it was very helpful in troubleshooting my own issues. It seems that no...
  • Anonymous: :mad:
  • Anonymous: :???:
  • Anonymous: :mad: :mad: :mad:
  • 洋流: 哥们,我问个问题,你 把testOnborrow去掉了。。 如果得到的jedis资源...
  • 洋流: 哥们,我问个问题,你 把testOnborrow去掉了。。 如果得到的jedis资源...
  • Anonymous: :razz: :evil: :grin:
  • 张瑞昌: 有很多,比较常见的是 Jacob迭代法,一次迭代O (n^3),迭代次数不清楚 ...
  • Anonymous: :mrgreen:
  • lc277: 你好 我想问下一般删除节点 要多久,要删除的datano de大概用了1t,解除...
  • Anonymous: 你好 我想问下一般删除节点 要多久,要删除的datano de大概用了1t,解除...
  • Anonymous: :smile: :grin: :eek:
  • 李雪璇: 想要完整代码,可以帮 忙发给我吗