`
085567
  • 浏览: 219568 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hadoop使用中的几个小细节(一)(转自淘宝数据平台团队)

阅读更多
最近在hadoop实际使用中有以下几个小细节分享:
1 中文问题
    从url中解析出中文,但hadoop中打印出来仍是乱码?我们曾经以为hadoop是不支持中文的,后来经过查看源代码,发现hadoop仅仅是不支持以gbk格式输出中文而己。

    这是TextOutputFormat.class中的代码,hadoop默认的输出都是继承自FileOutputFormat来的,FileOutputFormat的两个子类一个是基于二进制流的输出,一个就是基于文本的输出TextOutputFormat。

    public class TextOutputFormat<K, V> extends FileOutputFormat<K, V> {
  protected static class LineRecordWriter<K, V>
    implements RecordWriter<K, V> {
    private static final String utf8 = “UTF-8″;//这里被写死成了utf-8
    private static final byte[] newline;
    static {
      try {
        newline = “\n”.getBytes(utf8);
      } catch (UnsupportedEncodingException uee) {
        throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”);
      }
    }

    public LineRecordWriter(DataOutputStream out, String keyValueSeparator) {
      this.out = out;
      try {
        this.keyValueSeparator = keyValueSeparator.getBytes(utf8);
      } catch (UnsupportedEncodingException uee) {
        throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”);
      }
    }

    private void writeObject(Object o) throws IOException {
      if (o instanceof Text) {
        Text to = (Text) o;
        out.write(to.getBytes(), 0, to.getLength());//这里也需要修改
      } else {
        out.write(o.toString().getBytes(utf8));
      }
    }

}
    可以看出hadoop默认的输出写死为utf-8,因此如果decode中文正确,那么将Linux客户端的character设为utf-8是可以看到中文的。因为hadoop用utf-8的格式输出了中文。
    因为大多数数据库是用gbk来定义字段的,如果想让hadoop用gbk格式输出中文以兼容数据库怎么办?
    我们可以定义一个新的类:
    public class GbkOutputFormat<K, V> extends FileOutputFormat<K, V> {
  protected static class LineRecordWriter<K, V>
    implements RecordWriter<K, V> {
//写成gbk即可
    private static final String gbk = “gbk”;
    private static final byte[] newline;
    static {
      try {
        newline = “\n”.getBytes(gbk);
      } catch (UnsupportedEncodingException uee) {
        throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”);
      }
    }

    public LineRecordWriter(DataOutputStream out, String keyValueSeparator) {
      this.out = out;
      try {
        this.keyValueSeparator = keyValueSeparator.getBytes(gbk);
      } catch (UnsupportedEncodingException uee) {
        throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”);
      }
    }

    private void writeObject(Object o) throws IOException {
      if (o instanceof Text) {
//        Text to = (Text) o;
//        out.write(to.getBytes(), 0, to.getLength());
//      } else {
        out.write(o.toString().getBytes(gbk));
      }
    }

}
    然后在mapreduce代码中加入conf1.setOutputFormat(GbkOutputFormat.class)
    即可以gbk格式输出中文。

2 关于计算过程中的压缩和效率的对比问题
    之前曾经介绍过对输入文件采用压缩可以提高部分计算效率。现在作更进一步的说明。
    为什么压缩会提高计算速度?这是因为mapreduce计算会将数据文件分散拷贝到所有datanode上,压缩可以减少数据浪费在带宽上的时间,当这些时间大于压缩/解压缩本身的时间时,计算速度就会提高了。
    hadoop的压缩除了将输入文件进行压缩外,hadoop本身还可以在计算过程中将map输出以及将reduce输出进行压缩。这种计算当中的压缩又有什么样的效果呢?
    测试环境:35台节点的hadoop cluster,单机2 CPU,8 core,8G内存,redhat 2.6.9, 其中namenode和second namenode各一台,namenode和second namenode不作datanode
    输入文件大小为2.5G不压缩,records约为3600万条。mapreduce程序分为两个job:
    job1:map将record按user字段作key拆分,reduce中作外连接。这样最后reduce输出为87亿records,大小540G
    job2:map读入这87亿条数据并输出,reduce进行简单统计,最后的records为2.5亿条,大小16G
    计算耗时54min

    仅对第二个阶段的map作压缩(第一个阶段的map输出并不大,没有压缩的必要),测试结果:计算耗时39min

    可见时间上节约了15min,注意以下参数的不同。
    不压缩时:
    Local bytes read=1923047905109
    Local bytes written=1685607947227
    压缩时:
    Local bytes read=770579526349
    Local bytes written=245469534966
    本地读写的的数量大大降低了

    至于对reduce输出的压缩,很遗憾经过测试基本没有提高速度的效果。可能是因为第一个job的输出大多数是在本地机上进行map,不经过网络传输的原因。
    附:对map输出进行压缩,只需要添加jobConf.setMapOutputCompressorClass(DefaultCodec.class)

3 关于reduce的数量设置问题
    reduce数量究竟多少是适合的。目前测试认为reduce数量约等于cluster中datanode的总cores的一半比较合适,比如cluster中有32台datanode,每台8 core,那么reduce设置为128速度最快。因为每台机器8 core,4个作map,4个作reduce计算,正好合适。
    附小测试:对同一个程序
            reduce num=32,reduce time = 6 min
            reduce num=128, reduce time = 2 min
            reduce num=320, reduce time = 5min
分享到:
评论

相关推荐

    大数据云计算技术 淘宝网Hadoop与数据分析 taobao数据团队(共30页).ppt

    Hadoop是Apache基金会开发的一个开源项目,主要用于大规模数据集的分布式计算。其主要包含两个核心组件:分布式文件系统HDFS(Hadoop Distributed File System)和并行计算框架MapReduce。HDFS为海量数据提供了高...

    hadoop几个实例

    Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它允许在大规模集群中高效处理和存储海量数据。这个压缩包文件包含的"hadop实用案例"很可能是为了帮助初学者理解和应用Hadoop技术。以下是关于Hadoop的一些...

    DATAGURU-Hadoop数据分析平台

    标题 "DATAGURU-Hadoop数据分析平台" 指向的是一个专注于利用Hadoop进行大数据分析的综合平台。Hadoop是Apache软件基金会开发的一个开源框架,它允许在大规模分布式环境中处理和存储海量数据。这个平台可能包含了从...

    使用Hadoop构建云计算平台

    资源名称:使用Hadoop构建云计算平台内容简介:• 核心框架: HDFS和MapReduce• MapReduce — 任务的分解与结果的汇总• HDFS — Hadoop Distributed File System• — 分布式计算的基石Hadoop是一个Apache的开源...

    Google +Hadoop使用编程

    Hadoop是一种开源框架,旨在为用户提供一个无需深入了解分布式系统底层细节即可开发分布式应用的平台。通过利用集群的计算能力,Hadoop能够实现大规模数据集的快速处理与存储。作为云计算的基础组成部分之一,Hadoop...

    Hadoop 2.7.1 中文文档

    还包括一系列相关的工具和项目,如HBase(分布式NoSQL数据库)、Hive(基于Hadoop的数据仓库工具)、Pig(数据流处理平台)、Oozie(工作流调度系统)、Zookeeper(分布式协调服务)等,它们共同构建了一个强大的大...

    hadoop中文乱码问题

    在大数据处理领域,Hadoop是一个不可或缺的开源框架,它提供了分布式存储(HDFS)和分布式计算(MapReduce)的能力。然而,在处理包含中文字符的数据时,用户可能会遇到中文乱码的问题。这个问题通常出现在数据读取...

    【推荐】大数据时代,你不得不知的Hadoop使用技巧

    例如,EasyHadoop是一个开源项目,它的目标是简化Hadoop的安装和配置过程,使得Hadoop集群的搭建和维护变得更加容易。 最后,Hadoop的分布式文件系统HDFS本身也是一个需要重点掌握的部分。HDFS的设计目的是为了在...

    基于Hadoop和OpenStack的数据平台.zip

    在"dataservice2-master"这个项目中,我们可以看到一个实际的数据服务平台的实现,它可能包括了数据的采集、处理、存储和分析等功能。项目可能使用Hadoop的YARN作为资源管理和调度器,以提升计算效率;利用HBase或...

    Hadoop2.7.1中文文档

    Hadoop是Apache软件基金会开发的一个开源分布式计算框架,主要用于处理和存储海量数据。Hadoop2.7.1是Hadoop发展中的一个重要版本,它在前一个版本的基础上进行了一系列的优化和改进,增强了系统的稳定性和性能。这...

    Hadoop构建数据仓库实践1_hadoop_

    通过以上步骤,我们可以看出,Hadoop不仅提供了一个强大而灵活的平台来构建数据仓库,还为企业提供了从数据中挖掘价值的能力。在实践中,不断调整和优化这些步骤,可以更好地适应不断变化的业务需求和数据环境。王...

    基于 Hadoop 平台,使用 MapReduce 编程,统计NBA球员五项数据.zip

    在这个项目“基于 Hadoop 平台,使用 MapReduce 编程,统计NBA球员五项数据”中,我们将深入探讨如何利用 Hadoop 的核心组件 MapReduce 对 NBA 球员的数据进行分析。 MapReduce 是一种编程模型,用于大规模数据集...

    Hadoop数据分析平台搭建方案.docx

    本文档主要讲述了使用 Hadoop 平台搭建数据分析平台的方案,旨在解决传统数据分析平台在数据存储和计算性能方面的挑战。随着数据量的增长,基于数据库的传统数据分析平台的数据存储和分析计算能力受到挑战,许多企业...

    Hadoop平台数据挖掘技术研究.pdf

    在Hadoop平台中,MapReduce是一个广泛采用的编程模型,它简化了并行处理大规模数据的过程。 2. 设计满足市场需求的前台模块。这需要以用户需求分析为基础,确保开发的数据挖掘产品能够解决实际问题,满足业务需求。 ...

    基于Kubernetes平台部署Hadoop实践.docx

    第三,Hadoop与Kubernetes分别属于两个不同的领域,一个是传统的大数据领域,一个是新兴的容器与微服务架构领域,这两个领域之间交集本来很小,加之Hadoop最近几年已经失去焦点,所以,没有多少人关注和研究Hadoop在...

    hadoop高级应用一

    在IT领域,Hadoop是一个至关重要的技术,尤其在大数据处理和分析方面发挥着核心作用。本教程“Hadoop高级应用一”将深入探讨这个强大的分布式系统基础架构,旨在帮助用户进一步提升在Hadoop生态系统中的技能。 ...

    Hadoop网站KPI使用数据

    标题中的“Hadoop网站KPI使用数据”表明这是一个与Hadoop相关的项目,主要涉及的是对网站性能关键指标(KPIs)的监控和分析。在大数据处理领域,Hadoop是一个开源框架,它允许分布式存储和处理大规模数据集。在这个...

    使用docker部署hadoop集群的详细教程

    目标:使用docker搭建一个一主两从三台机器的hadoop2.7.7版本的集群 准备: 首先要有一台内存8G以上的centos7机器,我用的是阿里云主机。 其次将jdk和hadoop包上传到服务器中。 我安装的是hadoop2.7.7。包给大家准备...

    Hadoop数据迁移--从Oracle向Hadoop

    Hadoop数据迁移是指将存储在传统数据库系统(如Oracle)中的数据转移到Hadoop文件系统(HDFS)的过程。在这个过程中,MapReduce作为一种编程模型,用于处理和生成大数据集,被用来连接Hadoop与Oracle数据库,使得...

Global site tag (gtag.js) - Google Analytics