做中学, 学中做

2017-12-03
tasksetmanager

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Schedules the tasks within a single TaskSet in the TaskSchedulerImpl. This class keeps track of
* each task, retries tasks if they fail (up to a limited number of times), and
* handles locality-aware scheduling for this TaskSet via delay scheduling. The main interfaces
* to it are resourceOffer, which asks the TaskSet whether it wants to run a task on one node,
* and statusUpdate, which tells it that one of its tasks changed state (e.g. finished).
*
* THREADING: This class is designed to only be called from code with a lock on the
* TaskScheduler (e.g. its event handlers). It should not be called from other threads.
*
* @param sched the TaskSchedulerImpl associated with the TaskSetManager
* @param taskSet the TaskSet to manage scheduling for
* @param maxTaskFailures if any particular task fails this number of times, the entire
* task set will be aborted
*/

TaskSetManager 负责某个 TaskSet 的调度,对该 TaskSet 的所有 task 进行跟踪,如果有失败的 task,会负责重试(重试有上限),并且通过 delay scheduling(可以想想这个怎么实现的?) 实现 locality locality-aware scheduling. 主要的接口有 resourceOffer – 用于判断一个 TaskSet 中的 task 是否需要运行到某个 node 上,statusUpdate – 用于跟踪 task 的状态变化。不是线程安全的。

Leia Mais

2017-11-27
TaskScheduler

本文属于自己看源码后的记录

与不同的后端调度器一起,进行 task 的调度(task 是 DAGScheduler 中划分的 Stage 中的具体任务),后端调度器包括 LocalBackendSparkDeploySchedulerBackendMesosSchedulerBackendYarnClientSchedulerBackendYarnClusterSchedulerBackendSimrSchedulerBackend

整个 TaskSchedulerImpl 比较简单,复杂的地方在于和各种 后端调度器联合,以及具体 TasksetManager 进行联合

Leia Mais

2017-11-20
git inside

Git是一个分布式的版本控制系统,能够完成你能想到的关于版本相关的所有事情,但是 Git 却不是那么好上手,也就是所谓的入门门槛有点高。

本文会讲什么

本文会换一个角度讲述 Git 怎么做的,给大家提供一个另外的视角,这个视角主要设计 Git 的存储,这样给大家一个更深的认识,在平时想了解的时候,也能有合适的渠道进行。

Leia Mais

2017-11-09
django-configuration in action

Django 中统一配置的做法

本文主要描述如何在 django 中统一 settings 文件

背景

django 服务会有多个环境,比如 开发环境、测试环境以及线上环境等。现在大部分使用的方案是针对每一种环境使用一个 settings 文件,然后在不同的环境中使用不同的 settings 文件。这样的设计我认为有至少两个问题:

  1. 很多公用的配置不太好公用
  2. 文件数会很多,项目中管理会比较麻烦
Leia Mais

2017-10-16
spark_dagscheduler

基于 spark 1.6

面向 Stage 的调度器,负责计算每个 job 的 DAG,并将 DAG 图划分为不同的 stage,对哪些 RDD 以及相应输出进行记录,寻找一个运行相应 job 所需要的最小 stage。然后将 stageTaskSet 的形式提交到下层的 TaskScheduler 进行具体的 task 调度。每个 TaskSet 包含整个可以独立运行的 task,这些 task 能够利用集群上已有的数据立即运行起来,如果集群上已有的数据已经不存在了,那么当前 task 就会失败。

Spark 的 stage 以 RDD 的 shuffle 为界进行划分。窄依赖的 RDD 操作会被穿起来放到一个 task 中,比如 map(), filter() 这样的操作。但是需要使用到 shuffle 依赖的操作,需要多个 stage(至少一个将中间文件写到特定的地方,另外一个从特定的地方进行读取)。每个 Stage,只会对其他 Stage 有 shuffle 依赖,在同一个 stage 中会进行很多计算。实际的将计算串起来的操作在 RDD.compute 中完成。

DAGScheduler 同样会基于缓存状态决定 task 希望运行在那(preferred location),如果 shuffle 输出文件丢失造成的 Stage 失败,会重新被提交。在 Stage 内部 的不是由 shuffle 文件丢失造成的失败,由 TaskScheduler 来完成,TaskScheduler 会在取消整个 stage 前进行小部分重试。
Leia Mais

2017-09-17
GC 标记-清除算法

GC 的世界中有三种基本的算法,分别是:

  • 标记清除
  • 引用计数
  • GC 复制

其他的 GC 算法都是在这三种算法上进行修改,优化得来。本文将要介绍的是 标记-清除 算法。

Leia Mais

2017-07-14
tmux 简单使用指南

Tmux 的简单使用说明

工欲善其事,必先利其器

Tmux 是一个多窗口管理程序。可以让用户在一个地方管理多个终端。而不需要在不同的终端间来回切换。

在 Mac 下如何安装

直接使用 brew install tmux 就可以了,如果没有 brew,则需要先安装 brew,然后再执行上述命令。

简单使用流程

首先,需要了解 tmux 中的几个概念。session,window 以及 pane。这几者的关系如下,tmux 中可以起多个 session,每个 session 可以启动多个 window,然后每个 window 可以启动多个 pane。

这里给一个基本的流程

  1. 启动 tmux(默认会启动一个 session)
    使用 tmux 启动 tmux,使用 exit 退出 tmux,session 的命名默认是从 0 开始,一直往上加

  2. 在 session 中启动一个 window
    PREFIX c 会在当前 session 中创建一个 window, 其中 PREFIX 表示 tmux 中的命令前缀符(该条命令表示,先按下 PREFIX,然后按下 c),

  3. 在启动的 window 中创建一个 pane
    PREFIX % 竖直方向切分一个 window,PREFIX " 横向切分一个 window。这样就能够在 window 中创建 pane 了。基本的这些就够了。

  4. 如何在 session,window,pane 中进行移动
    能够创建 session,window,pane 了,接下来就是如何在 session,window,pane 间进行移动了。
    PREFIX s 会列出所有 session,然后进行具体的选择(可以上下移动光标,然后按 ENTRER 确定)
    PREFIX w 可以列出所有的 window,然后进行具体的筛选
    PREFIX n 可以切换到下一个 window
    PREFIX p 可以切换到上一个 window
    PREFIX & 可以关闭当前 window
    PREFIX o 可以在 pane 之间进行跳转
    tmux ls 会列出当前所有的 session(在非 tmux 环境下)

自定义 tmux

tmux 的配置文件可以保存在两个地方

  1. /etc/tmux.conf
  2. ~/.tmux.conf

其中 2 的优先级会更高,1 的影响面更广

接下来做什么

上面的仅仅是一个入门文档,也就是最少基本知识,接下来就是多实践。推荐一本小书《tmux productive mouse-free development》

tmux_pic.png

2017-06-20
风险不仅仅是事件发生的概率

风险不仅仅是事件发生的概率

风险可以定义为 = 事件结果对你的影响 * 事件发生的概率

风险在生活中处处存在,可能我们会想冒个险没啥关系,反正发生的概率小,而且在某些时候会有高收益/回报伴随这风险,这个时候就更有诱惑力了,总有人希望通过冒险得到高回报,但这恰恰是不可取的,是非常危险的。

Leia Mais

2017-06-03
Streaming 程序调用 Producer.close hang 住问题追查复盘

本文作为一个问题追查过程的复盘记录,主要希望找出自己在解决问题中可以优化改进的地方。以后遇到问题,能够快速的进行定位,解决。

Leia Mais

2017-06-01
如何在不重启 Spark Streaming 作业的情况下,增加消费的 topic

本文所有和 kafka 相关操作都基于 Direct 消费模式

在 Spark Streaming 作业中,每个作业会消费一个或多个 topic,但是这些 topic 需要在作业启动之前确定好,在作业运行中不能进行调整,之前修改了源码做到了自适应 topic partition 扩容的情况,但是无法动态调整消费的 topic。现在需要在不重启作业的情况下,动态调整消费的 topic。

Leia Mais