0%

二级索引是从主访问路径访问数据的正交方式。在 HBase 中,您有一个索引按字典顺序排序在主键行上。以不同于主要行的方式访问记录需要扫描表中的所有行,以针对您的过滤器对其进行测试。通过二级索引,您索引的列或表达式形成一个备用行键,以允许沿着这个新轴进行点查找和范围扫描。

Covered Indexes 覆盖索引

Phoenix 是特别强大的,因为我们提供覆盖索引 - 一旦找到索引条目,我们不需要返回主表。相反,我们将我们关心的数据绑定到索引行,节省了读取时间的开销。

例如,以下内容将在v1和v2列上创建索引,并在索引中包含v3列以防止从数据表中获取该列:

1
CREATE INDEX my_index ON my_table (v1,v2) INCLUDE(v3)
Read more »

摘要

Bigtable 是一个分布式的结构化数据存储系统,它被设计用来处理海量数据:通常是分布在数千台普通服务器上的 PB 级的数据。

Google 的很多项目使用 Bigtable 存储数据,包括 Web 索引、Google Earth、Google Finance。这些应用对 Bigtable 提出的要求差异非常大,无论是在数据量上(从 URL 到网页到卫星图像)还是在响应速度上(从后端的批量处理到实时数据服务)。尽管应用需求差异很大,但是,针对 Google 的这些产品,Bigtable 还是成功的提供了一个灵活的、高性能的解决方案。

本论文描述了 Bigtable 提供的简单的数据模型。利用这个模型,用户可以动态的控制数据的分布和格式。 我们还将描述 Bigtable 的设计和实现。

Read more »

摘要

MapReduce 是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。用户首先创建一 个 Map 函数处理一个基于 key/value pair 的数据集合,输出中间的基于 key/value pair 的数据集合;然后再创建 一个 Reduce 函数用来合并所有的具有相同中间 key 值的中间 value 值。现实世界中有很多满足上述处理模型 的例子,本论文将详细描述这个模型。

MapReduce 架构的程序能够在大量的普通配置的计算机上实现并行化处理。这个系统在运行时只关心: 如何分割输入数据,在大量计算机组成的集群上的调度,集群中计算机的错误处理,管理集群中计算机之间 必要的通信。采用 MapReduce 架构可以使那些没有并行计算和分布式处理系统开发经验的程序员有效利用分 布式系统的丰富资源。

我们的 MapReduce 实现运行在规模可以灵活调整的由普通机器组成的集群上:一个典型的 MapReduce 计算往往由几千台机器组成、处理以 TB 计算的数据。程序员发现这个系统非常好用:已经实现了数以百计 的 MapReduce 程序,在 Google 的集群上,每天都有 1000 多个 MapReduce 程序在执行。

Read more »

摘要

我们设计并实现了 Google GFS 文件系统,一个面向大规模数据密集型应用的、可伸缩的分布式文件系统。GFS 虽然运行在廉价的普遍硬件设备上,但是它依然了提供灾难冗余的能力,为大量客户机提供了高性能的
服务。

虽然 GFS 的设计目标与许多传统的分布式文件系统有很多相同之处,但是,我们的设计还是以我们对
自己的应用的负载情况和技术环境的分析为基础的,不管现在还是将来,GFS 和早期的分布式文件系统的设想都有明显的不同。所以我们重新审视了传统文件系统在设计上的折衷选择,衍生出了完全不同的设计思路。

GFS 完全满足了我们对存储的需求。GFS 作为存储平台已经被广泛的部署在 Google 内部,存储我们的服务产生和处理的数据,同时还用于那些需要大规模数据集的研究和开发工作。目前为止,最大的一个集群利用数千台机器的数千个硬盘,提供了数百 TB 的存储空间,同时为数百个客户机服务。
在本论文中,我们展示了能够支持分布式应用的文件系统接口的扩展,讨论我们设计的许多方面,最后
列出了小规模性能测试以及真实生产系统中性能相关数据。

Read more »

ACID简介

ACID代表数据库事务的四个特性:

  • 原子性(Atomicity):一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
  • 一致性(Consistency):事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务并发访问,事务之间是隔离的,一个事务不影响其它事务运行效果。这指的是在并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自完整的数据空间。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改后的状态,事务不会查看到中间状态的数据。事务之间的相应影响,分别为:脏读、不可重复读、幻读、丢失更新。
  • 持久性(Durability):意味着在事务完成以后,该事务锁对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

在Hive0.13中添加事务之后,在分区级别上提供了原子性、一致性和持久性。可以通过打开可用的锁定机制(ZooKeeper或内存)来提供隔离。现在可以在行级别上提供完整的ACID语义,这样一个应用程序可以添加行,而另一个应用程序可以在相同的分区上读取,而不会相互干扰。

Read more »

前言

学习 GitHub 的使用规则,记录遇到的问题。

watch , star , fork 的含义


刚使用 GitHub 的时候,看到每一个项目页面右上角都有如下图所示的字样:

Read more »

背景

Spark取样操作,无法获取随机样本的解决方案。Dataset中sample函数源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* Returns a new [[Dataset]] by sampling a fraction of rows, using a user-supplied seed.
*
* 通过使用用户提供的种子,通过抽样的方式返回一个新的[[Dataset]]。
*
* @param withReplacement Sample with replacement or not.
* 如果withReplacement=true的话表示有放回的抽样,采用泊松抽样算法实现.
* 如果withReplacement=false的话表示无放回的抽样,采用伯努利抽样算法实现.
* @param fraction Fraction of rows to generate.
* 每一行数据被取样的概率.服从二项分布.当withReplacement=true的时候fraction>=0,当withReplacement=false的时候 0 < fraction < 1.
* @param seed Seed for sampling.
* 取样种子(与随机数生成有关)
* @note This is NOT guaranteed to provide exactly the fraction of the count
* of the given [[Dataset]].
* 不能保证准确的按照给定的分数取样。(一般结果会在概率值*总数左右)
* @group typedrel
* @since 1.6.0
*/
def sample(withReplacement: Boolean, fraction: Double, seed: Long): Dataset[T] = {
require(fraction >= 0,
s"Fraction must be nonnegative, but got ${fraction}")

withTypedPlan {
Sample(0.0, fraction, withReplacement, seed, logicalPlan)()
}
}

/**
* Returns a new [[Dataset]] by sampling a fraction of rows, using a random seed.
*
* 通过程序随机的种子,抽样返回新的DataSet
*
* @param withReplacement Sample with replacement or not.
* 取样结果是否放回
* @param fraction Fraction of rows to generate.
* 每行数据被取样的概率
* @note This is NOT guaranteed to provide exactly the fraction of the total count
* of the given [[Dataset]].
* 不能保证准确的按照给定的分数取样。(一般结果会在概率值*总数左右)
* @group typedrel
* @since 1.6.0
*/
def sample(withReplacement: Boolean, fraction: Double): Dataset[T] = {
sample(withReplacement, fraction, Utils.random.nextLong)
}
Read more »

前言

针对一个老毛病:有些错误屡犯屡改,屡改屡犯,没有引起根本上的注意,或者没有从源头理解错误发生的底层原理,导致做很多无用功。

总结历史,并从中吸取教训,减少无用功造成的时间浪费。特此将从目前遇到的 hive 问题全部记录在这里,搞清楚问题,自信向前。

Read more »

在数据库中,并发性支持是必须的,而且它们的用例也很容易理解。至少,我们希望尽可能支持并发的读和写。添加一个机制来发现已获得的当前锁是很有用的。没有立即添加API来显式获取任何锁的需求,因此所有锁都是隐式获得的。以下锁定模式将在hive中定义(注意,不需要意图锁)。

1
2
共享(S)
独占(X)

顾名思义,可以同时获得多个共享锁,而X锁可以阻止所有其他锁。
兼容性矩阵如下:

对于某些操作,锁在本质上是分层的——例如,对于某些分区操作,表也被锁定(以确保在创建新分区时不能删除表)。

Read more »

前言

今天查看 Spark 源码的时候,无意发现了 AppVeyor ,才知道 持续集成(Continuous Integration,简称CI),简单理解为可以自动化构建项目的工具。在 Spark 中,SparkR 的项目使用了 AppVeyor 持续集成工具。

看到网络上一些大佬用 AppVeyor 联合 Hexo,作为博客代码的部署工具,一方面可以使部署代码更加简单(全自动化,虽然之前也只有 hexo -clean ,hexo -g ,hexo -d 三步,但现在完全在后台自动部署),另一方面也可以解决博客源码多电脑书写的局限性(之前只能在一台电脑上进行博客的创作,面临着项目备份的问题),现在将项目完全托管在 GitHub上,无需担心电脑换了,或是磁盘损坏造成的数据丢失,也无需使用云备份工具费时费力的维护项目。

核心步骤

新建代码仓库

首先我们先确定,将项目托管在 GitHub 上,这里有两种方案,一种是在存放博客静态代码的仓库(如:xxx.github.io)中新添加分支;另一种则是新建一个仓库用于存放项目。我这里使用的第二种方式,新建了一个仓库:hexo-github-source 。

Read more »