Spark 调优 上

本篇文章是在结合自己业务和这篇文章的基础上写的。

前言

在编写和维护一个 Spark 程序的过程中,会遇到一些相关术语:

  • transformation, action, RDD, DataSet, DataFrame

    理解这一层次的原语对于写出一个 Spark 很重要。因为一个 Spark 程序都是由这些结构和操作构成的。

  • job, stage, task

    如果想要写出一个好的 Spark 程序,理解这一层的原语就变得很重要。因为当你发现你的 Spark 程序运行得很慢或者报错了,你需要到 web UI 上查看原因,而这就是你需要理解这些术语的原因。

总之,要写出一个高效的 Spark 程序,理解其底层运行模型是至关重要的。

Scala Map vs. FlatMap

在处理 Scala 的数据结构时,mapflatMap 是经常被调用的两个集合类的方法。

map 方法经常被作用于 collections,并且是 Traversable 特质的一个成员。

关于 TraversableIterable 的区别,可以参照这个回答

map 方法基本功能为: 遍历整个集合的每个元素,将这个集合转换为一个新的集合。
flatMap 方法的功能为: 先在整个集合上调用 map 方法,然后再在结果集合上调用 flatten 方法。

本文试图从三个使用场景上分析 mapflatMap 方法的用法:

  • Collections
  • Options
  • Futures

Flink 学习笔记之四 时间和窗口

设置处理时间

在流处理系统中,时间是一个非常重要的概念。Flink 可以设置下面三种事件时间。

  • ProcessingTime
    ProcessingTime 意味着算子使用数据被处理时所在机器的系统时间
    • 优点:延时低,因为算子不用等待按顺序来的数据
    • 缺点:结果不是非确定的。因为每个窗口的数据内容取决于数据到达的速度。
  • EventTime
    EventTime 指的是算子使用数据本身包含的时间信息作为当前时间。每个数据都携带一个时间戳和水位线。当一个水位通知说在给定的时间范围内所有数据已经到达时,event-time 窗口就会触发计算。
    EventTime 窗口计算出的结果是确定的:结果和数据到达的顺序无关
  • IngestionTime
    IngestionTime 是数据进入流处理器的时间。可以将 IngestionTime 理解为 source operatorProcessingTime

Scala 函数式编程 一

本系列文章基于阅读《Scala 函数式编程》的笔记和心得。

概述

函数式编程(FP) 基于一个前提:

只用纯函数来构造程序。

换句话说,函数没有副作用副作用包括但不限于:

  • 修改一个变量
  • 直接修改数据结构
  • 设置一个对象的成员
  • 抛出一个异常或者错误
  • 打印到终端或读取用户的输入
  • 读取或写入一个文件
  • 在屏幕上绘画

函数式编程限制的是怎样写程序,而非表达什么样的程序。

HBase 架构详述

本文是在翻译自 这两篇 很棒的关于 HBase 架构简介文章的基础上写的。

HBase 是一个运行在 Hadoop 集群中的数据库。

它不是传统的关系型数据库,所以缺少 ACID 等事务相关特性,但也因此带来了比 RDBMS 更强的扩展性

同时,HBase 中保存的数据也不必像 RDBMS 一样必须满足 schema 的限制,因此很适合存储非结构化或者半结构化的数据。

Hive Buckets

为了减小一张表里的数据量,Hive 提供了 分区 的功能,基本思路就是把每个分区的数据放在 HDFS 里独立的文件夹中,这样在扫描全表的时候被扫描的数据量就变小了。常见的分区策略是按时间分区

但是在一些场景下,即使在分区后,每个分区下面数据量也很大,这时候就可以用 Hive 的 Buckets 功能了。