Windows10のディスクアクセス負荷が高い場合の対処

Windows10が妙に重たいので調べてみた。

タスクマネージャーでパフォーマンスの項目を見ると、Cドライブのアクティブな時間がほぼ100%になっており、平均的な応答時間に数千msかかっている状態になっている。C:に使用しているHDDが低速だと、このような状態になりやすい。このような症状はCPU負荷はそれほど高くないので原因の特定が難しい。
Windows10_disk_busy

この場合、実は意外なところの設定でディスクへのアクセス負荷が大きく下がる。スタートメニューから設定→パーソナル設定→色にある「背景からアクセントカラーを選ぶ」「スタート、タスクバー、アクションセンターに色をつける」「スタート、タスクバー、アクションセンターを透明にする」のトグルスイッチをオン→オフに切り替えるとディスクアクセス負荷が驚くほど下がる。
windows10_color_config

もし古いパソコンにWindows10をインストールして使用しているのであればお試しあれ。

Visual Studio 2015でSQLiteを参照できない

Visual Studio 2015でNuGetパッケージの管理からSystem.Data.SQLiteを選択してインストールした場合、インストール自体はエラーを出さずに正常終了するが、実際にはインストールできていない。Visual Studio 2015のサーバーエクスプローラー等のデータベースマネージャに関する仕様が公開されなかったため、System.Data.SQLiteのVisual Studio 2015対応が遅れたことが事が原因。
Visual Studio 2013で作成したプロジェクトでSQLiteを参照設定している場合、System.Core等も含む、参照設定しているコンポーネント全てで「参照コンポーネント~が見つかりませんでした。」というエラーが表示される。
System.Data.SQLite Downloadsからsqlite-netFx46-setup-bundle-x86-2015-1.0.98.0.exeをダウンロードしてインストールすれば使用できるようになる。
Visual Studio 2013で作成したプロジェクトでSQLiteを参照設定している場合は、NuGetパッケージの管理からSQLite関連のNuGetパッケージをアンインストールしてから、sqlite-netFx46-setup-bundle-x86-2015-1.0.98.0.exeでインストールしたSQLite関連DLLを参照するように設定すればよい。

SymmetricDSで日本語の使えない機能

SQL Server 2000とSQL Server 2012のデータ連係(SymmetricDS)で日本語を使えると書いたが、機能しない機能も見つかってきたので覚書。

同期条件の指定(Sync On ~ Condition)

SYM_TRIGGERテーブルのSYNC_ON_UPDATE_CONDITION、 SYNC_ON_INSERT_CONDITION、 SYNC_ON_DELETE_CONDITIONには日本語カラム名を含む条件式を指定できない。SYNC_ON_~_CONDITIONは同期対象のカラムを限定する制約条件を指定する事の出来るパラメーターだが、日本語を含むカラム名をしていすると、トリガーの登録時にエラーログにカラムが見つからない旨のエラーが記録される。
これはSymmetricDSのサンプルにおいても使われている機能です。サンプルも一部動かないので気を付けよう。

SQL Server 2000からSQL Server 2012への移行

レガシーマイグレーションというほどでは無いが、古いWindows 2003 ServerをWindows 2012 Serverに移行するにあたって覚え書き。

SQL Server 2000のデータベースをSQL Server 2012でマウントする事は出来ません。SQL SerSQL Server 2005のデータベースをSQL Server 2014でマウントする事は出来ません。したがってSQL Server 2000や2005から互換性がないSQL Serverにデータを移行するには、いったんSQL Server 2008を経由する必要があります。

SQL Serverのデータフォルダ(既定では%PROGRAM FILES%¥Microsoft SQL Server¥MSSQL¥Data)にあるMDFファイルとLDFファイルをSQL Server 2008の環境にコピーします。

SQL Server 2008上でコピーしたMDFファイルとLDFファイルをアタッチしてデータベースを起動します。

互換性レベルが80(SQL Server 2000)ないし90(SQL Server 2005)になっているので、100(SQL Server 2008)に変更します。これで先ほどアタッチしたMDFファイルとLDFファイルのバージョンが上がります。

SQL Server 2008上のMDFファイルとLDFファイルを、移行先となるSQL Server 2012またはSQL Server 2014にコピーしてアタッチします。

最終移行先となるSQL Server上で再び互換性レベルを変更します。110(SQL Server 2012)または120(SQL Server 2014)に変更します。

以上でデータの移行は完了。

念のために移行後のデータベースに「DBCC CHECKDB(~)」をかける。変換時に不整合が発生したり、互換性の無い機能が含まれていて問題になることもある。もしエラーになるなら、速やかに修正する。

データのインポートおよびエクスポートウィザードを使用する方法考えられるが、SQL Server Native Clientなどでは接続できないため、OLE DB Providerやフラットファイルソースを使用する事になる。この場合テーブル自体はインポートできるが、テーブルに付属するインデックス情報や制約情報、ビュー、ストアドプロシージャなどは取込むことが出来ない。テーブルデータ以外は別途SQL文として取得して、移行先のSQL Serverで実行することになる。手間を考えるとデータベースのバイナリファイルを直接移動する方が良いと思う。

SQL Server 2000とSQL Server 2012のデータ連係(SymmetricDS)

せめてSQL Server 2005とSQL Server 2012であればリプリケーションを使って、片側のデータベースに対する更新を、もう片方のデータベースに反映して同期を取ることも出来るのだけど・・・と、良い方法を探していたところSymmetricDS(http://www.symmetricds.org/)というリプリケーションツールを見つけた。

SymmetricDSはJava SE6以上が動作するOSで、JDBCで接続可能なデータベース間であれば、およそ殆どの異なるアーキテクチャ間のDBを双方向にリプリケーション出来る優れものです。SQL Server 2000でも動作するはずなので、今回の用途にはぴったりです。さっそく試験環境を作成してテストしてみましょう。

1.SymmetricDSのインストール

1.1.SymmetricDSのダウンロード

SymmetricDSのホームページからzipファイルをダウンロードして、インストール先に解凍します。ここではC:\App\symmetricに解凍することにします。

1.2.ルートノードの設定ファイルを作成する

データベースへの接続設定を作成します。データベースへの接続に関する設定はC:\App\symmetric\enginesに保存します。C:\App\symmetric\samplesからcorp-000.propertiesを複製して設定します。今回はrootnode.propertiesという名称にします。

engine.nameには任意の名称を指定します。今回はrootnodeとします。

db.driverにはJDBCドライバの名称を指定します。デフォルトではH2 Databaseが指定されているので、これをコメントにしてnet.sourceforge.jtds.jdbc.Driverのコメントを外します。

db.urlには同期するデータベースへの接続文字列を指定します。デフォルトではH2 Databaseが指定されているので、これをコメントにしてjdbc:jtds:sqlserver://localhost:1433/rootdb;useCursors=true;bufferMaxMemory=10240;lobBuffer=5242880;に変更します。rootdbはデータベース名ですが、ここには日本語を指定できません。

db.userにはデータベースへのログインIDを指定します。本来はSymmetricDS用にアカウントを作るべきですが、今回はsaを指定しておきます。

db.passwordには先のログインIDで使用するパスワードを指定します。

sync.urlには同期に使用するHTTP URLを指定します。ここではhttp://localhost:31415/sync/rootnodeと指定します。sync移行に続く文字列はengine.nameで指定した文字列と一致しなくてはなりません。

group.idとexternal.idは、SymmetricDS上でデータベースを一位に識別するためのIDを指定します。ここではgroup.idをrootnode、external.idを000としておきます。

他にもパラメータがありますが、そのままにしておきます。

engine.name=rootnode

# The class name for the JDBC Driver
...#db.driver=org.h2.Driver
db.driver=net.sourceforge.jtds.jdbc.Driver

# The JDBC URL used to connect to the database
...
#db.url=jdbc:h2:corp;AUTO_SERVER=TRUE;LOCK_TIMEOUT=60000
db.url=jdbc:jtds:sqlserver://localhost:1433/rootdb;useCursors=true;bufferMaxMemory=10240;lobBuffer=5242880;

# The user to login as who can create and update tables
db.user=sa

# The password for the user to login as
db.password=xxxxxx

registration.url=
sync.url=http://localhost:31415/sync/rootdb

# Do not change these for running the demo
group.id=rootnode
external.id=000

1.3.同期対象となるノードの設定ファイルを作成する

データベースへの接続設定を作成します。データベースへの接続に関する設定はC:\App\symmetric\enginesに保存します。C:\App\symmetric\samplesからstore-000.propertiesを複製して設定します。今回はsubnode-000.propertiesという名称にします。

engine.nameには任意の名称を指定します。今回はsubnode-001とします。

db.driverにはJDBCドライバの名称を指定します。ルートノードと同じくデフォルトではH2 Databaseが指定されているので、これをコメントにしてnet.sourceforge.jtds.jdbc.Driverのコメントを外します。

db.urlには同期するデータベースへの接続文字列を指定します。ルートノードと同じくデフォルトではH2 Databaseが指定されているので、これをコメントにしてjdbc:jtds:sqlserver://localhost:1433/subdb01;useCursors=true;bufferMaxMemory=10240;lobBuffer=5242880;に変更します。

db.userにはデータベースへのログインIDを指定します。本来はSymmetricDS用にアカウントを作るべきですが、今回はsaを指定しておきます。

db.passwordには先のログインIDで使用するパスワードを指定します。

registration.urlにはルートノードsync.urlの値を指定します。ここではhttp://localhost:31415/sync/rootnodeと指定します。

group.idとexternal.idをルートノードと同様に設定します。ここではgroup.idをsubnode、external.idを001としておきます。

他にもパラメータがありますが、そのままにしておきます。

engine.name=subnode-001

# The class name for the JDBC Driver
...#db.driver=org.h2.Driver
db.driver=net.sourceforge.jtds.jdbc.Driver

# The JDBC URL used to connect to the database
...
#db.url=jdbc:h2:corp;AUTO_SERVER=TRUE;LOCK_TIMEOUT=60000
db.url=jdbc:jtds:sqlserver://localhost:1433/subdb01;useCursors=true;bufferMaxMemory=10240;lobBuffer=5242880;

# The user to login as who can create and update tables
db.user=sa

# The password for the user to login as
db.password=xxxxxx

registration.url=http://localhost:31415/sync/rootdb

# Do not change these for running the demo
group.id=subnode
external.id=001

1.4.ルートノードに制御テーブルを作成する

次のコマンドを実行してルートノードのデータベースに制御テーブルを作成します。これによりデータベースにsym~で始める各種テーブルが作成されます。制御テーブルは別のデータベースに作りたいと思うかもしれませんが、ルートノードで指定したデータベース以外の場所に作ることはできないようです。

bin\symadmin --engine rootnode create-sym-tables

続いてデータベース間の同期方法に関する設定を、上記コマンドで作成されたテーブルにINSERTします。

--既存の設定を削除。sym_channelには既定のテーブルがあるので、作成したものだけ削除するようになっています。
delete from sym_trigger_router;
delete from sym_trigger;
delete from sym_router;
delete from sym_channel where channel_id in ('tblcopy');
delete from sym_node_group_link;
delete from sym_node_group;
delete from sym_node_host;
delete from sym_node_identity;
delete from sym_node_security;
delete from sym_node;

--テーブルのコピーに使用するチャンネルを作成。
--同期でエラーが発生すると、同じチャンネルを使用しているその他の複製処理もエラーが回復するまで待たされます。
--エラーが発生しても並列して複製処理を行いたい場合には、チャンネルを複数作成します。
insert into sym_channel (channel_id, processing_order, max_batch_size, enabled, description)
values('tblcopy', 1, 100000, 1, 'Copy Sample Table');

insert into sym_node_group (node_group_id) values ('rootnode');
insert into sym_node_group (node_group_id) values ('subnode');

insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action) values ('rootnode', 'subnode', 'W');
insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action) values ('subnode', 'rootnode', 'P');

--複製の対象テーブルや複製を開始する判断条件を指定します。
--ここではワイルドカードで全てのテーブルを複製するように指定して、それ以外の項目は規定値にしています。
insert into sym_trigger
(trigger_id,source_table_name,channel_id,last_update_time,create_time)
values('tblcopy','*','tblcopy',current_timestamp,current_timestamp);

--複製の方向の指定と、複製するデータのフィルタ条件を指定します。
--複製する条件はdefaultとして全てを複製するように指示しています。
insert into sym_router (router_id,source_node_group_id,target_node_group_id,router_type,create_time,last_update_time)
values('root_2_sub', 'rootnode', 'subnode', 'default',current_timestamp, current_timestamp);
insert into sym_router (router_id,source_node_group_id,target_node_group_id,router_type,create_time,last_update_time)
values('sub_2_root', 'subnode', 'rootnode', 'default',current_timestamp, current_timestamp);

--sym_triggerとsym_routerを関連付けています。
insert into sym_trigger_router
(trigger_id,router_id,initial_load_order,last_update_time,create_time)
values('tblcopy','root_2_sub', 100, current_timestamp, current_timestamp);

--ノードの登録を行います。
insert into sym_node (node_id,node_group_id,external_id,sync_enabled,sync_url,schema_version,symmetric_version,database_type,database_version,heartbeat_time,timezone_offset,batch_to_send_count,batch_in_error_count,created_at_node_id)
values ('000','rootnode','000',1,null,null,null,null,null,current_timestamp,null,0,0,'000');
insert into sym_node (node_id,node_group_id,external_id,sync_enabled,sync_url,schema_version,symmetric_version,database_type,database_version,heartbeat_time,timezone_offset,batch_to_send_count,batch_in_error_count,created_at_node_id)
values ('001','subnode','001',1,null,null,null,null,null,current_timestamp,null,0,0,'000');

insert into sym_node_security (node_id,node_password,registration_enabled,registration_time,initial_load_enabled,initial_load_time,created_at_node_id)
values ('000','5d1c92bbacbe2edb9e1ca5dbb0e481',0,current_timestamp,0,current_timestamp,'000');
insert into sym_node_security (node_id,node_password,registration_enabled,registration_time,initial_load_enabled,initial_load_time,created_at_node_id)
values ('001','5d1c92bbacbe2edb9e1ca5dbb0e481',1,null,1,null,'000');

--ルートノードのnode_idを指定します。ルートノードは1つだけ作成します。
insert into sym_node_identity values ('000');

1.5.SymmetricDSを起動する

次のコマンドを実行してSymmetricDSを起動します。

bin\sym

正常に起動した場合、sym_~で指定したテーブルや、rootdbにある同期対象のテーブルがsubdb01に複製されデータの同期が開始されます。

2.その他TIPSなど

2.1.日本語への対応

日本語で作成したテーブル名やフィールド名があっても正常に動作しているようです。
ただしデータベース名に日本語を使用する場合はdb.urlで指定することができないので、データベースで使用するユーザーアカウントの既定のデータベースでデータベース名を指定する等の対応が必要になります。

2.2.設定に誤りがあった場合の訂正

設定に誤りがあった場合、テーブルを直接書き換えても認識して動作が変わるのですが、各テーブルに作成された中間データとの整合性が取れなくなる場合があるようで、設定が反映されない場合があります。この場合は”bin/symadmin –engine uninstall”のコマンドを実行して制御テーブルを削除し、あらためて作り直した方がよいです。

2.3.Microsoft製JDBCドライバの使用

Microsoft製JDBCドライバでも問題なく動作しています。
ただしSymmetricDSの開発サイドではjtdsのドライバを使用して動作確認しているとの事なので、そちらを利用したほうがよいでしょう。

Recovery ServiceでCentOSを復元するとSSHが繋がらない

Microsoft AzureのRecovery ServiceでCentOSを復元したところ、SSHに接続できなくなった。復元後最初の起動時には問題なく接続できるのだが、仮想マシンを再起動するとSSHの認証を通らなくなる。

かなり肝を冷やしたのだが、原因はSSHでパスワード認証を使用していた事と、復元後の再起動時にsshの設定ファイルが初期化されてしまう事にある。sshの設定ファイル(ssh_config)が初期化されることでパスワード認証によるログインが無効にされていた。

次のようなコマンドでRSA公開鍵を使った認証を行うように設定変更して対応した。

$ ssh_keygen -t rsa
$ cd .ssh
$ cat id_rsa.pub >> authorized_keys

もちろんssh_configを編集してPasswordAuthenticationのコメントを解除し、再びパスワードによる認証を有効にしても良いが、今回は再発の可能性を考慮してRSA公開鍵を使った認証に設定を変更した。

Azure上のUbuntuにスワップファイルを追加する

gem updateの途中でメモリ不足によりアップデートを継続出来ないことがあったので、Ubuntuにメモリスワップを追加することにしました。Azure上のUbuntuは標準設定では仮想メモリを使用しないので、仮想マシンのサイズをA0とか小さいサイズにしていると、容易にメモリ不足に陥ります。

Microsoft Azure上のLinux仮想マシンにスワップファイルを追加するには/etc/waagent.confの次の3ヶ所をを変更します。

# Format if unformatted. If 'n', resource disk will not be mounted.
ResourceDisk.Format=y

# Create and use swapfile on resource disk.
ResourceDisk.EnableSwap=y

# Size of the swapfile.
ResourceDisk.SwapSizeMB=2048

この後、仮想マシンを再起動すると自動的にスワップ領域が確保されて、仮想メモリが有効になります。sudo swapon -sとかfreeコマンドを叩いて確認してください。

ちなみにResourceDisk.SwapSizeMBは無暗に大きくしないでください。私は最初に4096MBを指定して再起動したのですが、エラーになってしまいスワップ領域が作られませんでした。

waagentは/var/log/waagent.logにログを出力しているので見てみます。

$ more /var/log/waagent.log
2015/06/06 07:39:11 Finished processing ExtensionsConfig.xml
2015/06/06 07:55:02 ERROR:CalledProcessError. Error Code is 1
2015/06/06 07:55:02 ERROR:CalledProcessError. Command string was mkswap /mnt/swapfile
2015/06/06 07:55:02 ERROR:CalledProcessError. Command result was mkswap: error: /mnt/swapfile is mounted; will not make swapspace
2015/06/06 07:55:03 ERROR:CalledProcessError. Error Code is 255
2015/06/06 07:55:03 ERROR:CalledProcessError. Command string was swapon /mnt/swapfile
2015/06/06 07:55:03 ERROR:CalledProcessError. Command result was swapon: /mnt/swapfile: swapon failed: Device or resource busy
2015/06/06 07:55:03 ERROR:ActivateResourceDisk: Failed to activate swap at /mnt/swapfile

mkswapコマンドで失敗したために、以降の処理が全部エラーになってしまったようです。仕方ないので手動でマウント操作を実施します。

sudo chmod 600 /mnt/swapfile
sudo mkswap /mnt/swapfile
sudo swapon /mnt/swapfile

以上の操作で仮想メモリが有効になります。試しに次のコマンドを実行してみます。

$swapon -s
Filename Type Size Used Priority
/mnt/swapfile file 3000208 2068 -1

$ free
total used free shared buffers cached
Mem: 684468 552240 132228 3412 24496 243612
-/+ buffers/cache: 284132 400336
Swap: 3000208 2004 2998204

・・・が、swapsizeが約3GBほどになっています。もしかして・・・というわけで、ResourceDisk.SwapSizeMBを2048に変更して再起動すると、今度は正常にスワップファイルが作られました。

gem updateでrmagick-2.15.1のインストールに失敗する

Ubuntuのgem updateでrmagick-2.15.1のインストールに失敗した場合の対処法。

gem updateを実行すると次のようなエラーが表示される。

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.

Provided configuration options:
 --with-opt-dir
 --without-opt-dir
 --with-opt-include
 --without-opt-include=${opt-dir}/include
 --with-opt-lib
 --without-opt-lib=${opt-dir}/lib
 --with-make-prog
 --without-make-prog
 --srcdir=.
 --curdir
 --ruby=/usr/bin/ruby2.1

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.1.0/gems/rmagick-2.15.1 for inspection.
Results logged to /var/lib/gems/2.1.0/extensions/x86_64-linux/2.1.0/rmagick-2.15.1/gem_make.out
Gems updated: rmagick

指示されたとおりにgem_make.outを閲覧する。

/usr/bin/ruby2.1 extconf.rb
checking for gcc... yes
checking for Magick-config... no
checking for pkg-config... no
Can't install RMagick 2.15.1. Can't find Magick-config or pkg-config in /usr/loc
al/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.

Provided configuration options:
 --with-opt-dir
 --without-opt-dir
 --with-opt-include
 --without-opt-include=${opt-dir}/include
 --with-opt-lib
 --without-opt-lib=${opt-dir}/lib
 --with-make-prog
 --without-make-prog
 --srcdir=.
 --curdir
 --ruby=/usr/bin/ruby2.1

extconf failed, exit code 1

「Can’t install RMagick 2.15.1. Can’t find Magick-config or pkg-config」とあるので、rmagicをインストールすれば良いのかな・・・と思うけど、Ubuntuではパッケージの名前が全然違うので、libmagickwand-devをインストールする必要がある。

sudo apt-get install libmagickwand-dev
sudo gem update

これで正常にインストールが完了する。

Microsoft Azure上のUbuntuにHadoopをインストール

1.仮想ネットワーク(Azure Private Network)の構築

1.1.仮想ネットワークの新規作成

Sparkのノードをインターネットからアクセス可能な場所に設置するわけにもいきませんので、最初に仮想ネットワーク(Azure Private Network)を構築します。

新規→仮想ネットワーク→カスタム作成を選択して、適当に名前を設定します。
vpn1
“ポイントからサイト間VPNの構築”にチェックして次へ。
vpn2
ここは変更なし。vpn4
“ゲートウェイサブネットを追加”をクリックしてデフォルト設定のゲートウェイサブネットを追加して確定。vpn3

1.2.証明書の作成と登録

続いてルート証明書を作成します。Windowsには標準では証明書を作成する機能がないため、オープンソースのツールを使ったり、開発用のツールを使ったりして証明書を作成することになります。ここではVisual Studio 2013に付属する開発ツールを使用してルート証明書を作成します。まずは”C:¥Program Files¥Microsoft Visual Studio 12.0¥Common7¥Tools¥Shortcuts”にある”開発者コマンド プロンプト for VS2013″を開いてコマンドプロンプトを表示します。そして次のコマンドを実行して下さい。”SparkVirtualPrivateNetwork”の所は適当な名称に置換えて下さい。

makecert -sky exchange -r -n "CN=SparkVirtualPrivateNetwork" -pe -a sha256 -len 2048 -ss My "SparkVirtualPrivateNetwork.cer"

“SparkVirtualPrivateNetwork.cer”と言うファイルが出来上がります。これを証明書にアップロードします。
次にクライアント証明書を作成します。次のコマンドを実行します。
“ClientCertificateName”は適当な名称に置換えて下さい。

makecert -n "CN=ClientCertificateName" -pe -sky exchange -m 96 -ss My -in "SparkVirtualPrivateNetwork" -is my -a sha256

登録されている証明書を確認します。コマンドプロンプトから”certmgr.msc”を実行します。最初に”信頼されたルート証明機関”の”証明書”に先ほど作成したSparkVirtualPrivateNetworkが登録されているか、”個人”の”証明書”に”ClientCertificateName”が登録されているか確認します。
もしmakecertを実行した以外の環境から仮想ネットワークに接続する場合は、先ほど作成したSparkVirtualPrivateNetworkとClientCertificateNameを登録する必要があります。makecertを実行した環境で、それぞれの証明書の秘密鍵をエクスポートして、新たな環境にてインポートします。

1.3.VPNクライアントのインストール

仮想ネットワークのダッシュボードからクライアントVPNパッケージをダウンロードしてきてインストールします。インストールするとコントロールの”ネットワークと共有センター”に仮想ネットワークへの接続が追加されるので、接続を実行します。このとき使用する証明書を聞いてくるので、先ほど作成したClientCertificateNameを選択して下さい。

2.Apatch Hadoopのインストール

Apatch Sparkを動作させるには、その前にApatch Hadoopを動作させておく必要があります。
と言うわけでUbuntu 14.10の仮想マシンが起動している所から作業をスタートします。

2.1.スタンドアローンで動作する所まで…

hadoopの動作にはJavaが必要になります。OpenJDKでも問題なく動作するそうなので、標準のOpenJDKをインストールしていきます。

sudo apt update
sudo apt upgrade
sudo apt-get install -y default-jdk

最新版のhadoopをダウンロードしてきて展開します。

wget http://ftp.tsukuba.wide.ad.jp/software/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
tar xvfx hadoop-2.6.0.tar.gz

“/etc/profile”を編集して展開したhadoopへのパスを設定します。

...
export PATH=/<展開したディレクトリ>/hadoop-2.6.0/bin:$PATH
...

“hadoop-2.6.0/etc/hadoop/hadoop-env.sh”を編集してJAVA_HOMEのパスを設定します。

...
# set to the root of your Java installation
export JAVA_HOME=/usr/lib/jvm/default-java
...

この時点でスタンドアロンモードでhadoopが動作します。試しに”hadoop”とコマンドを打ってみて下さい。hadoopコマンドが起動するなら、先の設定へと進んでいきましょう。

2.2.疑似分散(Pseudo-Distributed)モードで動作する所まで…

今度は”ssh localhost”とコマンドを打って下さい。hadoopはノード間の接続にsshを使用します。もし”ssh localhost”で接続できないなら、sshがパスワードなどを入力しなくても繋がるように証明書を作成します。

ssh localhost
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

hadoop-2.6.0/etc/hadoop/core-site.xmlを編集します。
“hadoop.tmp.dir”で指定している”/var/opt/hadoop-2.6.0/cash”はhadoopが生成するファイルの保存先となるディレクトリです。デフォルトでは”/tmp”以下に保存されるために、OSを再起動すると全ての設定やHDFSに格納したデータが失われます。



...


        hadoop.tmp.dir
        /var/opt/hadoop-2.6.0/cash
        fs.defaultFS
        hdfs://localhost:9000


hadoop-2.6.0/etc/hadoop/hdfs-site.xmlを編集します。



...


        dfs.replication
        1


次のコマンドを実行して、HDFS(Hadoop Distributed File System)のnamenodeを初期設定します。

hdfs namenode -format

次のコマンドを実行して、hadoopのデーモンを起動します。

hadoop-2.6.0/sbin/start-dfs.sh

MapReduceで使用するユーザーディレクトリを作成します。

hadoop fs -mkdir /user
hadoop fs -mkdir /user/

最後にサンプルプログラムを実行して、hadoopが疑似分散(Pseudo-Distributed)モードで動作する事を確認します。

cd hadoop-2.6.0
hadoop fs -put etc/hadoop input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
hadoop fs -cat output/*

2.3.YARN(Pseudo-Distributed)モードで動作する所まで…

“etc/hadoop/”フォルダにある”mapred-site.xml.template”を”mapred-site.xml”にコピーして編集します。

cd etc/hadoop/
cp mapred-site.xml.template
mapred-site.xml

mapreduce.framework.nameにはhadoop




          mapreduce.framework.name
          yarn


再び同じようにサンプルプログラムを実行するとyarn上で動作します。

cd hadoop-2.6.0
hadoop fs -put etc/hadoop input
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
hadoop fs -cat output/*

3.雑記

本当はSprkを動作するところまで行きたかったのだけど、思った以上に面倒で挫折。Sparkの機能であるSparkSQLを動作させるにはHiveのインストールが必要で、Hiveをちゃんと動作させるにはMySQLが必要で・・・。CDHやMapR、HDPの有用性を改めて思い知ったのでした。
というわけで、次はCDHをベースにして再スタートしようと思う。でもきっとこの経験は無駄にはならないと思うんだ。CDHを構成する過程で、Hadoopの知識は再び要求されるはずだしね。