#author("2020-07-09T01:20:34+00:00","","") #author("2020-07-09T01:32:58+00:00","","") [[Rene_情報工学実験2]] 1週目 1週目では、Mpichにより、モンテカルロ法を用いて円周率を求める。 実験手順 分散ネットワーク環境の構築 1. まず1組が4つの班に分かれ、着席する。(グループ分けは出欠状況によるため、当日調整する).マスター1台に,スレーブ2台または3台となる. 2. USBメモリを配布するので、その中のファイルを全て、自分のPCにコピーする。 3. 「VirtualBox-5.2.20-125813-Win.exe」(数字はバージョンに伴い変わっている可能性がある)を実行し、VirtualBoxをインストールする。 4. VirtualBoxを起動する。 5. 左上の「新規」から仮想マシンを作成する。 #ref(IE2_01.png,,50%) 6. 仮想マシンの名前は何でも良いがとりあえず「tpu」とする。タイプは「Linux」、バージョンは「Red Hat(64-bit)」を選択して次に進む。(CentOSはRedHad系のOSである)。32bitしか表示されない場合、BIOSを開いてvirtualization technologyがDisableになっている場合にEnableに変更する。 #ref(IE2_02.png,,50%) 7. メモリーサイズは「2048MB」に設定して次に進む。 #ref(IE2_03.png,,50%) 8. 「仮想ハードディスクを作成する(C)」にチェックして作成に進む。 #ref(IE2_04.png,,50%) 9. ハードディスクのファイルタイプを「VDI(VirtualBox Disk Image)」に選択して次に進む。 #ref(IE2_05.png,,50%) 10. 物理ハードディスクにあるストレージは「可変サイズ」を選択する。 #ref(IE2_06.png,,50%) 11. HDDの容量は「30GB」に設定して作成する。(必ず30GBに増量すること) #ref(IE2_07.png,,50%) 12. 作成した仮想マシンの設定を行うため、設定ボタンを押す。 #ref(IE2_08.png,,50%) 13. ネットワークからアダプター1を「ブリッジアダプター」に変更し、名前部分は有線LANのアダプター名(この例では「Realtek PCIe GBE Family Controller」)を選択する。各自のPCだと異なる名前の場合もあるのでそれぞれ(有線LAN(Ethernet)となるように)選択すること。 #ref(IE2_09.png,,50%) 14. アダプター2のネットワークアダプターを有効化し、「NAT」を割り当てる。 #ref(IE2_10.png,,50%) 15. ストレージは, コントロラーIDEの「空」を選択し、右の光学ドライブ右端のディスクをクリックし、USBメモリからコピーしたファイル「CentOS-7-x86_64-DVD-1804.iso」を選択する。(ここもバージョンの関係でファイル名の数字は変わる可能性がある) #ref(IE2_11.png,,50%) 16. 起動ボタンを押し、仮想マシンを起動する。(Windowsが激重になるので注意すること) #ref(IE2_12.png,,50%) 17. ここから仮想マシン上での「CentOSのインストール・セットアップ」になる。状況によってはマウスカーソルを動かす際に「コントロールの切り替え」が発生するので注意すること。通常は、仮想マシン内のカーソル移動からは、右側の「Ctrl」キーを押すことで元のカーソル動作に戻る。 18. 仮想マシンの画面が起動し、CentOS7のインストールメニュー画面になるので、「Install CentOS7」 を選択する。 #ref(IE2_13.png,,50%) 19. 使用する言語を「日本語(Japanese)」を選択し、右下の「続行」ボタンで続ける。 #ref(IE2_14.png,,50%) 20. 「ソフトウェアの選択(S)」を選択する。 #ref(IE2_15.png,,50%) 21. 「サーバー(GUI使用)」を選択して、左上の完了で進む。 #ref(IE2_16.png,,50%) 22. 「インストール先(D)」を選択する。 #ref(IE2_17.png,,50%) 23. 既に30GBのHDDが選択されている状態になるので、そのまま完了で進む。 #ref(IE2_18.png,,50%) 24. 「ネットワークとホスト名 (N)」を選択する #ref(IE2_19.png,,50%) 25.1 Ethernetの接続(enp0s3のみ) を「オン」(右上のスライドを変更)にして、完了する。 #ref(IE2_20.png,,50%) 25.2 無線の接続を「オン」(右上のスライドを変更)にして、完了する。 #ref(IE2_20.png,,50%) 26. ここまでの手順を終えたら、右下の「インストールの開始(B)」が有効になっているはずなので、これを実行する。 #ref(IE2_21.png,,50%) 27. rootパスワードの設定を行う。 #ref(IE2_22.png,,50%) 28. rootパスワードは「tpu」とする。パスワードを2回入力して「完了」を押すと、短すぎるというエラーが表示されるが、そのまま「完了」をもう1回押せばそのまま進む。 #ref(IE2_23.png,,50%) 29. 「ユーザーの作成」に進み、ユーザー名を「tpu」にして、2ヶ所あるチェックを全てONにし、パスワード「tpu」を2回入力して完了を押す。こちらも同様にエラーになるが完了をさらに押して進む。 #ref(IE2_24.png,,50%) 30. インストールが完了すると、右下に「再起動」ボタンが現れるので、そのまま再起動する。(仮想マシンの再起動なので、Windowsを再起動する必要はない) #ref(IE2_25.png,,50%) 31. CentOS起動後、初期設定のウィンドウが開くので、ライセンスを認識し、設定を完了する。 32. ログイン画面になるので「tpu」でログインする。 33. 最初のログインなので「ようこそ」ウィンドウが開くので、順に「日本語」→「日本語」→「オフ」→「スキップ」と選択し、「CentOS Linuxを使い始める」をクリックする。 34. 「初めて使う方へ」のウィンドウが開くが、特に読まなくても大丈夫なので閉じる。 35. 画面左上の「アプリケーション」から、「端末」を選択して開く。以後はほぼ全てこの端末ウィンドウ内で作業を行う。以下、テキストでは端末内のコマンドラインに入力する文字列は「$」で始まる行で示す。「$」自体は入力する必要は無くその右からの文字列を(スペース空白を含めて)入力し、最後に「Enter」を入力する。 36. まず、sudoが正常に機能するか確認するため、以下を入力する。 $ sudo echo test tpuのパスワード入力が要求されるので、パスワードを入力すると、「test」と表示されて終了する。これができていることを確認すること。sudoコマンドは必要な場合にはパスワードを要求してくるので、そのままパスワードを入力すること。 #ref(IE2_25.png,,50%) 37. ここで、これから使用するvimというエディターについて説明をする。vimは主にunix系のOS上で、CUIで使われることを前提に設計されたviというエディターの改良版である。vimは、高性能なエディターですが、いわゆるWindowsのエディターとは若干操作体系が異なるので、使いこなしておくこと。大きな違いは、「通常モード」と「挿入モード」という2つのモードが存在し、文字入力(追加)は基本的に「挿入モード」でしかできません。これを覚えておいてください。 Vimで使用する主なコマンドを以下の表に示す。全て「通常モード」の時に入力します。 表1:Vimのコマンド一覧 ※「挿入モード(文字入力モード、Insert Modeと表示されることも)」から「通常モード」に戻るには、「Esc」キーを押す。 #ref(IE2_26.png,,50%) 38. 早速このvimを使って、SELinuxの無効化設定を行う。コマンドは以下のとおり。 $ sudo vim /etc/selinux/config #ref(IE2_27.png,,50%) 上図のように、SELINUX=disabledを最後に追加し、SELINUX=enforcingの行をコメントアウト(行の先頭に「#」を追加する。出来る人は、ファイル途中にあるSELINUX=enforcingの行を直接SELINUX=disabledに書き換える形でも良い。 ファイルを保存してvimを終了する。(「Esc」を押してコマンド「:wq」を実行) 39. さらに、手動でもSELinuxを停止する。以下のコマンドを実行する。 $ sudo setenforce 0 40. SELinuxの動作状態を確認する。以下のコマンドを実行する。 $ getenforce 「Permissive」もしくは「Disabled」と表示されればOKである。ダメな場合は上の無効化手順をもう一度実行してみること。 41. 次に、仮想マシンのファイアウォールを無効化する。以下のコマンドを実行する。 $ sudo systemctl disable firewalld $ sudo systemctl stop firewalld 42. ファイアウォールが停止したかどうかの確認は以下のコマンドでできる。 $ systemctl status firewalld 全部英語で読みづらいが、「Active: inactive (dead)」の表示があればOKである。 #ref(IE2_28.png,,50%) 43. ここから必要なものをインストールするためには、仮想マシンからインターネットに接続する必要がある。 44. 画面の右上からEthernet(enp0s3)をオフにしてEthernet(enp0s8)をオンにする。これで、windows側で無線LAN(研究室の実験用のAirmac)に接続し、認証画面をパスしていれば、仮想マシンからでもインターネットに接続できる状況になる。 44.1. 無線で(Wi-Fi)でネットワークに接続する人は、一度仮想マシンの操作から自分のPCの操作に切り替えて、Wi-Fiをelecom5g-a9679dに接続する。パスワード似つきましてTAを呼ぶ。 45. 次に、Java JDKのインストールをするために、以下のコマンドを入力する。 $ sudo yum –y install java–1.8.0–openjdk–devel mpich mpich-devel gcc-c++ openssl-devel 下のような画面になれば成功している。 #ref(IE2_29.png,,50%) 46. 次に、hadoopソフトウェア本体のダウンロードをするために、以下のコマンドを順番に入力する。 $ cd $ wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz 47. その後、ホームディレクトリにhadoop-2.8.5を展開したいので以下のコマンドを入力する。 $ tar xvzf hadoop-2.8.5.tar.gz 48. ホームディレクトリでlsと入力して下図のように青色の「hadoop-2.8.5」と赤色の「hadoop-2.8.5.tar.gz」が両方とも表示されれば、成功している。 $ ls #ref(IE2_30.png,,50%) 49. ここで、インターネット接続を解除し、ローカルネットワーク接続に戻す。 画面の右上からEthernet(enp0s8)をオフにしてEthernet(enp0s3)をオンにする。これで、ローカルネットワークに接続される。LANケーブルを学内のネットワークから、黒いハブにつなぎかえる。 50. .bashrcファイルを変更し、bash環境の設定を変更する。以下のコマンドで編集を開始する。 $ vim .bashrc ファイルの最後に以下の6行を追加しファイルを保存して終了する。 $ export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk $ export HADOOP_HOME=$HOME/hadoop-2.8.5 $ export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop $ export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop $ export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH $ export PATH=/usr/lib64/mpich/bin:$PATH $ export HADOOP_CLASSPATH=/usr/lib/jvm/java-1.8.0-openjdk/lib/tools.jar 51. .bashrcファイルの変更を反映するために以下のコマンドを入力する。 $ source .bashrc 52. 自分の仮想マシン自身のIPアドレスを固定番号に設定する。以下のコマンドを順番に入力する。XXXの部分は、自分の学籍番号下3桁部分の数字に置き換える。例えば、1815010の場合は、XXXの部分は10となる。(過年度生は番号重複の可能性があるためTAに相談すること) $ nmcli connection modify enp0s3 ipv4.method manual ipv4.addresses 192.168.2.XXX/24 $ nmcli connection modify enp0s3 ipv4.gateway 192.168.2.1 $ nmcli connection down enp0s3 $ nmcli connection up enp0s3 下図は、学籍番号1815005の場合の画面である。 #ref(IE2_31.png,,50%) 53. 以下のコマンドを入力して、自分の設定したIP番号で動作しているか確認できればよい。(下図は学籍番号1815005の場合) $ nmcli device show enp0s3 確認後Ctrl+Cで抜ける。 #ref(IE2_32.png,,50%) 54. マスターPCに通信できるか確かめる。○は、ホワイトボードに記入してある。 $ ping 192.168.2.○ (○はホワイトボードに書かれている自分のmasterの番号) 以下のように表示されていれば通信できている。 64 bytes from 192.168.2.○: icmp_seq=1 ttl=64 time=0.111 ms 通信できていない場合以下を確認してみる LANケーブルが接続されているか確認する。 仮想マシンの右上の電池のマークのところをクリックしてEthernet(enp0s3)が接続状態になっていることを確認する。 仮想マシンの右上の電池のマークのところをクリックして右下の電源ボタンから電源オフを選択し、もう一度起動する。 マスターPCの方でも上記3つを実行する。 これでできなかった場合はTAを呼ぶ。(ルーターの差し直し?) 55. 仮想マシンのホスト名を設定する。以下のコマンドを順番に入力する。XXXの部分は、先ほどと同じ数字にする。 $ sudo hostname slaveXXX $ echo “slaveXXX” | sudo tee /etc/hostname > /dev/null 以下のコマンドを入力して「slaveXXX」と表示されれば成功している。 $ hostname 下図は、学籍番号1815005の例である。 #ref(IE2_33.png,,50%) 56. /etc/hostsファイルの編集をする。このファイルは、IP番号とホスト名の対応表である。 以下のコマンドで編集を開始する。 $ sudo vim /etc/hosts 既にある127.0.0.1と::1で始まる2行はそのままに、その後ろに以下の行を追加する。 ○は、自分のmaster番号(0か1か2か3)、×は自分の学籍番号下2桁、□は班のペアの学籍番号下2桁を入力する。 192.168.2.20○ master○ 192.168.2.× slave× 192.168.2.□ slave□ ----以下、実験をやる組全員分のIP番号とslave番号を設定する。 下図は1組の場合の例である。 #ref(IE2_34.png,,50%) 57. ディレクトリができたか確認するには、以下のコマンドを入力し、下図のようになればよい。 $ ls $HADOOP_HOME #ref(IE2_35.png,,50%) 58. Javaの動作確認をする。以下のコマンドを入力し、下図のようになればよい。 $ java –version #ref(IE2_36.png,,50%) 59. 同様に、hadoopの動作確認をする。以下のコマンドを入力し、下図のようになればよい。 $ hadoop version #ref(IE2_37.png,,50%) 60. sshの設定とscpをTAにしてもらう。 61. マスターPCに通信できるか確かめる。 $ ping master○ (○はホワイトボードに書かれている自分のmasterの番号) 以下のように表示されていれば通信できている。 64 bytes from master○ (192.168.2.○): icmp_seq=1 ttl=64 time=0.111 ms 通信できていない場合以下を確認してみる LANケーブルが接続されているか確認する。 仮想マシンの右上の電池のマークのところをクリックしてEthernet(enp0s3)が接続状態になっていることを確認する。 仮想マシンの右上の電池のマークのところをクリックして右下の電源ボタンから電源オフを選択し、もう一度起動する。 マスターPCの方でも上記3つを実行する。 これでできなかった場合はTAを呼ぶ。(ルーターの差し直し?) 62. スレーブPCがマスターPCをマウントできるように以下のコマンドをマスターPCで入力する。 マウントとは、スレーブPC(生徒側のPC)がマスターPCの特定のフォルダを操作・利用可能にすること。 $ sudo systemctl start rpcbind $ sudo systemctl start nfs-server $ sudo systemctl start nfs-lock $ sudo systemctl start nfs-idmap $ sudo systemctl enable nfs-server $ sudo systemctl reload nfs-server 63. 自分のPCに戻り、マスター側の共有ディレクトリをマウントするディレクトリを以下のコマンドで作成する。 マウントとは、スレーブPC(生徒側のPC)がマスターPCの特定のフォルダを操作・利用可能にすること。 $ mkdir /home/tpu/share 64. 以下のコマンドでマウントする。 $ sudo mount --types nfs 192.168.2.○:/home/tpu/share /home/tpu/share ○には自分の席のmasterの下三桁(200,201,202,203)を入力する。 以下のコマンドで確認し、 $ df –k 一番下に次のように表示されればいい 192.168.2.○:/home/tpu/share 430897664 847872 430049792 1% /home/tpu/share 65. 以下のコマンドで共有ディレクトリを作成するためにfstabファイルを編集する。 $ sudo vim /etc/fstab 最後の行に以下を追加する。nfsの後は改行せずスペースだけ。 192.168.2.○:/home/tpu/share /home/tpu/share nfs rsize=8192,wsize=8192,hard,intr 0 0 ○には自分の席のmasterの下三桁(200,201,202,203)を入力する。 66. 確認方法 $ sudo umount /home/tpu/share $ sudo mount –a $ df –k 一番下につぎのようにでればいい。 192.168.2.○:/home/tpu/share 430897664 847872 430049792 1% /home/tpu/share 67. マスターPCにSSHで接続する。 マスターPCを操作する際は、sshの接続によって遠隔で操作する。 ○sshによる遠隔操作の仕方(スレイブ→マスターへ移動) ssh master○ ○は自分の班の番号 ○sshによる遠隔操作からの抜け方(マスター→スレイブへ移動) exit 68. 自分の学籍番号の下二桁が35の場合 以下の内容のプログラムをmontecarlo35.cという名前で作成する。コピペ可。 コピペ方法1:自分のPCでmontecarlo35.cを作成しUSBメモリを介して仮想マシンに送る。 コピペ方法2:共有ディレクトリのshareの中にmontecarlo.cがあるのでそれをコピーして貼り付けし名前をmontecarlo35.cにする。 数値積分やモンテカルロ法を用いて円周率を求めるサンプルプログラム(Mpich) #include "mpi.h" #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define NUM_MAX 100000000 #define PI 3.141592653589793238462643 typedef struct { double x; double y; }POINT; int main(int argc, char* argv[]) { POINT p; double r, pi, s, e; int cnt, total_cnt, i, rank, size, local_cnt; int start, end, sendbuf, recvbuf; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); s=MPI_Wtime(); local_cnt=(int)((double)NUM_MAX/(double)size); start=rank*local_cnt; end=(rank+1)*local_cnt; srand((unsigned int)time(NULL)*(rank+1)); cnt = 0; for (i = start; i < end; i++){ p.x = (double)rand() / (double)RAND_MAX; p.y = (double)rand() / (double)RAND_MAX; r = sqrt(p.x * p.x + p.y * p.y); if ( r < 1.0 ){ cnt++; } } sendbuf = cnt; recvbuf = 0; MPI_Allreduce(&sendbuf, &recvbuf, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); total_cnt =recvbuf; pi = 4.0 * (double)total_cnt / (double)NUM_MAX; if(rank==0){ printf("pi: %18.16lf, Error: %18.16lf \n",pi, fabs(pi-PI)); e=MPI_Wtime(); printf("time = : %8.4f[sec]\n",e-s); } MPI_Finalize(); return 0; } 以下のコマンドで共有フォルダに移動する。 $ cd /home/tpu/share 端末上で以下のコマンドでコンパイルする。 $ mpicc montecarlo35.c -o montecarlo35 -lm 端末上で以下のコマンドで実行する。班の人とmpirunコマンドを同時に実行しないようにする。 -npの後の数字で使うPCの数が決まる。つまり、-np 2だと2台,-np 1だと1台で実行される。 $ mpirun --hostfile host -np 3 ./montecarlo35 結果の見方 piがモンテカルロ法によって導き出された円周率の値で、Errorが正確な円周率の値との差が表示されている。そして、timeが求めるまでかかった時間を表す。 69. 以上で、1週目における作業は終了です。 69. 1週目のレポート課題を終える。以上で、1週目における作業は終了です。 70. 最終的に全ての作業が問題なくできたかどうかは、TAがmasterから全員のslave上で問題なく分散ネットワーク処理が実行できか確認しますので、うまくいくまで待っていてください。また、やり忘れた作業など、追加の作業の指示がTAからあった場合には、都度対応してください。 71. 組の全員の仮想マシンが無事slaveとして動作していることが確認できたら、1週目の実験自体は終了です。ただし、2週目の最初に全く同じ状況を元通りに構築する必要があるため、最後に仮想マシンを正常にシャットダウンさせる必要がありますので、下記の作業を行ってください。 72. 仮想マシンをシャットダウンします。以下のコマンドを実行します。 $ poweroff 73. VirtualBoxの仮想ウィンドウが閉じ、仮想マシンが停止状態になったのを確認したら、VirtualBoxを終了します。 74. Windowsを終了します。 1週目のレポート課題 1) マスターPCで、円周率を計算し時間を計測せよ。 1) マスターPCにリモートログインして、1台のみで、円周率を計算し時間を計測せよ。 2) マスターPCと自分のPCの2台並列で、円周率を計算し時間を計測せよ。 3) マスターPCとグループ全員のPCの並列で、円周率を計算し時間を計測せよ。 3) マスターPCとグループのPC3台(計4台並列)の並列で、円周率を計算し時間を計測せよ。 4) Mpichのプログラムを理解して、円ではなくて球による円周率を求めるプログラムに書き換えよ。 4) マスターPCと班のPC7台(計8台並列)の並列で、円周率を計算し時間を計測せよ。 5) Mpichのプログラムを理解して、円ではなくて球による円周率を求めるプログラムに書き換えよ。その後、実行せよ。 プログラムが完成したらソースコードをTAに確認してもらう。 完成したプログラムのソースコードを自分のPCに移し、レポートに含めよ。