东篱下

闲庭舞键

  • PAPER
  • ECONOMIST
  • OFFER
  • SPARK
  • HIVE
  • FLINK
  • ALGO
  • GEM
  • 归档
  • 标签
  • 搜索

Hive事务-翻译自官方文档

发表于 2017-12-13 | 分类于 hive

ACID简介

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

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

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

阅读全文 »

GitHub使用指南

发表于 2017-12-13 | 分类于 GitHub

前言

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

watch , star , fork 的含义


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

阅读全文 »

spark取样函数分析

发表于 2017-12-12 | 分类于 spark

背景

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)
}
阅读全文 »

Hive报错集

发表于 2017-12-11 | 分类于 hive

前言

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

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

阅读全文 »

Hive锁介绍-翻译自官方文档

发表于 2017-12-11 | 分类于 hive

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

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

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

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

阅读全文 »

Hexo + AppVeyor 持续集成

发表于 2017-12-07 | 分类于 hexo

前言

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

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

核心步骤

新建代码仓库

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

阅读全文 »

Hive事务管理

发表于 2017-12-01 | 分类于 hive

简介

Hive作为Hadoop家族历史最悠久的组件之一,一直以其优秀的兼容性支持和稳定性而著称,越来越多的企业将业务数据从传统数据库迁移至Hadoop平台,并通过Hive来进行数据分析。但是我们在迁移的过程中难免会碰到如何将传统数据库的功能也迁移到Hadoop的问题,比如说事务。事务作为传统数据库很重要的一个功能,在Hive中是如何实现的呢?Hive的实现有什么不一样的地方呢?我们将传统数据库的应用迁移到Hive如果有事务相关的场景我们该如何去转换并要注意什么问题呢?

本文会通过很多真实测试案例来比较Hive与传统数据库事务的区别,并在文末给出一些在Hive平台上使用事务相关的功能时的指导和建议。

ACID与实现原理


为了方便解释和说明后面的一些问题,这里重提传统数据库事务相关的概念,以下内容来源于网络。

阅读全文 »

SparkSQL-Catalyst优化理解

发表于 2017-11-30 | 分类于 spark

前言

本文主要介绍SparkSQL的优化器系统Catalyst,其设计思路基本都来自于传统型数据库,而且和大多数当前的大数据SQL处理引擎设计基本相同(Impala、Presto、Hive(Calcite)等)。

SQL优化器核心执行策略主要分为两个大的方向:

  1. 基于规则优化(RBO):是一种经验式、启发式地优化思路,更多地依靠前辈总结出来的优化规则,简单易行且能够覆盖到大部分优化逻辑,但是对于核心优化算子Join却显得有点力不从心。
  2. 基于代价优化 (CBO):根据代价估算确定一种代价最小的方案。

举个简单的例子,两个表执行Join到底应该使用BroadcastHashJoin还是SortMergeJoin?当前SparkSQL的方式是通过手工设定参数来确定,如果一个表的数据量小于这个值就使用BroadcastHashJoin,但是这种方案显得很不优雅,很不灵活。基于代价优化就是为了解决这类问题,它会针对每个Join评估当前两张表使用每种Join策略的代价,根据代价估算确定一种代价最小的方案。

阅读全文 »

spark容错机制

发表于 2017-11-29 | 分类于 spark

引言

一般来说,分布式数据集的容错性有两种方式: 数据检查点 和 记录数据的更新 。面向大规模数据分析,数据检查点操作成本很高,需要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往比内存带宽低得多,同时还需要消耗更多的存储资源。因此,Spark选择记录更新的方式。

但是,如果更新粒度太细太多,那么记录更新成本也不低。因此,RDD只支持粗粒度转换,即只记录单个块上执行的单个操作,然后将创建RDD的一系列变换序列(每个RDD都包含了他是如何由其他RDD变换过来的以及如何重建某一块数据的信息。因此RDD的容错机制又称“血统(Lineage)”容错)记录下来,以便恢复丢失的分区。

Lineage本质上很类似于数据库中的重做日志(Redo Log),只不过这个重做日志粒度很大,是对全局数据做同样的重做进而恢复数据。

Lineage机制

Lineage简介

相比其他系统的细颗粒度的内存数据更新级别的备份或者LOG机制,RDD的Lineage记录的是粗颗粒度的特定数据Transformation操作(如filter、map、join等)行为。当这个RDD的部分分区数据丢失时,它可以通过Lineage获取足够的信息来重新运算和恢复丢失的数据分区。因为这种粗颗粒的数据模型,限制了Spark的运用场合,所以Spark并不适用于所有高性能要求的场景,但同时相比细颗粒度的数据模型,也带来了性能的提升。

阅读全文 »

ORC与PARQUET文件类型的比较

发表于 2017-11-29 | 分类于 spark

列式存储

由于OLAP查询的特点,列式存储可以提升其查询性能,但是它是如何做到的呢?这就要从列式存储的原理说起,从图1中可以看到,相对于关系数据库中通常使用的行式存储,在使用列式存储时每一列的所有元素都是顺序存储的。由此特点可以给查询带来如下的优化:

1
2
3
查询的时候不需要扫描全部的数据,而只需要读取每次查询涉及的列,这样可以将I/O消耗降低N倍,另外可以保存每一列的统计信息(min、max、sum等),实现部分的谓词下推。
由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步减小I/O。
由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。

图1 行式存储VS列式存储
阅读全文 »
1…3456
舒服一夏

舒服一夏

技术改变世界,阅读塑造人生

53 日志
18 分类
29 标签
© 2020 舒服一夏