程序员的自我修养
Home » Apache Hadoop » Hadoop的一些特性

Hadoop的一些特性

0条评论4,892次浏览

分片、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工具类来避免出错了。

SkipBadRecords主要API:

  • setAttemptsToStartSkipping(..),对应参数mapred.skip.attempts.to.start.skipping,默认值为2,设置开始skip操作前的尝试次数
  • setMapperMaxSkipRecords(..),对应参数mapred.skip.map.max.skip.records,默认值为0,设置map出错时跳过的记录数
  • setReducerMaxSkipGroups(..),对应参数mapred.skip.reduce.max.skip.groups,默认值为0,设置reduce出错是跳过的group数(shuffle分组)
  • setSkipOutputPath(..),对应参数mapred.skip.out.dir,默认值为输出路径下的_logs文件夹
  • ...

Map和Reduce任务执行失败4次则会宣告彻底失败(可通过参数mapred.map.max.attemps和mapred.reduce.max.attemps来修改),若开启skip mode(将map和reduce跳过的记录/group数量调为大于零的整数),则会出现下列过程:

  1. 第一次尝试,失败
  2. 第二次尝试,失败
  3. 第三次尝试,开启skip mode,任然失败,但失败记录被tasktracker保存
  4. 第四次尝试,开启skip mode,跳过上次失败的记录一定范围内的数据

可以发现若采用默认参数:2次失败开启skip mode、4次失败则任务失败,则会造成只能处理一条未知脏数据。有此可见skip mode对于脏数据较多的情况是不合适的。

输入输出格式

Hadoop支持多种输入格式化方法,默认是TextInputFormat,可以通过Job.setInputFormatClass(..)方法来改变其默认值。

KeyValueTextInputFormat

KeyValueTextInputFormat与默认的TextInputFormat的区别就是:TextInputFormat的key为当前行的偏移量,value为本行数据;KeyValueTextInputFormat的key为分隔符前的数据,value为分隔符后面的数据。

使用KeyValueTextInputFormat需要注意以下三行代码必须要有:

第一行为设置分隔符,默认分隔符为制表符(\t),若为默认分隔符可以不设置。第二行表示采用KeyValueTextInputFormat来格式化输入,如不设置则将采用默认的TextInputFormat。

较早版本中,分隔符的设置方法如下:

NLineInputFormat

通常来说,一个Hadoop Job有多少个Map是根据输入数据有多少个Block而定的,例如TextInputFormat、KeyValueTextInputFormat。这种情况下每个Map处理多少行数据是不确定的,或者说是根据Block大小来确定的。若希望每个Map处理的数据行数一样,则可以采用NLineInputFormat来处理。若一个文件有1千万行数据,设置每个Map处理100W行数据,则最终会启动10个Map来处理数据。

第一行表示采用NLineInputFormat来格式化输入,如不设置则将采用默认的TextInputFormat。第三行设置每个Map处理多少行数据(N lines),最后一个Map处理的数据可能会小于N。N也可以通过参数来设置,如下。

较早版本中采用的参数如下:

MultipleInputs

MultipleInputs用于不同的数据源/数据格式的场景。MultipleInputs可以设置多个InputFormat和多个Mapper。具体如下所示:

当采用FileInputFormat时会报java.lang.InstantiationException错误,具体原因待分析。

MultipleOutputs

MultipleOutputs可以将一个reduce的结果存放在不同的文件中。具体实现如下:

Reduce代码实现如下:

同MultipleInputs一样,当使用FileOutputFormat时会报错,原因不详。MultipleInputs和MultipleOutputs可结合使用。

(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
分类:Apache Hadoop
标签:
发表评论


profile
  • 文章总数:78篇
  • 评论总数:252条
  • 分类总数:31个
  • 标签总数:43个
  • 运行时间:946天

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

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

最新评论
  • pacificLee: :twisted:
  • 小码: 为什么没有后面的呢,只有前10个
  • Anonymous: :lol:
  • Anonymous: :razz: 楼主是属于会聊天的。 我想问,sqoop发了几个版本了,应该没这些问题了吧。
  • Anonymous: Config.kafkaConfig.kafkaGroupI d 这个是指自己配置的group id 还是从 import org.apache.kafka.common.config .Config 这个类...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 那个方法是在 spark-streaming_2.10 中 kafka...
  • Anonymous: ZkUtils.getPartitionsForTopics (zkClient, Config.kafkaConfig.topic) 你确定 kafka 里面有这个类 ? 个人在kafka 最新 稳定版...
  • Anonymous: :roll:
  • Anonymous: 很不错,试问有java版的吗?
  • Anonymous: 赞
  • Anonymous: 哈哈 看楼主的吐槽乐死了 where子句是可以写的 同样找不到资料 一点点试出来的 select id from xxxx where ${CONDITIONS} and 1=1 and 2=2 limit 4
  • EVIL: 我在运行完C4.5的代码后,显示 defined object DecisionTreeTest 是什么意思?这是有错误吗?运行结果在哪里看?
  • sf: 楼主的问题,我都遇到。。。没办法项目已经定型了,最后都硬着头 皮一个一个的改了源码
  • zz: 我去,楼主你真及时,我们今天上了新的HTTP2 push之后也发现速度曲线很奇怪,开始有200k/min,跟 另一台老的推送协议速度差不多,但是过了一会,立马降到只有几k /min,百思不得其解,我们还用了一个海外代理,在...
  • qi365: :mad: 很可恶,百度助纣为虐~
  • qi365: :? :shock: haha~ very good~
  • 张是大: 《深入浅出Spark机器学习实战(用户行为分析)》 课程网盘下载:http://pan.baidu.com/s/ 1mixvUli 密码:1pfn
  • Anonymous: :???:
  • Anonymous: 我用着sqoop感觉还可以,select 几十个字段也没事,估计是版本低。。
  • Anonymous: :grin: