SQL on Hadoop 的真相(1)
转自:http://blog.jobbole.com/86710/
这是一组系列博文,目的是详尽介绍 SQL-on-Hadoop 。本系列的第一篇会介绍 Hadoop 系统的存储引擎和在线事务处理(简称 OLTP );第二篇将介绍在线分析处理(简称 OLAP );第三篇将介绍对 Hadoop 引擎的改进以及在相关替代产品中如何选型等话题。
SQL on Hadoop 是一个既令人兴奋又令人困扰的话题;
几乎每周都有一个新的 SQL on Hadoop 支持项目似乎抓住过社区注意力,哪怕只是一个短暂的瞬间;
在这个系列中,我们会讨论 Hadoop 系统上支持的每一类 SQL 解决方案,并对它们的架构,用例以及其他做出诚实的讨论。
Hadoop 引擎上的 SQL 有许多广泛的应用领域:
- 数据处理与在线分析处理(OLAP)
- 改进优化
- 在线事务处理(OLTP)
存储引擎:
今天 Hadoop 主要有三个存储引擎:分别是 Apache HBase、Apache Hadoop HDFS 和 Hadoop Accumulo。Apache Accumlo与 Hbase 非常相似,但它本是由 NSA 组织创建的项目,历史上特别看重系统的安全性,尤其在授权认证方面;在我们看来,HBase 现在已经将安全特性方面的工作加入到项目中了,这样的话后面就不再进一步讨论 Accumulo 了。
HBase 是一个分布式键值存储系统,数据是通过排好序的 map 形式存储,也就是说数据都是经过对 key 列排序的,就像我们下面要描述的那样,HBase 典型的用例是 OLTP 应用,HDFS 是一个文件系统并能够以分布式的方式存储极大容量的数据集合;
HBase 在 HDFS 里存储的数据是以 HFile 格式存入的,这种格式不可配置。当不使用 HBase 而直接使用 HDFS 时,用户是必须要选择一种文件格式;
当进行文件格式选择时是有许多要点需要考虑的,比如,
- 主要的读取模式是怎样的?是读取所有行呢,还是只读取所有行数据的一个子集;
- 数据是不是还可能含有非 ASCII 码的文本内容?
- 哪些工具会读写这些数据呢(Apache Hive, Spark ?);
广义上说有两种文件格式与 HDFS 一起使用,它们是 Columnar 和 row-wise。Columnar 格式例如 RCFILE、ORC 和 Apache Parquet等,这些类型能提供极致的压缩性能(通过类似行程编码的多种编码方式进行压缩),同时在只读取行内少量列的场景下,也能提供较高的读性能;比如你一行数据有五十到一百个列却只需读取七八个列的场合;
row-wise 格式,比如有受限定的文本格式、Sequence 文件格式以及 Apache Avro 格式,这些格式虽不提供有效的压缩特性,但比较适合那些需要读取表中大多数列的业务场景,也适合那种数据是以流的方式,每次小批量地导进表中的业务场景;
我们建议排除文本格式,RCfile 和 Sequence 文件这几种格式,因为他们都是历史遗留的文件格式,另外不推荐也是因为集成历史系统数据时它们有潜在的异常问题。我们不建议使用这些格式是因为他们容易发生文本冲突(如非 ASCII 码文本),性能差,还有除了文本方式之外很少有工具可以读取它们;
一旦我们回答了选 columnar 还是 row-wise 的问题,并排除了历史遗留的那些文件格式,最重要的问题就变成了哪一个工具和引擎能够读取和写入这些数据,大量的 Hadoop 生态链工具和引擎已经集成了 Avro 和 Parquet 项目,其中 ORC 是性能最好的 Apache Hive 文件格式。
在线事务处理
Apache HBase 项目提供 OLTP 类型的操作并极具扩展性,HBase 是唯一一个通常用于在线用户数据存储的Hadoop子模块,但是 HBase 项目的目标并不是做一个关系型数据库管理系统,而且它也不是为了替换 MySQL、Oracle 或者 DB2 这类关系型数据库的,实际上 HBase 自己并不提供任何 SQL 接口,而且用户还必须用 Java, Python, 或者 Ruby 编程来存储和检索数据;
Apache Phoenix 项目目标是基于 Apache HBase 提供 OLTP 类型的 SQL,Phoenix 允许用户基于 HBase 数据模型执行插入更新和删除操作,但是就像前面提到的一样,HBase 数据模型从根本上就不同于传统关系型数据库,这样的话 HBase 加 Phoenix 也仍然不是关系型数据库的替代者;
HBase (以及Phoenix) 项目对于那些基于 RDBMS 之上,在应用扩展过程中遇到麻烦的业务场景非常有用;传统关系型数据库领域里的一个传统解决方案是进行水平分区,但这种解决方案跑起来却常遭受以下缺陷的困扰:
- 跨分片事务没有得到支持
- 增加机器进行水平扩容时需要复杂且昂贵的再分片过程,
就像经过分片的数据库一样,HBase 并不支持事务,但增加机器进行水平扩展和在HBase内部做负载再均衡,HBase 系统就要容易得多;
新的节点可以被加入到 HBase 集群中,HBase 能够自动分配数据分片到不同节点,如果假定分片数据库和 HBase 都缺少事务支持的话,HBase 就会因提供易于增加机器水平扩展的能力而胜出,有一些公司已经在做底层使用 HBase 架构基础而上层增加事务 SQL 支持的产品,比如 Splice Machine公司等。
SQL on Hadoop 的真相(1)的更多相关文章
- SQL on Hadoop 的真相(2)
转自:http://blog.jobbole.com/87159/ 这是一组系列博客,目的是详尽介绍 SQL-on-Hadoop .该系列的第一篇会介绍一些存储引擎和在线事务处理(简称 OLTP )相 ...
- SQL on Hadoop中用到的主要技术——MPP vs Runtime Framework
转载声明 本文转载自盘点SQL on Hadoop中用到的主要技术,个人觉得该文章对于诸如Impala这样的MPP架构的SQL引擎和Runtime Framework架构的Hive/Spark SQL ...
- SQL on Hadoop系统的最新进展(1)
转自:http://blog.jobbole.com/47892/ 为什么非要把SQL放到Hadoop上? SQL易于使用.那为什么非得基于Hadoop呢?the robust and scalabl ...
- 盘点SQL on Hadoop中用到的主要技术
转载自:http://sunyi514.github.io/2014/11/15/%E7%9B%98%E7%82%B9sql-on-hadoop%E4%B8%AD%E7%94%A8%E5%88%B0% ...
- SQL on Hadoop技术综述
一.系统架构 runtime framework v.s. mpp 在SQL on Hadoop系统中,有两种架构: 1.一种是基于某个运行时框架来构建查询引擎,典型案例是Hive: 2.另一种是仿照 ...
- Hive--可执行SQL的Hadoop数据仓库管理工具
Hive是一个基于HDFS的数据仓库软件,可理解为数据库管理工具:Hive的功能主要有: 1. 支持使用SQL对分布式存储的大型数据集进行读.写.管理,将SQL转化成MapReduce任务执行: 2. ...
- 一张图告诉你是须要 SQL 还是 Hadoop
译序 非常多朋友问时下如火如荼的 Hadoop 是否适合引进我们自己的项目,什么时候用 SQL.什么时候用 Hadoop,它们之间怎样取舍?Aaron Cordova 用一张图来回答你这个问题,对于不 ...
- Hadoop 和 HDInsight:Windows Azure 中的大数据
世界的大数据包含一个庞大而充满活力的生态系统,但一个开放源码项目上面有这一切,那就是 Hadoop 的王朝. Hadoop 是事实上的标准的分布式的数据运算.Hadoop 提供了一个 MapReduc ...
- 一篇文看懂Hadoop:风雨十年,未来何去何从
本文分为技术篇.产业篇.应用篇.展望篇四部分 技术篇 2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce.到现在的10个年头,这个单词代表的是“核心” ...
随机推荐
- Scheme 4 Javaer-3.高阶函数
1.3 Formulating Abstractions with Higher-Order Procedures 教材有时候依照学生的基础.从0讲起:有时候给出一个大图,然后具体地逐一介绍. 本文 ...
- 用php编写我的第一段代码:hello world
一.php环境的搭建 在编写php前,先搭建php环境,我选择了一站式安装软件WampServer,WampServer的下载地址:http://www.wampserver.com/ WampSer ...
- Python网络爬虫 - 3. 异常处理
handle_excpetion.py from urllib.request import urlopen from urllib.error import HTTPError from bs4 i ...
- Cocos2d-x 处理双击事件的两种方法
在cocos2d-x的开发过程中有些时候也是需要用到双击的事件处理,那么由于在cocos2d-x中没有实现对双击的事件的处理,那么我们就需要自己用代码实现. 下面介绍两种方式实现双击事件的处理. (一 ...
- 【转】TCP(协议号6)的方方面面
转:http://blog.sina.com.cn/s/blog_6002b97001018fxh.html 第一:TCP连接的建立(也就是所谓的三次握手)过程. 第一次握手:建立连接时,客户端发送s ...
- 算法笔记_150:图论之双连通及桥的应用(Java)
目录 1 问题描述 2 解决方案 1 问题描述 Description In order to get from one of the F (1 <= F <= 5,000) graz ...
- js Object.is 相等判断
Object.is使用“Same-value equality”(同值相等)算法进行相等判断.它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致. Object.is('foo', ...
- C#指南,重温基础,展望远方!(8)C#数组
数组是一种数据结构,其中包含许多通过计算索引访问的变量. 数组中的变量(亦称为数组的元素)均为同一种类型,我们将这种类型称为数组的元素类型. 数组类型是引用类型,声明数组变量只是为引用数组实例预留空间 ...
- C#:将空间数据加载到树视图控件
自己 整理了 下 代码 测试了下 还行... #region 操作树视图控件 /// <summary> /// 自定义需要的类型 /// </summary> enum Da ...
- C++二维数组讲解、二维数组的声明和初始化
我们知道,一维空间是一条线,数学中用一条数轴来表达:二维空间是一个平面,数学中用平面坐标系来表达.那么二维数组又是什么样的呢? 线与面 我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线 ...