糾刪碼簡介

2022-03-03 20:35:31 字數 3775 閱讀 4073

背景

在資料儲存領域,hadoop採用三副本策略有效的解決了儲存的容錯問題,但是三副本策略中磁碟的利用效率比較低,僅有33%,而且副本帶來的成本壓力實在太高,後來適時的出現了糾刪碼的概念。當冗餘級別為n+m時,將這些資料塊分別存放在n+m個硬碟上,這樣就能容忍m個(假設初始資料有n個)硬碟發生故障。當不超過m個硬碟發生故障時,只需任意選取n個正常的資料塊就能計算得到所有的原始資料。糾刪碼以更低的儲存成本備受青睞,目前microsoft、google、facebook、amazon、**(tfs)都已經在自己的產品中採用了erasure code.

在以上背景的基礎上,本文在糾刪碼的編碼、解碼中採用的矩陣數學知識,以及矩陣分解中用到的lu分解等數學知識進行分析,並在文末給出相應的**示例。

糾刪碼工作原理簡介:

rs(reed-solomom)碼是一種比較常見的糾刪碼,它的兩個引數m和n分別代表校驗塊個數和原始資料塊個數。

糾刪碼編碼過程:

在圖中的編碼過程,c代表校驗塊,d代表原始的資料塊。

當丟失了部分資料,如圖

糾刪碼解碼過程:

step1:在編碼矩陣中去掉丟失資料塊以及該資料塊對應的行。即b矩陣變為了n*n 

維度的方陣,c與d組合的矩陣由(n+m)行變為n行,在上述假設過程中,我們得到新的矩陣以及對應的矩陣運算關係式,其中在丟失了部分資料塊後,d所代表的原始資料塊便成為了要求的目標。

step2:求b』的逆矩陣。

step3:可以採用對等式兩邊同時乘上b』的逆矩陣,於是得到所求解。

為了保證b』逆矩陣是存在的,必須保證b』矩陣是可逆的,在通常的計算過程中,用於校檢的黃色部分資料塊採用範德蒙矩陣。

函式inverse[b′]代表b'的逆矩陣,i代表單位矩陣:

inverse[b′]∗b′∗d=inverse[b′]∗s

i∗d=inverse[b′]∗s

d=inverse[b′]∗s

# erasure code

import numpy as np

# 備份數量

backup_up = 2

# 原始資料

data = np.array([1, 2, 3, 4, 5])

# 根據糾刪碼原理生成的資料

vander_data = np.concatenate((np.identity(len(data)), np.vander(data, 3).transpose()::-1]), axis=0)

storage_data = vander_data.dot(data)

print('生成資料',storage_data)

# 模擬資料丟失

loss_data = np.concatenate((storage_data[0:3], storage_data[5:7]), axis=0)print('丟失後資料', loss_data)

# 恢復資料

recover_data = np.linalg.inv(np.concatenate((vander_data[0:3], vander_data[5:7]), axis=0)).dot(loss_data)

print('恢復資料',recover_data)

# 輸出結果

# 生成資料 [ 1. 2. 3. 4. 5. 15. 55. 225.]

# 丟失後資料 [ 1. 2. 3. 15. 55.]

# 恢復資料 [1. 2. 3. 4. 5.]

矩陣的正交分解又稱為qr分解,是將矩陣分解為乙個正交矩陣q和乙個上三角矩陣的乘積的形式。任意實數方陣a,都能被分解為 。這裡的q為正交單位陣,即 r是乙個上三角矩陣。這種分解被稱為qr分解。 qr分解也有若干種演算法,常見的包括gram–schmidt、householder和givens演算法。 qr分解是將矩陣分解為乙個正交矩陣與上三角矩陣的乘積。這裡僅記錄一下第一種分解的計算過程(matlab**以及例題計算過程)。

schmidt正交化

定理1 設a是n階實非奇異矩陣,則存在正交矩陣q和實非奇異上三角矩陣r使a有qr分解;且除去相差乙個對角元素的絕對值(模)全等於1的對角矩陣因子外,分解是唯一的.

定理2 設a是m×n實矩陣,且其n個列向量線性無關,則a有分解a=qr,其中q是m×n實矩陣,且滿足qhtq=e,r是n階實非奇異上三角矩陣該分解除去相差乙個對角元素的絕對值(模)全等於1的對角矩陣因子外是唯一的.用schmidt正交化分解方法對矩陣進行qr分解時,所論矩陣必須是列滿秩矩陣。

演算法步驟

寫出矩陣的列向量;

列向量按照schmidt正交化正交;

得出矩陣的q′,r′;

對r′的列向量單位化得到q,r′的每行乘r′每列的模

matlab**

function[x,q,r] = qrschmidt(a,b)

%方陣的qr的gram-schmidt正交化分解法,並用於求解ax=b方程組[m,n]=size(a);

if m~=n

%如果不是方陣,則不滿足qr分解要求

disp('不滿足qr分解要求');

endq=zeros(m,n);

x=zeros(n,1);

r=zeros(n);

for k=1:nr(k,k)=norm(a(:,k));

if r(k,k)==0

break;

endq(:,k)=a(:,k)/r(k,k);

for j=k+1:n

r(k,j)=q(:,k)'*a(:,j);

a(:,j)=a(:,j)-r(k,j)*q(:,k);

endif nargin==2

b=q'* b;

x(n)=b(n)/r(n,n);

for i=n-1:-1:1

x(i)=(b(i)-sum(r(i,i+1:n).*x(i+1:n)'))/r(i,i);

endelse

x=;endend

手撕計算過程

matlab自帶方法

%產生乙個3*3大小的魔方矩陣

a=magic(3)

[q,r]=qr(a)

糾刪碼 定義及常見型別

你能給糾刪碼乙個好的定義嗎?ethan miller 糾刪碼是在丟失部分資料的情況下根據剩餘資料將丟失的資料重建的一組演算法。舉個例子,如果我想保護六份資料,我會使用一種糾刪碼演算法來產生兩份額外的資料,這樣總共就會有八份資料。這八份資料中的任意六份資料都能恢復另外兩份資料。糾刪碼的要點是你可以選擇...

Hadoop容錯恢復之糾刪碼

在hdfs中常見的容錯恢復是副本機制,它會在部分檔案丟失之後通過心跳機制發資料給namenode然後尋找未丟失的副本,按照replication進行備份。這樣的話會保證資料在絕大多數情況下不丟失。但是造成的問題就是這種機制使得hadoop的空間利用率會很低。比如說在乙個備份數量為3的情況下空間利用率...

ceph中糾刪碼如何讀寫資料

從該圖我們可以看到從前端的業務檔案到資料儲存到儲存硬碟上的過程,步驟如下 1.file object對映 rados中需要配置object的大小,一般會設定為2m到4m的大小。當使用者寫入資料檔案時,首先會根據object的大小值將file進行切分。如果file的大小不足object的大小,則直接按...