《Hadoop应用架构》是Orilley旗下精品系列的图书

Hadoop序列化

  • Thrift 不支持内部压缩 不能分片 缺少MapReduce的原生支持

  • Protocol Buffers

  • Avro 与语言无关 将模式存储在每个文件的头部 提供原生支持 可压缩可分片 支持模式演进(读取文件的模式不需要与写入文件的模式严格匹配) 通常以JSON格式定义(可以用Avro IDL定义) 文件头部还要同步标志 (用于隔开文件的数据块,从而使Avro文件支持分片)

列式存储的优势

  • 对于查询内容之外的列,不必执行I/O和解压操作(减少查找)

  • 适合小部分列的查询

  • 相较于多行构成的数据块,列内的信息熵更低,所以压缩高效

  • 适合对大数据集对某些指定的列的聚合操作

列式存储格式

  • RCFile 一般作为Hive存储格式 - 快速加载和查询数据 - 高效存储 - 按行分片; 分片按列存储 // 缺点:阻碍优化查询时间和压缩空间 -> ORC和Parquet

  • ORC

    • 轻量级在线压缩 支持多种优秀压缩算法

    • 仅返回查询所需要的数据

    • 支持Hive类型的模型

    • 支持分片

  • Parquet

    • 返回仅查询的字段,减少磁盘IO

    • 高效压缩(可以在每一列上指定压缩算法)

    • 支持复杂的嵌套数据结构

    • 文件尾部有完整的元数据信息存储(所以Parquet文件是字描述的)

    • 支持通过Avro和Thrift API写入和读取

    • 可扩展的编码模式(按位封装、游程编码)

  • 压缩

    • 多大多数情况下,I/O的节省大于增加的CPU负载

    • Hadoop的压缩算法

      • Snappy 平衡压缩速度和大小 不可分片(需要与容器格式联合使用SeqenceFile和Avro)

      • LZO 可分片 要求建立索引 不允许分发 需要独立安装

      • Gzip 不可分片 压缩性能最好 写入速度较慢

      • bzip2 可分片 不是理想的编解码格式

    • 压缩算法推荐

      • 一般来说,与容器文件格式(Avro、SequenceFile)一起使用时,任何压缩格式都是可以分片的

      • Hadoop中进行压缩的一些建议

        • 开启MR中间数据的输出压缩 减少读取和写入磁盘的中间数据进而提高性能

        • 注意数据的排序方式 通过把相似的数据放在一起(压缩效率高) Hadoop文件格式中的数据以块为单位压缩(块的熵决定最后的压缩)

        • 考虑使用可分片压缩算法的紧凑文件格式


HDFS模式设计

  • 创建数据库时的几点建议

    • 标准化的目录结构让团队更加轻松地使用同一个数据集共享数据

    • 支持实施访问控制和配额控制,可以防止意外删除或损坏

    • 在所有数据都准备好之前,使用者常会将数据放在一个独立的区域,存放数据的约定有助于确保部分加载数据不会被当作加载完成的数据,从而被意外处理

    • 对数据进行标准化的组织,使得某些数据处理代码可以复用

  • 设计模式时的几点建议

    • 要创建实践标准并遵守标准,特别是当多个小组共同使用数据时

    • 确保你的设计能与计划使用的工具配合使用

    • 设计模式时要记住使用模式,不同的数据处理与查询模式要配合不同的模式设计。

  • 文件在HDFS中的位置

    • 推荐的HDFS目录结构

      • /user/<username>

        只属于特定用户的数据、JAR包和配置文件。

      • /etl

        ETL工作流正在处理的、处于不同阶段的数据 /etl/<group>/<application>/<process>/{input/processing/output/bad}

      • /tmp

        工具生成或者用户共享的临时数据。该目录通常通过程序自动删除,不会存储生命周期长的数据。通常每个人都能读取或者写入该目录

      • /data

        经过处理并且在整个组织内共享的数据集。这些通常是待分析数据的重要来源,通常,用户只能读取数据,数据由自动化的 ETL 过程写入,而且要受到审计。

      • /app

        几乎囊括 Hadoop 应用运行所需要的一切,但不包括数据。

      • /metadata

        存储元数据

  • 高级HDFS模式设计

    • 分区

      • 减少处理数据的I/O HDFS不会将索引存储到数据中(全表扫描)

      • 分区目录格式样例:medication_orders/date_20191104/{order1.csv,order2.csv}

  • Hadoop常用数据来源

    • 传统数据管理系统(关系型数据库与主机)

    • 日志、及其生成的数据,以及其他类型的事件数据

    • 从现有的企业数据存储系统中输入的文件

  • 时间戳

    • 时间戳决定了在put请求修改记录时哪些记录更新

    • 时间戳决定了一条记录的多个版本在返回时的排序

    • 时间戳还用于大合并(Major Compaction)过程,决定是否移除与时间戳相比已超过存活时间的的过期记录

  • 分桶

    • 与哈希分区类似

    • 分区可能带来“小文件”问题 (会导致NameNode的过度使用)(处理的任务越多 -> 数据处理的压力变大)

    • 反向序列化

    • 用磁盘空间换取查询性能

      • 在关系型数据库中,数据通常以第三范式存储。

    • 该模式将数据分片成更小的表,每个表都含有一个特定的实体,从而将冗余减到最小并且提供数据完整性

      • 关联通常是最慢的操作,且消耗的集群资源最多

    • HDFS模式设计总结

      • 通过有选择地读写特定分区的数据,使用分区技术减少数据数据的I/O

      • 反向序列化在加快Hadoop任务处理速度方面有重要作用

    • 在Hadoop中存储大量小文件会导致NameNode内存的过量使

    • 对于经常进行关联操作的大表,最好对数据进行排序和分桶,而且按照关联字段分桶

    • 使用磁盘空间换取查询性能的两种方式

      1. 关联

      1. 数据集反向规范化(削减关联数据集的需求)

  • HBase模式设计

    • HBase是非关系型数据库

    • 把HBase当成一个巨大的哈希表,与哈希表相同之处:HBase允许用户将指定的键和特定值进行关联(这样带来的好处是基于给定的键就能快速查找到相应的值)

  • HBase行键

    • 行键是在HBase中检索记所使用的键

    • 记录含有的列在数量上没有限制,但只能有一个行键

    • HBase中所有的行键都进行了排序,经过排序的行键按照范围存储在不同的Region中。每个Region都固定在一个Region服务器(集群中的一个节点)上。

    • 行键的著名反模式设计 —> 时间戳的使用

    • 选择合适的行键能够使相关的记录落于同一个Region

    • 行键大小

      • 行键的大小决定工作负载的性能,通常来说,行键越短越好(降低存储消耗,提高读写性能)。在行键较长的时候,get和scan的性能更好。因此,在选择时,需要权衡行键的长短。

    元数据

    元数据的分类:

    • 与逻辑数据集有关的元数据

      • 数据集的位置(比如 HDFS 中的目录或者 HBase 中表的名称)、与数据集有关的模式 、数据集的分区与排序特性(如果有的话),以及适用的数据集格式(比如 CSV、TSV、SequenceFile等等)。此类元数据通常存储于独立的元数据仓库中

    • 与HDFS文件有关的元数据

      • 该类文件的权限与属主,以及数据节点上不同数据块的位置。此类信息 通常通过 Hadoop NameNode 进行存储和管理

    • 与HBase表相关的元数据

      • 表的名称、相关名称空间、相关属性(如 MAX_FILESIZE、READONLY,等 等),以及列簇的名称。此类信息由 HBase 存储和管理

    • 与数据输入和转化有关的元数据

      • 创建指定数据集的特定用户、数据集的来源、创建数据集花费的时间, 以及存在多少条记录,或者加载的数据大小是多少

    • 与数据集统计相关的元数据

      • 数据集中行的数量、每列中特定值的数量、数据分布的直方图以及最大 值和最小值。此类元数据用于不同的工具,这些工具能够利用元数据优化执行计划。它 们也能供数据分析师使用,他们可以基于元数据进行快速分析

    • 说明:Hadoop为Schema-On-Read。引入该模式不代表失去该特性,只是表明这是对数据集中数据的一种解析方式,同一份数据可以拥有多份模式

2019-07-12

There's no losing        only learning
There's no falture        only opportunities
There's no problem       only solutions

Hadoop系列读书笔记的更多相关文章

  1. think straight系列读书笔记之《暗时间》

    一周一篇读书笔记,这是第零篇,为啥从零计数,你们懂的~   大二读了<暗时间>,这本书带我进入了心理学的大门,让我开始关注思维,专注,效率,认知,记忆等东西.两年之后重读这本书,依然收获很 ...

  2. [SQL SERVER系列]读书笔记之SQL注入漏洞和SQL调优

    最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这个表达式永远返回 true, ...

  3. 《深入理解bootstrap》读书笔记:第一章 入门准备

    一.bootstrap框架简介 Bootstrap是最流行的前端开发框架. 什么是框架:开发过程的半成品. bootstrap具有以下重要特性: (1)完整的CSS样式插件 (2)丰富的预定义样式表 ...

  4. 《C++ Primer 4th》读书笔记 序

    注:本系列读书笔记是博主写作于两三年前的,所以是基于<C++ Primer>第四版的,目前该书已更新至第五版,第五版是基于C++11标准的,貌似更新挺多的.博主今年应届硕士毕业,如若过阵子 ...

  5. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  6. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  7. Hadoop读书笔记(二)HDFS的shell操作

    Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 1.shell操作 1.1全部的HDFS ...

  8. 《Programming Hive》读书笔记(一)Hadoop和hive环境搭建

    <Programming Hive>读书笔记(一)Hadoop和Hive环境搭建             先把主要的技术和工具学好,才干更高效地思考和工作.   Chapter 1.Int ...

  9. 《Mastering Opencv ...读书笔记系列》车牌识别(II)

    http://blog.csdn.net/jinshengtao/article/details/17954427   <Mastering Opencv ...读书笔记系列>车牌识别(I ...

随机推荐

  1. javascript类型判断最佳实践

    javascript有8种数据类型 值类型 Number Null Undefined String Symbol Boolean BigInt 引用类型 Object Array Function ...

  2. Python和Sublime的整合

    按照下面的方式也可以运行py代码,但是交互方式不是很好,主要简单介绍了一下Python和Sublime的整合 一  Ctrl + B 二 SublimeREPL 安装SublimeREPL 1.打开P ...

  3. 关于int main(int argc,char* argv[])详解

    平时在VS的环境下,主函数总会看到这两个参数,今天突然很想知道这两个参数的原理以及作用,因此查了下资料.真心受教了. 下面的博文是在百度空间看一位大神的,原文链接:http://hi.baidu.co ...

  4. win7安装ElasticSearch集群

    1.单节点安装请参考上篇博客 http://www.cnblogs.com/lianliang/p/7953754.html 2.集群的安装(这里模拟两个节点) 1)集群的安装,基于之前单节点的安装 ...

  5. leetcode题目19.删除链表的倒数第N个节点(中等)

    题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后 ...

  6. 【黑马JavaSE】1.2.算术\赋值\比较\逻辑\三元运算符、方法入门、JShell编译器

    文章目录 1_1_6_05_算术运算符_四则与取模运算 1_1_6_06_算术运算符_加号的多种 1_1_6_07_算术运算符_自增自减运算 1_1_6_08_赋值运算符 这里挺关键的,为什么一个by ...

  7. python中列表的简单用法

    1.定义list >>> li = ["a", "b", "mpilgrim", "z", " ...

  8. 开源运维自动化平台-opendevops

    开源运维自动化平台-opendevops 简介 官网 | Github|  在线体验 CODO是一款为用户提供企业多混合云.自动化运维.完全开源的云管理平台. CODO前端基于Vue iview开发. ...

  9. 互操作性 a C++ library which enables seamless interoperability between C++ and the Python programming language

    https://zh.wikipedia.org/wiki/互操作性 就软件而言,互操作性——这条术语用来描述的是不同的程序(programs)借助于同一套交换格式(exchange formats) ...

  10. Constructor、Method、Field 源码阅读

    AnnotatedElement /** * AnnotatedElement 接口表示目前正在此 VM 中运行的应用程序的一个已注解元素[类.方法.属性]. * 该接口允许反射性地读取注解.此接口中 ...