twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル BeagleBone Blackを使って、計算用クラスタを構築する

BeagleBone Blackを使って、計算用クラスタを構築する

原文は、こちらです。

  開発者として、私は新しい技術について学び続け、開発もしてきました。分散コンピューターと並列コンピューターは、私が特に興味を持つ 2 つの分野であるため、家庭用クラスタ システムを構築しました。家庭用クラスタは、特に目新しくはありませんし、Linux が動作する古めのデスクトップ PC で構築できます。デスクトップ (とラップトップ) を常時稼働させておくことは、場所も占有し、電力も消費します。構築費用もかかりますし、発熱も馬鹿にできません。最近の安価な ARM ベースのコンピューターの劇的な普及に感謝すべきですね。特に、Raspberry Pi は一番普及しています。サイズも小さく、低消費電力で、Linux も動作します。これらの ARM ベースのボード コンピューターは、家庭で何か開発するには最適です。Raspberry Pi はサイズも小さくコミュニティも活発ですが、私は BeagleBone Black を選びました。

 2008 年に発表された最初の BeagleBoard は、TI がオープンソース コンピューターとして開発しました。720MHz Cortex A8 ARM チップと 256MB メモリを搭載しています。最新リリースの BeagleBone Black に先立つ 2 年前と 1 年前に、それぞれ、BeagleBoard-xm と BeagleBone がリリースされました。後者は Raspberry Pi より若干高い $45 という価格にもかかわらず、若干速い 1GHz Cortex 8 チップと 512MB のRAM、USB を持っています。Linux をインストールした 2G のオンボード メモリ以外に、備え付けの SD カード スロットに挿入した SD カードからブートすることができます。Debian, Ubuntu などの各種ディストリビューションがサポートされています。BeagleBone Black は、家庭用サーバー クラスタ構築に安価で最適な出発点と言えるでしょう。

クラスタ構築

 まず、3 台のマシンから構成される小さなクラスタから始めることにしました。購入リストです。

1x 8 port gigabit switch
3x beaglebone blacks
3x ethernet cables
3x 5V 2 amp power supplys
3x 4 GB microSD cards

 シンプルにするために、デスクトップやラップトップからコマンド ラインでコントロールできるようにします。BeagleBone Black は HDMI が付いていますから、スタンドアロン コンピューターとしても使用できますが、今回は必要ありません。付属の USB ケーブルを使用して、BeagleBone Black と自分のコンピューターを接続し、SSH でプリインストールされた OS にログインします。私の場合は、SD カードを使い、新しくインストールしたものを利用することにしました。このため、各 SD カードに Linux をロードすることから始めました。Ubuntu マシンを使い、USB SD カード リーダーを接続して、この作業を行いました。

 BeagleBone で使用可能なディストリビューションをダウンロードできるところが、いくつかあります。私は、Ubuntuを利用することに決め、ここから構築済のイメージをダウンロードしました。ダウンロード時点の最新版は 8 月版 (訳注:原稿執筆時期が 2013/11/17 ですから、2013/8 のことと思われます) でしたが、現在は、もっと新しい版があります。ダウンロードしたファイルを解凍すると、たくさんのファイルとディレクトリがフォルダに展開されます。OS を SD カードに展開する setup_sdcard.sh というユーティリティが含まれています。SD カードのデバイスがわからない場合は、次のようにして知ることができます。

sudo ./setup_sdcard.sh --probe-mmc

 私のマシンでは、SD カードは /dev/sdb として認識されています。主パーティションは /dev/sdb1 です。パーティションが表示された場合は、アンマウントして、イメージのインストールをします。カードの準備ができたら、次のコマンドを実行します。

sudo ./setup_sdcard.sh --mmc /dev/sdb --uboot bone

 このコマンドを実行して、OS イメージ全部を SD カードにインストールします。残りの 2 枚の SD カードについても同様にインストールします。標準のユーザー名は ubuntu、パスワードは temppwd です。BeagleBone に SD カードを挿入し、イーサネット スイッチに接続します。

電源を投入し、SD カードからブートさせます。5V 電源コネクタを挿入する際は、ユーザー ブート ボタンを押下したままにしてください。ボタンは、USB ポートの近くの若干盛り上がった部分にあります。ボタンを押下すると、SD カードからブートします。ライトが点滅したら、ボタンを離します。最初にブートしたときは、全部同じホスト名になっているので、ひとつずつブートして、下記の手順で IP アドレスとホスト名を設定するのが良いと思います。

BeagleBone の構築

 ハードウェアの設定が完了し、マシンをネットワークに接続したら、Putty などの SSH クライアントで各マシンにログインします。デフォルトのホスト名は ubuntu-armhf です。ホスト名を変更します。ここでは beaglebone1、beaglebone2、beaglebone3 とします。hostname コマンドを使います。

sudo hostname beaglebone1

 

 次に、固定 IP アドレスを設定します。固定にしておけば、/etc/hosts ファイルに書いておけます。/etc/network/interfaces ファイルを編集します。私は、アドレス 192.168.1.1 を持つルーターを中心とした LAN を持っているので、192.168.1.51 から始まる IP アドレスを付与することにしました。

    iface eth0 inet static
       address 192.168.1.51
       netmask 255.255.255.0
       network 192.168.1.0
       broadcast 192.168.1.255
       gateway 192.168.1.1

 LAN 内にデバイスがたくさんあるときは、ルーターが割り当てるアドレス範囲外のアドレスを付与するのも良い考えです。ルーターには、付与アドレス範囲を指定できるものがあります。最後に /etc/hosts を編集して、下記のように各ノードと IP アドレスの対応を記入します。

127.0.0.1     localhost
192.168.1.51  beaglebone1
192.168.1.52  beaglebone2
192.168.1.53  beaglebone3

MPI を使った計算クラスタの構築

 すべての BeagleBone を設定したら、クラスタ構築にとりかかります。MPI 設定から始めるのが良いと考えました。MPI (Message Passing Interface) は、ネットワーク上のマシン同士でメッセージ交換を行う標準的なインタフェースです。ノード間でプログラムを配布し、各インスタンスは、各ノードのメモリにアクセスすることができます。MPI は、C、Python、Java などの言語で利用することができます。MPI にはさまざまなバージョンがありますが、今回は、私が手馴れている MPCIH を利用しました。インストールも簡単です。

sudo apt-get update
sudo apt-get install gcc
sudo apt-get install libcr-dev mpich2 mpich2-doc

 MPI は、SSH を用いたノード間の通信と、共有フォルダを使ったデータ共有により実現されています。まず、NFS をインストールします。beaglebone1 を MPI クラスタ内のマスター ノードとして、NFS サーバーをインストールします。(訳注:ディストリビューションによりパッケージ名が異なります。たとえば、apt-get install nfs-kernel-server)

sudo apt-get install nfs-client

 他の 2 つのノードにクライアントをインストールします。(訳注:ディストリビューションによりパッケージ名が異なります。例えば、apt-get install nfs-common)

sudo apt-get install nfs-server

 次に、各ノードに、MPI が使うフォルダーとユーザーを作成します。hpcuser としました。

sudo mkdir /hpcuser

 すべてのノードで作成したら、マスター ノードで以下を実行して、フォルダーを公開します (訳注:この直後に、sudo /etc/init.d/nfs-kernel-server restartか、sudo exportsfs –rのコマンドが必要な場合があります)。

echo "/hpcuser *(rw,sync)" | sudo tee -a /etc/exports

 各スレーブ ノードで、マスター ノードをマウントして、マスター ノードの内容を参照できるようにします。

sudo mount beaglebone1:/hpcuser /hpcuser

 リブート時に 自動的にマウントされるように、下記のように /etc/fstab を編集します。

beaglebone1:/hpcuser    /hpcuser    nfs

 最後に hpcuser を作成し、共有フォルダーを割り当てます。

sudo useradd -d /hpcuser hpcuser

 マシン間でのネットワーク共有をするために、MPI がマシン相互間で通信できるように、SSH をすべてのマシンにインストールします。

sudo apt-get install openssh-server

 SSH 通信のためのキーを生成します。hpcuser になって ssh-keygen コマンドを使います。

su - hpcuser
ssh­keygen ­-t rsa

 設定を簡単にするため、パスフレーズを空白にしておくこともできます。ロケーションはデフォルトにしておきます。パスフレーズを指定する場合は、SSH  実行時にパス フレーズの入力を求められないようにしておく必要があります。このために、ssh-agent コマンドを使ってキーを格納します。キーを生成後、以下のように保管場所にしまいます。

cd .ssh
cat id_rsa.pub >> authorized_keys

 つながるかどうか確認します。

ssh hpcuser@beaglebone2

MPI のテスト

 マシンがうまく接続できたら、マスター ノードで動作する簡単なプログラムを準備しました。hpcuser としてログインし、ルート ディレクトリ /hcpuser 下に、mpi1.c として作成しました。MPI は、共有フォルダー内にプログラムを置き、各マシンで実行できるようにします。このプログラムは、現プロセスのインデックス番号、実行中のプロセスの総数と現プロセスのホスト名を表示します。他ノードから入手したプロセス・インデックスの総和を表示します。

#include <mpi.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
    int rank, size, total;
    char hostname[1024];
    gethostname(hostname, 1023);
    MPI_Init(&argc, &argv);
    MPI_Comm_rank (MPI_COMM_WORLD, &rank);
    MPI_Comm_size (MPI_COMM_WORLD, &size);
    MPI_Reduce(&rank, &total, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
    printf("Testing MPI index %d of %d on hostname %s\n", rank, size, hostname);
    if (rank==0)
    {
        printf("Process sum is %d\n", total);
    }
    MPI_Finalize();
    return 0;
}

 次に、クラスタ内のノード名を 1 行ごとに記述した machines.txt ファイルを同じディレクトリ下に作成します。このファイルにより、MPI がどのノードで動作するかを指定します。

beaglebone1
beaglebone2
beaglebone3

 両ファイルを作成して、プログラムを mpicc でコンパイル、実行します。

mpicc mpi1.c -o mpiprogram
mpiexec -n 8 -f machines.txt ./mpiprogram

 3 つのノード全部で実行し、下記のような結果を表示しました。

Testing MPI index 4 of 8 on hostname beaglebone2
Testing MPI index 7 of 8 on hostname beaglebone2
Testing MPI index 5 of 8 on hostname beaglebone3
Testing MPI index 6 of 8 on hostname beaglebone1
Testing MPI index 1 of 8 on hostname beaglebone2
Testing MPI index 3 of 8 on hostname beaglebone1
Testing MPI index 2 of 8 on hostname beaglebone3
Testing MPI index 0 of 8 on hostname beaglebone1
Process sum is 28

他のプロジェクト

  MPI は初歩的な道具であり、大半の人は Hadoop に慣れているでしょう。Hadoop との互換性を確かめるために、Hadoop V1.2をここからダウンロード (hadoop-1.2.1.tar.gz) しました。
簡単な設定をして、全ノードで実行させることができました。Hadoop を実行すると、SD カードのスピードが BeagleBone の限界となってしまいました。結果、HDFS の性能は非常に悪く、何もかも実行することはできないでしょう。

 BeagleBone の他の使い道として、Web サーバーとコード リポジトリがあります。簡単に Git と Apach、Node.js を導入できます。他の Ubuntu サーバーでやっていることと同じです。Jenkins、Hudson を使い、個人用のビルド サーバーも構築できます。BeagleBone をさまざまなものに接続したり、xbmc をインストールして、メディア サーバーとして使用することもできます。

将来
BeagleBone や Raspberry Pi のようなシングル コア ボード以外に、Pandaboard や Cubiebord のようなデュアル コアのボードも出てきています。後者は BeagleBone より若干高価ですが、2.5 インチ SATA ハード ディスクとデュアル コアを装備しています。ここに書いたことと同様の手順で設定が可能だと思います。私のような趣味人が家庭用サーバーを構築できます。皆さんが挑戦し、何かを構築するのを楽しみにしています。

 

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/01/10 2018年 1月 09日
  2. Today's Linux 2018/01/12 2018年 1月 11日
  3. Today's Linux 2018/01/15 2018年 1月 14日
  4. Today's Linux 2018/01/16 2018年 1月 15日
  5. Today's Linux 2018/01/17 2018年 1月 16日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!