Solaris で擬似ファイルシステムをつくろう/其の3(HDFSファイルシステム)目次†ご注意†ここで紹介しているプログラムは、カーネルモジュールを含んでいます。そのため、プログラム上に問題があった場合(可能性大)にはシステムが PANIC し、場合によってはファイルシステムに重大な障害を引き起こす可能性があります。以下のプログラムはテストプログラムで、十分な検証を行ってはいません。したがってあくまで個人の検証ためにお使いいただき、重要なシステム上では動作させないでください。本プログラムの使用により発生したトラブルなど、いかなる損害についても一切の責任を負いかねます。ご利用は自己責任にてお願いいたします。 概要†Hadoop の HDFS を Solaris 上でマウント可能にする Solaris 用のファイルシステム・モジュールとユーザモードプログラムです。
ソースファイルとダウンロード†管理の利便性からソースコードはGithub に移動いたしました。
Github へのコードの配置にともない文字コードを UTF-8 に切り替えました 動作確認済み Solaris バージョン及びプラットフォーム†このプログラムの動作確認状況は以下のようになっています。
プログラムの解説†基本的な考え方は「Solaris で擬似ファイルシステムをつくろう/其の2」の FTP ファイルシステムと同じで、このプログラムはカーネルモジュールであるファイルシステムモジュール兼仮想デバイスドライバと、Java のユーザモードプログラムで構成されています。 iumfs ファイルシステムモジュール†ファイルシステムとしての基本的な枠組みは「Solaris で擬似ファイルシステムをつくろう/其の2」と同じです。 iumfscntl デバイスドライバ†こちらも基本的には「Solaris で擬似ファイルシステムをつくろう/其の2」と同じです。 hdfsd ユーザモードデーモンプログラム†hadoop の API を使って HDFS の各データノードからファイルデータを読み込む java で書かれたプログラムです。 iumfs ファイルシステム用 mount コマンド†iumfs ファイルシステム専用の mount コマンドです。 実行環境の要件†このプログラムのコンパイル、及び実行時には以下の要件が満たされている必要があります。
(※)ここでは説明しきれないので Hadoop のセットアップ方法や動作確認方法は他のサイトの情報をご活用ください。 インストール†コンパイル&インストール†カーネルモジュールと mount コマンド†ファイルシステムモジュールのダウンロードファイルを解凍し、configure, make を実行すると環境に応じて 64bit/32bit のファイルシステムモジュール兼、擬似デバイスドライバであるiumfs モジュールと、mount コマンドが作成されます。コンパイル終了後、make install にてファイルのコピーと、ファイルシステムモジュールのカーネルへのロードが行われます。 $ cd kaizawa-iumfs-4f1da99 $ ./configure checking for gcc... no checking for cc... cc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... no checking whether cc accepts -g... yes checking for cc option to accept ISO C89... none needed checking for a BSD-compatible install... /usr/bin/ginstall -c checking for isainfo... yes configure: creating ./config.status config.status: creating Makefile $ make cd module ; make gcc -c -DPACKAGE_NAME="IUMFS" -DPACKAGE_TARNAME="iumfs" -DPACKAGE_VERSION="0.1" -DPACKAGE_STRING="IUMFS 0.1.2" -DPACKAGE_BUGREPORT="admin2@whiteboard.ne.jp" -g -O2 -Wall -DOPENSOLARIS -DSOL10 -m64 -mcmodel=kernel -mno-red-zone -D_KERNEL -I. iumfs_vfsops.c -o iumfs_vfsops.o gcc -c -DPACKAGE_NAME="IUMFS" -DPACKAGE_TARNAME="iumfs" -DPACKAGE_VERSION="0.1" -DPACKAGE_STRING="IUMFS 0.1.2" -DPACKAGE_BUGREPORT="admin2@whiteboard.ne.jp" -g -O2 -Wall -DOPENSOLARIS -DSOL10 -m64 -mcmodel=kernel -mno-red-zone -D_KERNEL -I. iumfs_vnops.c -o iumfs_vnops.o :
# make install cd module ; make install /bin/ginstall -c -m 0644 -o root -g sys iumfs /kernel/fs/amd64 /bin/ginstall -c -m 0644 -o root -g sys iumfs.conf /usr/kernel/drv :
ユーザモードデーモン†ユーザモードデーモンプログラムのダウンロードファイルにはユーザモードデーモンである hdfsd.jar ファイルが含まれていますので、そのままでも実行することができます。もし、Java コードに変更等を行って再コンパイルしたい場合には "cmd" ディレクトリで ant を実行すると Java のプログラムがコンパイルされ jar ファイルが作成されます。なお、ant 実行の際には HADOOP_HOME 環境変数が設定されている必要があります。$HADOOP_HOME は hadoop がインストールされているディレクトリです。 $ export HADOOP_HOME=/usr/local/hadoop $ export JAVA_HOME=/usr/java $ cd cmd $ ant Buildfile: build.xml compile: [javac] Compiling 12 source files to /var/tmp/hdfs/cmd/build dist: [jar] Building jar: /var/tmp/hdfs/cmd/hdfsd.jar BUILD SUCCESSFUL Total time: 2 seconds アンインストール†ファイルシステムモジュールおよびコマンドのアンインストールは make uninstall で行います。 # make uninstall
hdfs ファイルシステムが利用中(マウントされている)の場合、ファイルの削除は可能ですが、モジュールのアンロードは失敗します。この場合システムのリブート後に完全に削除されます。 使い方†hdfs ファイルシステムの利用方法についてご説明します。
既存ファイルへの追記(Append)を有効にするためには ${HADOOP_HOME}/conf/hdfs-site.xml ファイルに以下のように dfs.support.append プロパティを追記して HDFS を再起動する必要があります。 <property> <name>dfs.support.append</name> <value>true</value> </property> このプロパティを設定しないで書き込み操作をすると I/O エラー(EIO)が返されて失敗してしまいます。 $ echo aaa >> hoge -ksh: echo: write to 1 failed [I/O error hdfsd デーモンの起動†hadoop 各データノードと通信を行う hdfsd デーモンを起動します。 $ ./start-hdfsd.sh 若しくは、直接 hadoop コマンドを使って hdfsd を実行することもできます。 % ${HADOOP_HOME}/bin/hadoop -cp ${CLASSPATH} iumfs.hdfs.Main $HADOO_HOME は Hadoop がインストールされているディレクトリです。
実行例: $ hadoop -cp "./cmd/hdfsd.jar:./cmd/lib/iumfs-daemon-core-0.2.0.jar:/usr/local/hadoop/conf:\ /usr/local/hadoop/hadoop-core-1.0.2.jar" iumfs.hdfs.Main
また、java.util.Logger の設定ファイルを用意して、起動時に java.util.logging.config.file プロパティでファイルパスを指定すればデバッグ出力が得られます。Hadoop API 自体のデバッグ情報に加え、hdfsd のデバッグ情報も得られます。 デバッグ実行例: $ hadoop -Djava.util.logging.config.file=cmd/log.prop -cp "./cmd/hdfsd.jar:./cmd/lib/iumfs-daemon-core-0.2.0.jar:\ /usr/local/hadoop/conf:/usr/local/hadoop/hadoop-core-1.0.2.jar" iumfs.hdfs.Main 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Successfully open device. 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Started 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Successfully open device. 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Started 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Successfully open device. 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Started 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Successfully open device. 2012/04/30 12:10:50 iumfs.ControlDevicePollingThread run 詳細レベル (低): Started : ※ 表示の都合上、途中で改行しています。 ファイルシステムのマウント†iumfs ファイルシステムのマウントには通常の mount(1M) コマンドを利用します。 使い方: # /usr/sbin/mount -F iumfs hdfs://name_node/base_path mount_point
以下に /mnt ディレクトリに HDFS (NameNode はnamenode.example.com) 上の /user/myname ディレクトリをマウントする例を示します。 # /usr/sbin/mount -F iumfs hdfs://namenode.example.com/user/myname /mnt ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^ NameNode ベース マウントポイント マウントの確認: # /usr/sbin/mount : : /mnt on hdfs://namenode.example.com/user/myname read/write/setuid/devices/dev=91c0004 on Wed Jun 8 00:41:35 2011 可能なファイル操作†ディレクトリの移動、ディレクトリエントリの参照†$ cd /mnt/ $ /bin/ls inputs 各ファイルの属性情報の参照†$ /bin/ls -l total 3 drwxr-xr-x 1 root root 0 May 21 23:03 ./ drwxr-xr-x 1 root root 0 May 21 23:03 ../ drwxr-xr-x 1 root root 0 May 21 23:03 inputs/ ファイル属性のうち、ファイルタイプ、ファイルサイズ、ファイルの最終変更日時、あとパーミッションはオリジナルファイルの情報がそのまま反映されますが、ファイルのオーナー情報だけはリモートホスト側の実際のオーナーに関わらず常にroot:rootと表示されます。 ファイルの読み込み†$ cd inputs $ cat file1 this is file1 this is file1 this is file1 this is file1 $ ファイルのコピー†HDFS からローカルディスクへ $ cp file1 /var/tmp $ ローカルディスクから HDFSへ $ cp /etc/hosts /mnt 不可能な操作†open,creat,read,write,mkdir,rmdir,getdent,ulink,stat 以外のファイル操作はできません。hdfs ファイルシステム上のファイルに対してこれら以外の操作を行った場合はエラーが返されるか、全く無視されます。 ファイルのアクセス権の変更 $ chmod 777 file1 $ <-- エラーにはなりませんがアクセス権は変更されません ファイルの更新日時を変更 $ <-- エラーにはなりませんがファイルの更新日は変更になりません ファイルのオーナーを変更 $ chown nobody file1 $ <-- エラーにはなりませんがオーナーは root のママです。 ファイルシステムのアンマウント†hdfs ファイルシステムのアンマウントには通常の umount(1M) コマンドを利用します。 Usage: umount mount_point mount_point : ファイルシステムがマウントされているマウントポイント 他のファイルシステムでもおなじですが、だれかがそのファイルシステム上のファイルを利用中の場合には BUSY が返り、umount(1M) は失敗します。 アンマウントの成功例) # umount /mnt # ファイルシステムが利用中である為にアンマウントが失敗する例) # pwd /mnt # umount /mnt umount: /mnt 使用中です。 今後の課題†
|