hadoop下のPipes(C++でhadoopプログラム開発を行う)
6458 ワード
説明:このブログは私のCSDNブログから来ました.http://blog.csdn.net/lxxgreat/article/details/7755369
午前中の努力を経て、ついにC++版のMapReduceを偽分布モードで運行しました.この過程を紹介します.
まず条件を決めます 1.Linuxシステムではhadoop 1.0.Xバージョンが既にインストールされています(本人システムはCentOS 5.5(64ビットシステム)、hadoopバージョンは1.0.3で、他のシステムは異なるかもしれません.) 2.hadoop基本概念を理解する
二、ステップ(このステップの条件が備わっていればステップをスキップすることができる) 1.修正$HADOOP_INSTALL/confディレクトリの3つのファイルcoree-site.xml、hdfs-site.xml、mapred-site.xmlはそれぞれ以下の通りです.
<?xml version="1.0"?>
<!-- core-site.xml -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost/</value>
</property>
</configuration>
<?xml version="1.0"?>
<!-- hdfs-site.xml -->
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value><!--only one copy-->
</property>
</configuration>
<?xml version="1.0"?>
<!-- mapred-site.xml -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:8021</value>
</property>
</configuration>
2.SSHを配置する(つまり、パスワードなしで本機にアクセスし、CentOS 5でのアクセスが面倒である)【遭遇の困難1】1)システムがOpenSSHにインストールされていることを確認するserverとclientインストール手順はここでは説明しません.本稿のポイントではありません.2)本機のsshdのプロファイルを確認する(root権限が必要)$vi/etc/ssh/sshd_configでは以下の内容を見つけ、コメントを削除します. .ssh/authorized ukeyes 3) 設定ファイルを変更するとsshdサービスを再開する必要があります(root権限が必要です)$sbin/service sshd resttart 4).ssh登録システム後にテスト命令を実行します.ssh local hostリターンはパスワードを入力するように注意します.証明書がまだ生成されていませんので.公証鍵を生成するステップは、$ssh local hostは正常にログインできます.ログイン成功の情報が表示されます.失敗したら次のようなデバッグ手順を見てください.ログインに失敗したら、authorizedukeyesの権限問題があります.権限を追加します. $ chmod 600~/.ssh/authorized ukeyes 8.テストログインssh local host:(一般的には成功する!)
3.HFSファイルシステムをフォーマットする
1)命令:hadoop namenode-format
4.守護プロセス(dfsとmapred)を起動するには、前の3つのファイルを正しく設定する必要があります.そうでないとエラーが発生しやすいです.
$ start-dfs.sh $ start-mapred.sh
5.CPPファイルの作成、ソースは以下の通りです.
#include <algorithm>
#include <limits>
#include <stdint.h>
#include <string>
#include "hadoop/Pipes.hh"
#include "hadoop/TemplateFactory.hh"
#include "hadoop/StringUtils.hh"
class MaxTemperatureMapper : public HadoopPipes::Mapper {
public:
MaxTemperatureMapper(HadoopPipes::TaskContext& context) {
}
void map(HadoopPipes::MapContext& context) {
std::string line = context.getInputValue();
std::string year = line.substr(15, 4);
std::string airTemperature = line.substr(87, 5);
std::string q = line.substr(92, 1);
if (airTemperature != "+9999" &&
(q == "0" || q == "1" || q == "4" || q == "5" || q == "9")) {
context.emit(year, airTemperature);
}
}
};
class MapTemperatureReducer : public HadoopPipes::Reducer {
public:
MapTemperatureReducer(HadoopPipes::TaskContext& context) {
}
void reduce(HadoopPipes::ReduceContext& context) {
int maxValue = INT_MIN;
while (context.nextValue()) {
maxValue = std::max(maxValue, HadoopUtils::toInt(context.getInputValue()));
}
context.emit(context.getInputKey(), HadoopUtils::toString(maxValue));
}
};
int main(int argc, char *argv[]) {
return HadoopPipes::runTask(HadoopPipes::TemplateFactory<MaxTemperatureMapper,
MapTemperatureReducer>());
}
6.Makefileファイルのソースコードは以下の通りです.CC = g++
CPPFLAGS = -m64 -I$(HADOOP_INSTALL)/c++/$(PLATFORM)/include
max_temperature: max_temperature.cpp
$(CC) $(CPPFLAGS) $< -Wall -L$(HADOOP_INSTALL)/c++/$(PLATFORM)/lib -lhadooppipes -lcrypto -lhadooputils -lpthread -g -O2 -o $@
7.gcc、g++、標準Cライブラリを設置する.gcc,g++ステップ1をインストールします.ソフトウェアの更新元の更新方法は以下の通りです.まずyumソースの設定ディレクトリcd/etc/yum.repos.dに入ります.
バックアップシステムはyumソースmv CentOS-Base.repo CentOS-Base.repo.saveを持参しています.
他のより速いyumソースsudo wgetをダウンロードします. http://centos.ustc.edu.cn/CentOS-Base.repo sudo wget http://mirrors.163.com/.help/CentOS-Base-163.repo sudo wget http://mirrors.sohu.com/help/CentOS-Base-sohu.repo
yumソースを更新したら、すぐに操作が有効になるように更新してください.
2)gccess do yum install gcc-yをインストールします.
3)g++(sudo yum install g++報告書がg++カバンを見つけられませんでした.このカバンの名前はgcc-c+.完全にsudoyum install gcc-c+)sudoyum install gc+-yです.
4)標準Cライブラリの設置
sudo yum install glibc-devel-y
8.opensslをインストールし、コマンドは以下の通りです.
cd/usr/local/src sudo tar zxvf openssl-09.8 l.tar.gzsudo cd openssl-09.8.lsud./config スドメーク make install sudo cp libcrypt.a/usr/local/libsudo cp libssl.a/usr/local/lib
9.ソースファイルをコンパイルする、すなわちmaxmutemperature.cpp
1)環境変数を設定する:exoprt PLATFORM=Linux-amd 64-64
2)maxemperature.cppのディレクトリでmakeコマンドを実行します.
10.ファイルをHFSにアップロードする
1)ローカルで実行可能なファイルをアップロードするmaxemperatureからHFSまでのbin/maxemperatureディレクトリの下:hadoop fs-put maxature bin/maxautemperature
2)データをHFSにアップロードする:hadoop fs-put sample.txt sample.txt
3)sample.txtの内容は以下の通りです.
0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9+00001+99999999999
0043011990999991950051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+00221+99999999999
0043011990999991950051518004+68750+023550FM-12+038299999V0203201N00261220001CN9999999N9-00111+99999999999
0043012650999991949032412004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+01111+99999999999
0043012650999991949032418004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+00781+99999999999
11.hadoop pipesコマンドを使って作業を実行します.コマンドは以下の通りです.hadoop pipes-D hadoop.pipes.java.recodreader=true-D hadoop.pipes.java.recordwriter=true-input sample.txt-output upt-program bin/maxture
12.作業実行結果を確認する:
hadoop fs-cat output/*
結果が
1949 1111950 22
上記11項目の設定が正しいことを示します.