Blog

sub:函数(Bash)

Content #

在bash shell脚本中创建函数的语法有两种。第一种语法是使用关键字function,随后跟上分配给该代码块的函数名: function name { commands } name定义了该函数的唯一名称。脚本中的函数名不能重复。第二种在bash shell脚本中创建函数的语法更接近其他编程语言中定义函数的方式: name() { commands } 函数名后的空括号表明正在定义的是一个函数。这种语法的命名规则和第一种语法一样。

使用return命令 使用函数输出 local关键字(Bash) 向函数传递数组 从函数返回数组 函数递归计算阶乘(Bash) 使用shtool函数

From #

存储级别(Storage Level)RDD

Content #

存储级别(Storage Level)是一个枚举类型,用来记录 RDD 持久化时的存储级别,常用的有以下几个:

  1. MEMORY_ONLY 只缓存在内存中,如果内存空间不够则不缓存多出来的部分。这是 RDD 存储级别的默认值。
  2. MEMORY_AND_DISK 缓存在内存中,如果空间不够则缓存在硬盘中。
  3. DISK_ONLY 只缓存在硬盘中。
  4. MEMORY_ONLY_2 和 MEMORY_AND_DISK_2 等与上面的级别功能相同,只不过每个分区在集群中两个节点上建立副本。

我们可以随时把计算好的 RDD 缓存在内存中,以便下次计算时使用,这大幅度减小了硬盘读写的开销。

From #

14 | 弹性分布式数据集:Spark大厦的地基(下)

Checkpoint(RDD)

Content #

基于 RDD 的依赖关系,如果任意一个 RDD 在相应的节点丢失,你只需要从上一步的 RDD 出发再次计算,便可恢复该 RDD。

但是,如果一个 RDD 的依赖链比较长,而且中间又有多个 RDD 出现故障的话,进行恢复可能会非常耗费时间和计算资源。

而检查点(Checkpoint)的引入,就是为了优化这些情况下的数据恢复。

很多数据库系统都有检查点机制,在连续的 transaction 列表中记录某几个 transaction 后数据的内容,从而加快错误恢复。

RDD 中的检查点的思想与之类似。

在计算过程中,对于一些计算过程比较耗时的 RDD,我们可以将它缓存至硬盘或 HDFS 中,标记这个 RDD 有被检查点处理过,并且清空它的所有依赖关系。同时,给它新建一个依赖于 CheckpointRDD 的依赖关系,CheckpointRDD 可以用来从硬盘中读取 RDD 和生成新的分区信息。

这样,当某个子 RDD 需要错误恢复时,回溯至该 RDD,发现它被检查点记录过,就可以直接去硬盘中读取这个 RDD,而无需再向前回溯计算。

From #

14 | 弹性分布式数据集:Spark大厦的地基(下)

RDD的结构

Content #

  • SparkContext 所有 Spark 功能的入口,它代表了与 Spark 节点的连接,可以用来创建 RDD 对象以及在节点中的广播变量等。一个线程只有一个 SparkContext。
  • SparkConf 一些参数配置信息。
  • Partitioner 决定了 RDD 的分区方式,目前有两种主流的分区方式:Hash partitioner 和 Range partitioner。
  • Dependencies
  • Checkpoint(RDD)
  • 存储级别(Storage Level)RDD

迭代函数(Iterator)和计算函数(Compute)是用来表示 RDD 怎样通过父 RDD 计算得到的。

迭代函数会首先判断缓存中是否有想要计算的 RDD,如果有就直接读取,如果没有,就查找想要计算的 RDD 是否被检查点处理过。如果有,就直接读取,如果没有,就调用计算函数向上递归,查找父 RDD 进行计算。

Viewpoints #

From #

14 | 弹性分布式数据集:Spark大厦的地基(下)

湘军用人

Content #

湘军选拔将领的标准带有儒家化育人才的大气,选兵的标准却有申韩法家的功利,甚至带有几分恶毒。简言之,湘军用人,士兵要傻,甘心当炮灰,全是愚昧少心窍之人,才便于控制;将领要有文化能务实,但又要有一点呆气。

From #

战安庆

生成SIGINT信号

Content #

Ctrl+C组合键会生成SIGINT信号,并将其发送给当前在shell中运行的所有进程。通过执行一条需要很长时间才能完成的命令,然后按下Ctrl+C组合键,可以对此进行测试:

$ sleep 60 ^C $

sleep命令会按照指定的秒数暂停shell操作一段时间,然后返回shell提示符。 Ctrl+C组合键会发送SIGINT信号,停止shell中当前运行的进程。在超时前(60 秒)按下Ctrl+C组合键,就可以提前终止sleep命令。

From #

Linux命令行与shell脚本编程大全

生成SIGTSTP信号

Content #

你可以暂停进程,而不是将其终止。尽管有时这可能比较危险(比如,脚本打开了一个关键的系统文件的文件锁),但它往往可以在不终止进程的情况下,使你能够深入脚本内部一窥究竟。

Ctrl+Z组合键会生成SIGTSTP信号,停止shell中运行的任何进程。停止(stopping)进程跟终止(terminating)进程不同,前者让程序继续驻留在内存中,还能从上次停止的位置继续运行。

当使用Ctrl+Z组合键时,shell会通知你进程已经被停止了: $ sleep 60 ^Z [2]+ Stopped sleep 60 $ 方括号中的数字是shell分配的作业号。shell将运行的各个进程称为作业,并为作业在当前shell内分配了唯一的作业号。作业号从1开始,然后是2,依次递增。

From #

Linux命令行与shell脚本编程大全

Bash的信号处理

Content #

在默认情况下,bash shell会忽略收到的任何SIGQUIT(3)信号和SIGTERM(15)信号(因此交互式shell才不会被意外终止)。但是,bash shell会处理收到的所有SIGHUP(1)信号和SIGINT(2)信号。

如果收到了SIGHUP信号(比如在离开交互式shell时),bash shell就会退出。但在退出之前,它会将SIGHUP信号传给所有由该shell启动的进程,包括正在运行的shell脚本。

如果收到SIGINT信号,shell会被中断。Linux内核将不再为shell分配CPU处理时间。当出现这种情况时,shell会将SIGINT信号传给由其启动的所有进程,以此告知出现的状况。

shell会将这些信号传给shell脚本来处理。而shell脚本的默认行为是忽略这些信号,因为可能不利于脚本运行。要避免这种情况,可以在脚本中加入识别信号的代码,并做相应的处理。

From #

Linux命令行与shell脚本编程大全

sub:信号(Signal)

Content #

1 SIGHUP hang up 挂起进程
2 SIGINT interrupt 中断进程
3 SIGQUIT stop 停止进程
9 SIGKILL terminate 无条件终止进程
15 SIGTERM 尽可能终止进程
18 SIGCONT 继续运行停止的进程
19 SIGSTOP 无条件停止,但不终止
20 SIGTSTP pause 停止或暂停,但不终止进程

kill命令默认情况下发送的信号是15(SIGTERM)。 Bash的信号处理 生成SIGINT信号 生成SIGTSTP信号 捕获信号(Bash) 脚本退出时捕获EXIT信号 修改或移除信号捕获 nohup命令