Eclipse3.3(windows7)鏈接遠程hadoop(RedHat.Enterprise.Linux.5)並測試程序 java
機器名 node |
IP linux |
做用 apache |
NameNode windows |
192.168.1.1 app |
NameNode、master、jobTracker eclipse |
DataNode1 ssh |
192.168.1.2 jsp |
DataNode、slave、taskTracker ide |
DataNode2 |
192.168.1.3 |
DataNode、slave、taskTracker |
機器知足1G內存,2G 更好。Linux5安裝後,可不啓動圖形界面,節約內存。
安裝步驟:
一、安裝RedHat.Enterprise.Linux.5
用介質安裝linux,安裝完後修改機器名:$hostname 機器名。
在/etc/hosts中添加機器名和相應的IP:
127.0.0.1 localhost
192.168.1.1 NameNode
192.168.1.2 DataNode1
192.168.1.3 DataNode2
修改/etc/inittab文件:
id:5:initdefault: 改成id:3:initdefault:
從新啓動OS就不會進入圖形界面了
二、開啓ssh服務
#servicesshd start
能夠在windows下用SSH Secure Shell Client來測試一下。
三、關閉防火牆(全部機器)
# chkconfig --levels 2345 iptables off
注意:這步很是重要。若是不關閉,會出現找不到datanode問題。
四、創建ssh無密碼登陸
(1)在NameNode上實現無密碼登陸本機:
$ ssh-keygen -t rsa
直接回車,完成後會在~/.ssh/生成兩個文件:id_rsa和id_rsa.pub。
$ ssh-keygen -t dsa
直接回車,完成後會在~/.ssh/生成兩個文件:id_dsa和id_dsa.pub。
$cat~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys 將生成的密鑰串在鑰匙鏈上
$cat~/.ssh/id_dsa.pub >>~/.ssh/authorized_keys 將生成的密鑰串在鑰匙鏈上
$chmod 600 ~/.ssh/authorized_keys。
(2)實現NameNode無密碼登陸其餘DataNode:
把NameNode上的authorized_keys 文件追加到dataNode的authorized_keys 內(以
192.168.0.2節點爲例):
a.拷貝NameNode 的authorized_keys 文件:
$ scp authorized_keys mark@192.168.0.2:/home/mark/
b.登陸192.168.0.2,執行$ cat authorized_keys >>~/.ssh/authorized_keys
其餘的dataNode執行一樣的操做。
注意:若是配置完畢,若是namenode依然不能訪問datanode,能夠修改datanode的
authorized_keys的讀寫權限(很重要!):
$ chmod 600 ~/.ssh/authorized_keys。
五、安裝jdk1.6
下載地址:http://java.sun.com/javase/downloads/widget/jdk6.jsp,下載後,直接安裝。本例的安裝路徑爲/usr/java/jdk1.6.0_31。
安裝後,添加以下語句到/etc/profile中:
exportJAVA_HOME==/usr/java/jdk1.6.0_31
exportJRE_HOME==/usr/java/jdk1.6.0_31 /jre
exportCLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
注意:每臺機器的java環境最好一致。安裝過程當中若有中斷,切換爲root 權限來安裝。
六、安裝hadoop
下載hadoop-0.20.2.tar.gz
解壓:$tar –zvxf hadoop-0.20.2.tar.gz
把Hadoop的安裝路徑添加到環/etc/profile 中:
exportHADOOP_HOME=/home/mark/hadoop-0.20.2
exportPATH=$HADOOP_HOME/bin:$PATH
七、配置hadoop
hadoop的主要配置都在hadoop-0.20.2/conf 下。
(1)在conf/hadoop-env.sh中配置Java 環境(namenode與datanode 的配置相同):
$gedit hadoop-env.sh
$export JAVA_HOME=/usr/java/jdk1.6.0_31
(2)配置conf/masters和conf/slaves 文件:(只在namenode上配置)
masters:192.168.1.1
slaves:
192.168.1.2
192.168.1.3
(3)配置conf/core-site.xml,conf/hdfs-site.xml 及conf/mapred-site.xml(簡單配置,datanode的配置相同)
core-site.xml:
<configuration>
<!---global properties -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/mark/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<!--file system properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.1.1:9000</value>
</property>
</configuration>
hdfs-site.xml:(replication 默認爲3,若是不修改,datanode少於三臺就會報錯)
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.1.1:9001</value>
</property>
</configuration>
八、運行hadoop
進入hadoop-0.20.2/bin,首先格式化文件系統:$hadoop namenode –format
啓動Hadoop:$start-all.sh
$./start-dfs.sh
$./start-mapred.sh
用jps命令查看進程,NameNode 上的結果以下:
[mark@namenode~]$ jps
8872JobTracker
8650NameNode
15183Jps
8780SecondaryNameNode
[mark@namenode~]$
DataNode上的結果:
[mark@DataNode1~]$ jps
7346DataNode
28263Jps
7444TaskTracker
[mark@DataNode1~]$
查看集羣狀態:$hadoop dfsadmin –report
[mark@namenode~]$ hadoop dfsadmin -report
ConfiguredCapacity: 222387527680 (207.11 GB)
PresentCapacity: 201404645376 (187.57 GB)
DFSRemaining: 201404182528 (187.57 GB)
DFSUsed: 462848 (452 KB)
DFSUsed%: 0%
Underreplicated blocks: 2
Blockswith corrupt replicas: 0
Missingblocks: 0
-------------------------------------------------
Datanodesavailable: 3 (3 total, 0 dead)
Name:192.168.1.2:50010
DecommissionStatus : Normal
ConfiguredCapacity: 60261593088 (56.12 GB)
DFSUsed: 167936 (164 KB)
NonDFS Used: 6507544576 (6.06 GB)
DFSRemaining: 53753880576(50.06 GB)
DFSUsed%: 0%
DFSRemaining%: 89.2%
Lastcontact: Fri Mar 30 10:18:12 CST 2012
Name:192.168.1.3:50010
DecommissionStatus : Normal
ConfiguredCapacity: 101864341504 (94.87 GB)
DFSUsed: 143360 (140 KB)
NonDFS Used: 7971401728 (7.42 GB)
DFSRemaining: 93892796416(87.44 GB)
DFSUsed%: 0%
DFSRemaining%: 92.17%
Lastcontact: Fri Mar 30 10:18:12 CST 2012
九、運行wordcount.java程序
(1)先在本地磁盤創建兩個輸入文件file01和file02:
$echo 「Hello World Bye World」 > file01
$echo 「Hello Hadoop Goodbye Hadoop」 > file02
(2)在hdfs中創建一個input 目錄:$hadoop fs –mkdir input
(3)將file01和file02 拷貝到hdfs 中:
$hadoop fs –copyFromLocal /home/mark/file0* input
(4)執行wordcount:
$hadoop jar hadoop-0.20.2-examples.jar wordcount input output
(5)完成以後,查看結果:
$hadoop fs -cat output/part-r-00000
Bye1
Goodbye1
Hadoop2
Hello2
World2
1.eclipse安裝hadoop插件
Eclipse使用3.3版本,安裝文件是eclipse-jee-europa-winter-win32.zip,根據網上的資料,其餘版本 可能會出現問題。在hadoop的安裝包中帶有eclipse的插件,在\contrib\eclipse-plugin\hadoop-0.20.2- eclipse-plugin.jar,將此文件拷貝到eclipse的plugins中。安裝成功以後在projectexplorer中會有一個 DFSlocations的標誌
在windows->preferences裏面會多一個hadoopmap/reduce的選項,選中這個選項,而後在右邊的表單中,把下載的hadoop根目錄選中。
能看到以上兩點,說明插件安裝成功了。
2.hadoop鏈接參數配置
如圖所示,打開Map/ReduceLocations視圖,在右上角有個大象的標誌點擊
在點擊大象後彈出的對話框進行參數的添加,以下圖
locationname :隨便填
map/reducemaster這個框裏
host:就是jobtracker的ip
port:就是jobtracker的port,這裏填9001
這兩個參數就是mapred-site.xml裏面的mapred.job.tracker裏面的ip和port
DFSmaster這個框裏
host:namenode的IP
port:就是namenode的port,這裏填9000
這兩個參數就是core-site.xml裏fs.default.name裏面的ip和port
username:這個是鏈接hadoop的用戶名
下面的不用填,點擊finish按鈕,此時,這個視圖中就有了一條記錄。
重啓eclipse,而後從新編輯剛纔創建的那個鏈接記錄,如圖,在上一步裏咱們填寫的Generaltab頁,如今編輯advance parameter tab頁。
hadoop.job.ugi:這裏填寫mark,root,Users mark是hadoop集羣中安裝集羣所使用的用戶名。
而後點擊finish,就連上了。
連上的標誌如圖。
3.寫個wordcount程序,並在eclipse裏測試。
在eclipse中建一個map/reduce工程,如圖
而後在這個工程下面添加java類MyMap.java以下
packageorg;
importjava.io.IOException;
importjava.util.StringTokenizer;
importorg.apache.hadoop.io.IntWritable;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.mapreduce.Mapper;
publicclass MyMap extends Mapper<Object,Text,Text,IntWritable> {
private final static IntWritable one =new IntWritable(1);
private Text word;
public void map(Object key,Textvalue,Context context) throws IOException,InterruptedException{
String line =value.toString();
StringTokenizer tokenizer = newStringTokenizer(line);
while(tokenizer.hasMoreTokens()){
word = new Text();
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
添加MyReduce.java類以下
package org;
import java.io.IOException;
importorg.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
importorg.apache.hadoop.mapreduce.Reducer;
publicclass MyReduce extendsReducer<Text,IntWritable,Text,IntWritable> {
publicvoid reduce(Text key,Iterable<IntWritable>values,Context context)throws IOException,InterruptedException{
int sum=0;
for(IntWritable val:values){
sum+=val.get();
}
context.write(key, new IntWritable(sum));
}
}
添加MyDriver類以下
packageorg;
importjava.io.IOException;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.IntWritable;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.mapred.JobClient;
importorg.apache.hadoop.mapreduce.Job;
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
importorg.apache.hadoop.mapreduce.lib.input.TextInputFormat;
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
importorg.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
publicclass MyDriver {
/**
*@param args
*/
public static void main(String[] args)throws Exception,InterruptedException{
Configuration conf = newConfiguration();
Job job = new Job(conf,"HelloHadoop");
job.setJarByClass(MyDriver.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(MyMap.class);
job.setCombinerClass(MyReduce.class);
job.setReducerClass(MyReduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.setInputPaths(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
//JobClient.runJob(conf);
job.waitForCompletion(true);
}
}
4. 進入c:\windows\system32\drivers\etc目錄,打開hosts文件加入
192.168.1.1NameNode
ip是master的ip,NameNode是master的機器名
5.而後設置MyDriver類的執行參數,也就是輸入輸出參數,要指定輸入輸出的文件夾
input就是輸入文件存放路徑,本例中要保證input目錄中有要進行wordcount的文本文件,output就是mapReduce以後處理的數據結果輸出的路徑
6.而後runon hadoop
控制檯打印信息以下:
12/03/30 09:28:08 WARN conf.Configuration: DEPRECATED:hadoop-site.xml found in the classpath. Usage of hadoop-site.xml is deprecated.Instead use core-site.xml, mapred-site.xml and hdfs-site.xml to overrideproperties of core-default.xml, mapred-default.xml and hdfs-default.xmlrespectively
12/03/30 09:28:08 WARN mapred.JobClient: UseGenericOptionsParser for parsing the arguments. Applications should implementTool for the same.
12/03/30 09:28:08 INFO input.FileInputFormat: Total inputpaths to process : 2
12/03/30 09:28:09 INFO mapred.JobClient: Running job:job_201203281633_0006
12/03/30 09:28:10 INFO mapred.JobClient: map 0% reduce 0%
12/03/30 09:28:19 INFO mapred.JobClient: map 100% reduce 0%
12/03/30 09:28:31 INFO mapred.JobClient: map 100% reduce 100%
12/03/30 09:28:33 INFO mapred.JobClient: Job complete:job_201203281633_0006
12/03/30 09:28:33 INFO mapred.JobClient: Counters: 18
12/03/30 09:28:33 INFO mapred.JobClient: Job Counters
12/03/30 09:28:33 INFO mapred.JobClient: Launched reduce tasks=1
12/03/30 09:28:33 INFO mapred.JobClient: Rack-local map tasks=1
12/03/30 09:28:33 INFO mapred.JobClient: Launched map tasks=2
12/03/30 09:28:33 INFO mapred.JobClient: Data-local map tasks=1
12/03/30 09:28:33 INFO mapred.JobClient: FileSystemCounters
12/03/30 09:28:33 INFO mapred.JobClient: FILE_BYTES_READ=79
12/03/30 09:28:33 INFO mapred.JobClient: HDFS_BYTES_READ=50
12/03/30 09:28:33 INFO mapred.JobClient: FILE_BYTES_WRITTEN=228
12/03/30 09:28:33 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=41
12/03/30 09:28:33 INFO mapred.JobClient: Map-Reduce Framework
12/03/30 09:28:33 INFO mapred.JobClient: Reduce input groups=5
12/03/30 09:28:33 INFO mapred.JobClient: Combine output records=6
12/03/30 09:28:33 INFO mapred.JobClient: Map input records=2
12/03/30 09:28:33 INFO mapred.JobClient: Reduce shuffle bytes=85
12/03/30 09:28:33 INFO mapred.JobClient: Reduce output records=5
12/03/30 09:28:33 INFO mapred.JobClient: Spilled Records=12
12/03/30 09:28:33 INFO mapred.JobClient: Map output bytes=82
12/03/30 09:28:33 INFO mapred.JobClient: Combine input records=8
12/03/30 09:28:33 INFO mapred.JobClient: Map output records=8
12/03/30 09:28:33 INFO mapred.JobClient: Reduce input records=6
7.最後到output裏去看一下程序執行結果。