文档章节

hdfs数据压缩

张恕鑫
 张恕鑫
发布于 2015/03/19 11:26
字数 684
阅读 25
收藏 0

公司一共不到30台的hadoop集群,hdfs大小共有120T,最近监控老是报警,磁盘不足(低于5%时候报警),之前一直忙于业务,没时间整理集群,整理之后发现现有文件一共在34T左右,加上3份冗余,整个hdfs占用在103T,之前清洗的时候直接是文本存入,且没有进行任何压缩,这块儿应该会有很大的优化空间。其中有一份记录用户手机安装应用的日志文件占用在5T左右,先拿他下手。

因为hive有三种文件存储格式,TEXTFILE、SEQUENCEFILE、RCFILE,其中前两个是基于行存储,RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按列划分,再垂直划分”的设计理念,当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列,所以选择RCFILE,再用Gzip压缩。

之间还犯了一个比较2的错误:因为之前有同事调研过rcfile(已离职),所以用show create table XX的方式查看建表语句,发现是

CREATE EXTERNAL TABLE XX(
  ......
  )
PARTITIONED BY ( 
  day int
)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' 
  COLLECTION ITEMS TERMINATED BY ',' 
  LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
LOCATION
  '/user/hive/data/XX';

就照搬改一下字段,建了一张app_install的RCFile表,sql导入之前的数据

set mapred.job.priority=VERY_HIGH;
set hive.merge.mapredfiles=true;
set hive.merge.smallfiles.avgsize=200000000;
set hive.exec.compress.output=true;
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; 
set mapred.job.name=app_install.$_DAY;

insert overwrite table app_install1 PARTITION (day=$_DAY)
select XXX from tb1 where day=$_DAY

报错,查看hadoop运行日志,发现是

FATAL ExecReducer: java.lang.UnsupportedOperationException: Currently the writer can only accept BytesRefArrayWritableat 
org.apache.hadoop.hive.ql.io.RCFile$Writer.append(RCFile.java:880)
at org.apache.hadoop.hive.ql.io.RCFileOutputFormat$2.write(RCFileOutputFormat.java:140)
at org.apache.hadoop.hive.ql.exec.FileSinkOperator.processOp(FileSinkOperator.java:588)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:84)
at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.createForwardJoinObject(CommonJoinOperator.java:389)at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genObject(CommonJoinOperator.java:715)
at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genObject(CommonJoinOperator.java:697)
at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genObject(CommonJoinOperator.java:697)at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.checkAndGenObject(CommonJoinOperator.java:856)
at org.apache.hadoop.hive.ql.exec.JoinOperator.endGroup(JoinOperator.java:265)
at org.apache.hadoop.hive.ql.exec.ExecReducer.reduce(ExecReducer.java:198)
at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:519)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:420)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)

网上说是hive的一个bug,一直以为就是这个bug,折腾了一天,最后试着按照网上的方式修改了一下建表语句

REATE EXTERNAL TABLE XX(
  ......
  )
PARTITIONED BY ( 
  day int
)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\t' 
  COLLECTION ITEMS TERMINATED BY ',' 
  LINES TERMINATED BY '\n' 
STORED AS RCFILE
LOCATION
  '/user/hive/data/XX';

结果正常运行,然后用show create table XX查看语句发现又变成了

STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'

 郁闷死了,就是建表语句然后用show create table显示的不一样导致,虽然是个小问题,但是也颇费经历,希望发家以后也有这种情况可以避免

© 著作权归作者所有

共有 人打赏支持
张恕鑫
粉丝 0
博文 6
码字总数 1154
作品 0
海淀
程序员
百度HDFS集群的数据压缩实现大数据的储存

当前,数字信息急剧膨胀。根据IDC的研究结果,2011年创造的信息数量达到1800EB,每年产生的数字信息量还在以60%的速度高速增长,到 2020年,全球每年产生的数字信息将达到35ZB。面对海量数据...

董广明
2012/08/12
0
0
HDFS之SequenceFile和MapFile

Hadoop的HDFS和MapReduce子框架主要是针对大数据文件来设计的,在小文件的处理上不但效率低下,而且十分消耗磁盘空间(每一个小文件占用一个Block,HDFS默认block大小为64M)。解决办法通常是选...

mahout
2012/09/02
0
0
RCFile高效存储结构(以及其他hive存储格式)

/* *首先声明的是:此文纯粹是收藏,再看Hive,在创建表的时候有store as (format)其中有一种格式就是RCFile,所以我想了解RCFile到底是什么类型的存储格式,这篇文章写的很好~~~~~~~ */ 本...

LIPING234
2013/10/09
0
0
hadoop的概念

hadoop的概念 网上会经常遇到各种hadoop的概念,Hive,HBase,Hdfs都各是什么呢? 首先从hdfs说起,hdfs是分布式文件系统,它把集群当作单机一样做文件操作,文件可能存在于多个机器上,具体...

王二狗子11
01/07
0
0
HDFS SequenceFile MapFile

一、SequenceFile SequenceFile的存储类似于Log文件,所不同的是Log File的每条记录的是纯文本数据,而SequenceFile的每条记录是可序列化的字符数组。 SequenceFile可通过如下API来完成新记录...

颓废的幻想者
2016/03/31
46
0

没有更多内容

加载失败,请刷新页面

加载更多

造谣造到t-io老巢了

只发当事人的截图,不发表评论,以免有引导嫌疑 PS1:截图是由不同的人发过来的 PS2:本人已经不在此微信群 PS3:图3是2018-09-23的t-io官方群的一个发言小统计,有助于让人认识到他们的其中...

talent-tan
38分钟前
56
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0
Spring 转换 model 为 json 时增加属性

缘起 目前的项目中有个需求是在附件对象转换成 json 时增加个 url 属性,以前的方式是在返回附件对象或列表时候做一次统一处理,这次想看看 spring 或者 jackson fasterxml 是否自带类似功能...

郁也风
今天
3
0
10大PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的 10个开源的Php比特币项目,将有助于你了解在自己的应用中 如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方...

汇智网教程
今天
4
0
springclould feign客户端添加全局参数

用springclould feign作为调用服务的客户端,一般来说参数可以写在feignclient的方法参数里 有时需要所有feign请求都统一添加一些参数,例如token用于鉴权等,可以这样做: 添加一个配置类,...

canneljls
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部