Datanodeのエラー:Initialization failed for block pool Block pool BP-xxxxxxx
久しぶりのHadoopクラスタ構築で出てきたエラー。
DataNodeを起動しようとするとログに下記のエラーが吐かれて勝手にシャットダウンしてしまう。
FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool BP-<<ユニーク値>> (storage id DS-<<ユニーク値>>) service to <<ドメイン名>>/<<IPアドレス>>:<<ポート>>
エラーの内容はBlock poolを初期化できませんでしたよ、という内容。
Hadoopが生成する"current"ディレクトリ配下のVERSIONファイルがおかしいのかと思ってみてみるが、
特におかしい所は無い。
何が原因なのか悩んだあげく、結論としては/etc/hostsファイルにドメインが記載されていなかった。
vim /etc/hosts
でhostsファイルにドメインを記載してやったら解決。
DNSで名前解決は出来ている状態になっていたのだが、Hadoopはhostsでしっかり記載してやらないと予期せぬエラーが起きる事がある。以前も同じ原因で別のエラーが出た事があった。
もし、何か理不尽なエラーが出る事があったら/etc/hostsを確認してみるといいかもしれない。
文字列の合成と評価させる方法
R言語に限らず、ループカウンタ等の変数を使って文字列を作りたい事がある。
Rでのやり方は簡単。paste関数を使うだけ。
i=1 paste("hoge",i,"hoge") #-> "hoge 1 hoge"
単純に繋ぎたいオブジェクトを「,」区切りで渡せば良い。
デフォルトだと、スペースが区切り文字として入ってしまうため、
i=1 paste("hoge",i,"hoge",sep="") #-> "hoge1hoge"
このようにsepプションで区切り文字を無しに指定すると、そのままつながる。
ちなみに、paste関数で生成された文字列は単なる文字列として扱われるため、
例えば既存のオブジェクトと同じ名前を作ったとしても評価されない。
オブジェクトとして評価させたい場合は,eval(parse(text=...))を使う。
tmp = "success" eval(parse(text=paste("t","m","p",sep=""))) #-> "success"
これでオブジェクトとして認識されます。
パスワードジェネレータpwgenをUbuntuで使う
CentOSなどではmkpasswdが使えると思うんだけど、ubuntuには無いようだ。
調べたところpwgenというのが一般的らしい。
まずはインストール
$ sudo apt-get install pwgen
インストール完了。簡単な使い方は
# 5文字のパスワードを1つ表示 $ pwgen 5 1 yaCh9
パスワードの長さを変えたい時は第一引数をかえれば良い。
デフォルとだと、英数字大文字小文字の集合ができるようだ。
ちなみによく使いそうなオプションはこちら。
オプション | 効果 |
---|---|
-s | ランダムに生成する。デフォルトでは「覚えやすい」物を出力する。 |
-B | 紛らわしい文字を使わない。1とlのような。 |
-y | 記号を含める。 |
-0 | 数字を含めない。 |
-A | 大文字を含めない。 |
-h | ヘルプを表示。 |
read.tableでのfactor型生成を防ぐ方法
read.tableは各種の外部データを読み込んでくれる非常に便利な関数だが、
そのまま使うと、Factor型で読み込みが行なわれてしまう。
今までFactorで読み込んだ後文字列に直していたが、
読み込むときにオプションをつければその手間は防げる事に今更気づいた。
例えば、Tabで区切られたtxtデータを読み込む際には、
read.table("xxx.txt"sep="¥t",stringsAsFactors=F)
のように
stringsAsFactors
をFALSEにしてやれば文字列として読み込みを行なってくれる。
UbuntuでR:その2~作業ディレクトリの行方~
引き続きUbuntuでRを動かしてみる。作業ディレクトリで少しはまった。
まずはRを起動。起動時のカレントディレクトリは/home/ubuntu/
# ubuntuという名前のユーザで作業。
$ pwd
/home/ubuntu
$ R
これでRが起動された。csvを読み込む。
stocklist.t1 <- read.csv("tosho-1.csv") # tosho-1.csvは東証1部の株式コード一覧。 ls() [1] "stocklist.t1"
csvが読み込まれているので、このまま終了。
q() Save workspace image? [y/n/c]: y
これで.RDataが作られて作業スペースが保存されているはず。
同じディレクトリでRを起動すると、ちゃんと作業スペースが自動で読み込まれていた。
ただし、カレントディクトリを変更してRを起動すると読み込まれない。
作業ディレクトリはどうなっているのか確認してみる。再び/home/ubuntuでRを起動。
getwd() [1] "/home/ubuntu"
/home/ubuntu配下の.RDataが読み込まれ、/home/ubuntuが作業ディレクトリに。
.RDataと.RHistoryを削除して再度やってみる。
getwd() [1] "/home/ubuntu"
消してからやっても結果は同じ。
どうやらカレントディレクトリ配下の.RDataを探しに行って、.RDataが無い時はカレントディレクトリをデフォルトの作業ディレクトリとして認識するようだ。
どこからでも同じ作業ディレクトリで起動したいのであれば環境変数なりで調整する必要がありそう。
UbuntuでR:その1~文字コードの変換~
今までWindowsでしかRは使っていなかったけれども、Ubuntuでも使用してみる。
Rパッケージインストール時に他のコンポーネントをインストールしなくてはいけなかったりする。
これは細かいお話の一つだが、Windowsで扱っていたcsvファイルをそのまま読み込もうとすると。
read.csv("xxx.csv")
エラー。
Error in make.names(col.names, unique = TRUE) : invalid multibyte string at '<93><fa><95>t'
恐らく文字コードの問題。
真っ新な環境のため変換ツールも入っていない。nkfをインストール。
$ sudo apt-get install nkf
インストール完了。UTF-8に変換。
$ nkf -w8 --overwrite xxx.csv
上書きしてUTF-8に変換。もう一度Rで読み込んでみる。
read.csv("xxx.csv")
(表示は省略)無事読み込めた。