前言:hadoop用於解決大數據處理問題。 看到這麼火,咱也來湊把熱鬧,瞧瞧到底是什麼神奇的技術。 實戰過程,還是很波折。 畢竟,對這些hadoop的命令不是很熟。 所幸,天不負有心人,終於跑通了第一個示例。 對我而言,這個的意義,不亞於輸出了開天辟地的“hello world”。 配置過程中出錯時,不要洩氣,一般是由於路徑配置不對引起,可與本文檔對比查錯。 操作系統:Ubuntu 10.04 LTS JDK:jdk-6u18-linux-i586.bin Hadoop:hadoop-0.21.0 說明:hadoop版本一定要與本文檔匹配,新版本目錄格式已做修改。 步驟一:配置環境 本步驟參見:Hadoop環境搭建——單節點篇 1、安裝jdk1.6.0_18 1)在usr下面新建一個文件夾Java,然後將jdk復制過來. sudo mkdir /usr/Java sudo cp jdk的路徑 /usr/Java 2)進入到Java目錄下,改變文件權限為可執行 cd /usr/Java sudo chmod u+x jdk-6u18-linux-i586.bin 3)執行安裝 (現象為Unpacking....加一連串解壓信息) sudo ./jdk-6u18-linux-i586.bin 2、安裝hadoop0.21.0 1)將hadoop0.21.0.tar.gz復制到usr下面的local文件夾內 sudo cp hadoop的路徑 /usr/local 2)進入到local目錄下,解壓hadoop-0.21.0.tar.gz cd /usr/local sudo tar -xzf hadoop-0.21.0.tar.gz 3)為了方便管理,將解壓後的文件夾名改為hadoop sudo mv hadoop-0.21.0 hadoop 3、創建一個名為hadoop的用戶和用戶組 1)創建一個名為hadoop的用戶組 sudo addgroup hadoop 2)創建一個名為hadoop的用戶,歸到hadoop用戶組下 sudo adduser --ingroup hadoop hadoop 3)用gedit打開etc下的sudoers文件 sudo gedit /etc/sudoers 4)在 root ALL=(ALL) ALL 下面添加如下一行,然後保存關閉gedit hadoop ALL=(ALL) ALL 4、配置環境變量 1)用gedit打開etc下的profile文件 sudo gedit /etc/profile 2)在文件最後加入如下幾行 export CLASSPATH=.:/usr/Java/jdk1.6.0_23/lib:/usr/Java/jdk1.6.0_18/jre/lib:$CLASSPATH export PATH=.:/usr/Java/jdk1.6.0_23/bin:/usr/Java/jdk1.6.0_18/jre/bin:/usr/local/hadoop/bin:$PATH 3)保存後關閉gedit,並重啟機器 sudo reboot 4)重啟後用hadoop用戶登錄,驗證配置是否成功 java -version(驗證java配置是否成功) 5、創建ssh-key 1)確保網絡通暢,然後裝載ssh服務 sudo apt-get install openssh-server 2)創建ssh-key,為rsa ssh-keygen -t rsa --P 3)將此ssh-key添加到信任列表中,並啟用此ssh-key cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys sudo /etc/init.d/ssh reload 4)重啟系統 6、配置hadoop 1)進入到hadoop目錄下,配置conf目錄下的hadoop-env.sh中的JAVA_HOME cd /usr/local/hadoop sudo gedit conf/hadoop-env.sh (打開後在文檔的上部某行有“#export JAVA_HOME=...”字樣的地方,去掉“#”,然後在等號後面填寫你的jdk路徑,完全按此文檔來的話應改為 "export JAVA_HOME=/usr/Java/jdk1.6.0_23" ) 2)配置conf目錄下的core-site.xml sudo gedit conf/core-site.xml 配置文件內容core-site.xml。 [plain] <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp</value> </property> </configuration> 3)配置conf目錄下的mapred-site.xml sudo gedit conf/mapred-site.xml 配置文件內容mapred-site.xml。 [plain] <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> </configuration> 4)格式化namenode (首次運行必需的) cd /usr/local/hadoop hadoop namenode -format 5)啟動hadoop sudo chown -hR hadoop /usr/local/hadoop bin/start-all.sh 說明:若啟動異常,可重啟後重試。 6)驗證hadoop是否正常啟動 jps 以本機為例,輸出 [plain] 2776 SecondaryNameNode 10848 Jps 2322 NameNode 2886 JobTracker 2539 DataNode 3102 TaskTracker 步驟二、運行C++ MapReduce程序 本步驟參考文檔:Hadoop的C++擴展了解。 1、創建wordcount.cpp cd /home/hadoop/tmp mkdir wordcount cd wordcount sudo gedit wordcount.cpp [cpp] #include<algorithm> #include<limits> #include<string> #include"stdint.h" #include"hadoop/Pipes.hh" #include"hadoop/TemplateFactory.hh" #include"hadoop/StringUtils.hh" using namespace std; class WordCountMapper:public HadoopPipes::Mapper { public: WordCountMapper(HadoopPipes::TaskContext& context){} void map(HadoopPipes::MapContext& context) { string line =context.getInputValue(); vector<string>word = HadoopUtils::splitString(line, " "); for (unsigned int i=0; i<word.size(); i++) { context.emit(word[i],HadoopUtils::toString(1)); } } }; class WordCountReducer:public HadoopPipes::Reducer { public: WordCountReducer(HadoopPipes::TaskContext& context){} void reduce(HadoopPipes::ReduceContext& context) { int count = 0; while (context.nextValue()) { count +=HadoopUtils::toInt(context.getInputValue()); } context.emit(context.getInputKey(),HadoopUtils::toString(count)); } }; int main(int argc, char **argv) { return HadoopPipes::runTask(HadoopPipes::TemplateFactory<WordCountMapper,WordCountReducer>()); } 2、創建Makefile編譯文件 sudo gedit Makefile [plain] CC = g++ HADOOP_INSTALL = /usr/local/hadoop PLATFORM = Linux-i386-32 CPPFLAGS = -m32 -I$(HADOOP_INSTALL)/c++/$(PLATFORM)/include LIBS = -L$(HADOOP_INSTALL)/c++/$(PLATFORM)/lib -lhadooppipes -lhadooputils -lpthread wordcount: wordcount.cpp $(CC) $(CPPFLAGS) $< -Wall $(LIBS) -g -O2 -o $@ 3、運行編譯文件 make 4、上傳運行程序到hdfs hadoop fs -mkdir bin hadoop fs -put wordcount bin 5、准備測試文件 sudo gedit myfile.txt 文件內容:1 2 3 4 5 6 7 8 9 10 11 12 13。 6、上傳測試文件 hadoop fs -mkdir input hadoop fs -put myfile.txt input 7、編寫配置文件 sudo gedit job_config.xml [plain] <?xml version="1.0"?> <configuration> <property> <name>mapred.job.name</name> <value>WordCount</value> </property> <property> <name>mapred.reduce.tasks</name> <value>10</value> </property> <property> <name>mapred.task.timeout</name> <value>180000</value> </property> <property> <name>hadoop.pipes.executable</name> <value>/user/hadoop/bin/wordcount</value> <description> Executable path is given as"path#executable-name" sothat the executable will havea symlink in working directory. This can be used for gdbdebugging etc. </description> </property> <property> <name>mapred.create.symlink</name> <value>yes</value> </property> <property> <name>hadoop.pipes.java.recordreader</name> <value>true</value> </property> <property> <name>hadoop.pipes.java.recordwriter</name> <value>true</value> </property> </configuration> 8、運行任務 hadoop fs -rmr output hadoop pipes -conf job_config.xml -input input/myfile.txt -output output -program bin/wordcount 9、查看結果www.2cto.com hadoop fs -ls output hadoop fs -cat output/part-00000 hadoop fs -cat output/part-00001 結果格式如下 [plain] 1 1 12 1 13 1 2 1 3 1 4 1 5 1