樹莓派集羣(分佈式FFMPEG轉碼)

樹莓派集羣(分佈式FFMPEG轉碼)

前言

  • 關於分佈式FFMPEG轉碼的信息可以看我之前的博客: https://blog.csdn.net/imdyf/article/details/80621009
  • 代碼託管在GitHub上: https://github.com/chn-lee-yumi/distributed_ffmpeg_transcoding_cluster
  • 事實上這個集羣可以使用不同架構的CPU,你可以用幾個樹莓派,加幾臺x86的電腦,它們可以一起工作,這個我們在文章末尾再講。
  • 我們先使用樹莓派來搭建集羣。這裏有一個樹莓派2B,一個樹莓派3B。我的電腦是win10,用於燒錄系統和配置樹莓派。
  • 集羣節點角色分三種:控制(一個)、計算(至少一個)、存儲(一個)。每個節點可以部署一個或多個角色。我們的角色分配如下:
節點 角色
樹莓派3B 控制、計算、存儲
樹莓派2B 計算

準備工作

  • 首先需要上raspberrypi.org下載最新的樹莓派鏡像,我這裏用raspbian。然後用win32diskimager燒錄到TF卡,接着在boot-分區創建一個名爲ssh的空文件。現在就可以插到樹莓派上開機了。
  • 樹莓派開機後,在路由器頁面看到樹莓派的IP地址,然後用putty進行ssh連接,用戶名pi,密碼raspberry。
  • 我的樹莓派2B的IP地址是:10.1.1.3;樹莓派3B的IP地址是:10.1.1.172。
  • 不管哪個節點,進去後都先進行下面這一步:
  • 換國內軟件源。我這裏用清華大學的源。根據使用說明 https://mirrors.tuna.tsinghua.edu.cn/help/raspbian/ ,執行sudo nano /etc/apt/sources.list並把文件修改成如下內容:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib
  • Ctrl+O保存,再按Ctrl+X退出。
  • 然後執行sudo apt-get update進行更新。

樹莓派3B配置

存儲

  • 集羣中,共享存儲是十分重要的,所以我們先配置存儲
sudo apt-get install nfs-kernel-server
sudo chmod 777 /var/lib/nfs/.etab.lock
sudo chmod 777 /var/lib/nfs
sudo mkdir -p /srv/distributed_ffmpeg_transcoding_shared_files
sudo chmod 777 /srv/distributed_ffmpeg_transcoding_shared_files
mkdir /srv/distributed_ffmpeg_transcoding_shared_files/upload
mkdir /srv/distributed_ffmpeg_transcoding_shared_files/tmp
mkdir /srv/distributed_ffmpeg_transcoding_shared_files/download
  • 運行sudo nano /etc/exports,將文件內容修改成如下:
/srv/distributed_ffmpeg_transcoding_shared_files/upload 10.1.1.3(ro,insecure)
/srv/distributed_ffmpeg_transcoding_shared_files/tmp 10.1.1.3(rw,insecure)
  • 其中10.1.1.3是樹莓派2B的IP地址(計算節點)。
  • 假如你有三個計算節點,它們的IP是10.1.1.3-10.1.1.5,可以寫成如下形式:
/srv/distributed_ffmpeg_transcoding_shared_files/upload 10.1.1.3(ro,insecure) 10.1.1.4(ro,insecure) 10.1.1.5(ro,insecure)
/srv/distributed_ffmpeg_transcoding_shared_files/tmp 10.1.1.3(rw,insecure) 10.1.1.4(rw,insecure) 10.1.1.5(rw,insecure)
  • 如果存儲節點也是計算節點,不需要存儲節點寫上。因爲存儲節點不需要掛載NFS。
  • 修改完成後,執行下面這條命令使配置生效:
 exportfs -arv

計算

  • 計算角色配置十分簡單,只要執行下面一條命令
sudo apt-get install ffmpeg

控制

  • 首先我們要設置免密碼SSH。先執行ssh-keygen -t rsa生成key,期間會讓你輸入一些參數,我們採用默認參數,直接回車。
  • 結果如下圖:
    ssh-keygen 示意圖
  • 然後執行下面的命令ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.1.3,將公鑰複製到樹莓派2B。(10.1.1.3是樹莓派2B的IP地址)
  • 期間會問你一些東西,我們先輸入yes,回車,然後輸入raspberry(輸入這個的時候不會有顯示),回車。結果如下圖:
    ssh-copy-id 示意圖
  • 因爲樹莓派3B也是計算節點,我們也要複製公鑰。使用命令ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.1.172,其餘操作同上。
  • 如果還有別的節點,修改命令的IP地址爲目標節點,再執行這樣的命令。
  • 這樣免密碼SSH就設置好了。接下來我們下載控制腳本,執行如下命令:
wget https://raw.githubusercontent.com/chn-lee-yumi/distributed_ffmpeg_transcoding_cluster/master/dffmpeg.sh
chmod +x dffmpeg.sh
  • 然後我們需要修改控制腳本的配置。執行nano dffmpeg.sh,將配置項部分修改成如下內容:
    配置修改結果圖
  • 主要要修改的部分:storage_node的值IP改成存儲節點的IP地址,這裏是10.1.1.172。compute_node的值改成計算節點的IP地址,這裏是10.1.1.172和10.1.1.3。compute_node_weight的值改成各計算節點的權重(性能越好權重應該設置得越大)。我這裏將樹莓派3B設成48,樹莓派2B設成36。
  • 最後,我們還需要安裝一個小軟件,執行命令sudo apt-get install bc進行安裝。

樹莓派2B配置

  • 它只有一個計算角色,要配置的東西很少,我們只要安裝ffmpeg和掛載共享存儲。執行如下命令:
sudo apt-get install ffmpeg
sudo mkdir -p /srv/distributed_ffmpeg_transcoding_shared_files
sudo chmod 777 /srv/distributed_ffmpeg_transcoding_shared_files
mkdir /srv/distributed_ffmpeg_transcoding_shared_files/upload
mkdir /srv/distributed_ffmpeg_transcoding_shared_files/tmp
sudo mount 10.1.1.172:/srv/distributed_ffmpeg_transcoding_shared_files/upload /srv/distributed_ffmpeg_transcoding_shared_files/upload
sudo mount 10.1.1.172:/srv/distributed_ffmpeg_transcoding_shared_files/tmp /srv/distributed_ffmpeg_transcoding_shared_files/tmp
  • 其中10.1.1.172是存儲節點(也就是樹莓派3B)的IP地址。

測試

  • 測試在控制端進行。首先先下載個測試視頻。如果你沒有合適的視頻,可以用我在網上找的。執行下面的命令進行下載:
wget https://github.com/chn-lee-yumi/distributed_ffmpeg_transcoding_cluster/blob/master/test_video.mp4?raw=true
  • 下載後的文件名後綴不對,我們改一下:mv test_video.mp4?raw=true test_video.mp4
  • 然後我們就可以開始正式測試分佈式FFMpeg轉碼了。執行下面的命令:
 ./dffmpeg.sh test_video.mp4 -c:v mpeg4 -b:v 1M
  • 其中mpeg4是編碼格式,1M是視頻碼率。我們把test_video.mp4轉碼成mpeg4格式,視頻碼率爲1Mbps。
  • 執行效果如下圖:
    執行效果

結束語

  • 在這個過程中發現一個奇怪的bug:ffmpeg還在運行但已經執行了後面的touch語句。會導致最後視頻拼接出錯。臨時解決辦法是修改控制腳本配置項的sync_wait_time。該BUG原因不明,但不是因爲使用了NFS的問題,因爲在存儲節點沒有使用NFS也會出現此情況。該問題留待解決。
  • 這個集羣是可以加入x86的計算機的,只要按照配置步驟,安裝ffmpeg,開啓免密碼ssh,掛載共享存儲,在控制腳本加入節點,就可以了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章