火花检查点“.bk”和“.crc”文件的功能是什么?

What's function of spark checkpoint ".bk" and ".crc" file?

当我们为spark streaming应用程序设置checkpoint目录时,会生成这样一个目录:

root@55330815baa7:/usr/local/spark/checkpoint# ll
total 184
drwxr-xr-x  6 root root  4096 May 25 16:35 ./
drwxr-xr-x 18  500  500  4096 May 25 16:19 ../
drwxr-xr-x  2 root root  4096 May 25 16:19 643d19eb-b24b-4664-a865-a263bdd97625/
drwxr-xr-x  2 root root  4096 May 25 16:34 71b2204c-8762-4d75-bb34-f9b1b7a9b530/
drwxr-xr-x  2 root root  4096 May 25 16:19 c946e058-220e-4ae5-8db2-393c00b845d0/
-rw-r--r--  1 root root  9658 May 25 16:35 checkpoint-1464193230000
-rw-r--r--  1 root root    84 May 25 16:35 .checkpoint-1464193230000.bk
-rw-r--r--  1 root root    84 May 25 16:35 .checkpoint-1464193230000.crc
-rw-r--r--  1 root root  9712 May 25 16:35 checkpoint-1464193236000
-rw-r--r--  1 root root    84 May 25 16:35 .checkpoint-1464193236000.bk
-rw-r--r--  1 root root    84 May 25 16:35 .checkpoint-1464193236000.crc
-rw-r--r--  1 root root  9773 May 25 16:35 checkpoint-1464193242000
-rw-r--r--  1 root root  9773 May 25 16:35 checkpoint-1464193242000.bk

-rw-r--r--  1 root root    88 May 25 16:35 .checkpoint-1464193242000.crc
-rw-r--
drwxr-xr-x  2 root root  4096 May 25 16:35 receivedBlockMetadata/

我们可以找到“.bk”文件和“.crc”文件,“.bk”文件是备份文件,但是“.crc”文件有什么作用呢?它是如何工作的?有人对此有想法吗?

CRC 代表循环冗余校验。这是一个错误检测代码,用于检测原始数据的意外更改


来自 CRC on Wikipedia 的示例:

我们想用 3 位 CRC 对 14 位消息进行编码,多项式 x^3 + x + 1

假设我们有这条消息:11010011101100(14 位)
我们使用多项式除数:1011(代表 x^3 + x + 1)

计算是异或

  1. 首先我们填充零以对应编码消息的位长度(14+3=17位):
    11010011101100 000 <--- input right padded by 3 bits
    1011 <--- divisor (4 bits) = x³ + x + 1
    ------------------
    01100011101100 000 <--- result

  2. 通过在每一步中将除数向右移动 1 位(或更多)来迭代计算新结果:
    01100011101100 000 <--- result of step 1
    1011 <--- divisor
    00111011101100 000
    1011
    00010111101100 000
    1011
    00000001101100 000 <--- note that the divisor moves over to align with the next 1 in
    1011 the dividend (since quotient for that step was zero)
    00000000110100 000 (in other words, it doesn't necessarily move one bit per
    1011 iteration)
    00000000011000 000
    1011
    00000000001110 000
    1011
    00000000000101 000
    101 1
    ------------------
    00000000000000 100 <--- remainder (3 bits). Division algorithm stops here as dividend
    is equal to zero.

由于最左边的除数位将它接触的每个输入位清零,因此当此过程结束时,输入行中唯一可以非零的位是该行右端的 3 位。

这 3 位是除法步骤的余数,也将是 CRC 函数的值(除非所选的 CRC 规范要求进行一些后处理)。


收到消息验证

可以通过再次执行上述计算轻松验证接收到的消息的有效性,这次添加的是校验值而不是零。如果没有检测到错误,余数应为零。


11010011101100 100 <--- input with check value
1011 <--- divisor
01100011101100 100 <--- result
1011 <--- divisor ...
00111011101100 100

......

00000000001110 100
1011
00000000000101 100
101 1
------------------
0 <--- remainder