pig2 发表于 2013-11-27 15:40:33

Eclipse3.3 (windows7)连接远程hadoop(RedHat.Enterprise.Linux.5)并测试程序

对于新手不知道怎么调试hadoop,这里给大家介绍一下Eclipse3.3 (windows7)连接远程hadoop(RedHat.Enterprise.Linux.5)并测试程序一、hadoop集群安装
机器名
IP
作用

NameNode
192.168.1.1
NameNode、master、jobTracker

DataNode1
192.168.1.2
DataNode、slave、taskTracker

DataNode2
192.168.1.3
DataNode、slave、taskTracker

机器满足1G 内存,2G 更好。Linux5 安装后,可不启动图形界面,节约内存。
安装步骤:
1、安装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就不会进入图形界面了
2、开启ssh 服务
#service sshd start
可以在windows 下用SSH Secure Shell Client来测试一下。
3、关闭防火墙(所有机器)
# chkconfig--levels2345iptablesoff
注意:这步非常重要。如果不关闭,会出现找不到datanode 问题。
4、建立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。

5、安装jdk1.6
下载地址:http://java.sun.com/javase/downloads/widget/jdk6.jsp,下载后,直接安装。本例的安装路径为/usr/java/jdk1.6.0_31。
安装后,添加如下语句到/etc/profile 中:
export JAVA_HOME==/usr/java/jdk1.6.0_31
export JRE_HOME==/usr/java/jdk1.6.0_31 /jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
注意:每台机器的java 环境最好一致。安装过程中如有中断,切换为root 权限来安装。

6、安装hadoop
下载hadoop-0.20.2.tar.gz
解压:$ tar –zvxf hadoop-0.20.2.tar.gz
把Hadoop 的安装路径添加到环/etc/profile 中:
export HADOOP_HOME=/home/mark/hadoop-0.20.2
export PATH=$HADOOP_HOME/bin:$PATH

7、配置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>A base 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>

8、运行hadoop
进入hadoop-0.20.2/bin,首先格式化文件系统:$ hadoop namenode –format
启动Hadoop:$ start-all.sh
$./start-dfs.sh
$./start-mapred.sh
用jps 命令查看进程,NameNode 上的结果如下:
$ jps
8872 JobTracker
8650 NameNode
15183 Jps
8780 SecondaryNameNode
$
DataNode 上的结果:
$ jps
7346 DataNode
28263 Jps
7444 TaskTracker
$
查看集群状态:$ hadoop dfsadmin –report
$hadoop dfsadmin -report
Configured Capacity: 222387527680 (207.11 GB)
Present Capacity: 201404645376 (187.57 GB)
DFS Remaining: 201404182528 (187.57 GB)
DFS Used: 462848 (452 KB)
DFS Used%: 0%
Under replicated blocks: 2
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 3 (3 total, 0 dead)

Name: 192.168.1.2:50010
Decommission Status : Normal
Configured Capacity: 60261593088 (56.12 GB)
DFS Used: 167936 (164 KB)
Non DFS Used: 6507544576 (6.06 GB)
DFS Remaining: 53753880576(50.06 GB)
DFS Used%: 0%
DFS Remaining%: 89.2%
Last contact: Fri Mar 30 10:18:12 CST 2012


Name: 192.168.1.3:50010
Decommission Status : Normal
Configured Capacity: 101864341504 (94.87 GB)
DFS Used: 143360 (140 KB)
Non DFS Used: 7971401728 (7.42 GB)
DFS Remaining: 93892796416(87.44 GB)
DFS Used%: 0%
DFS Remaining%: 92.17%
Last contact: Fri Mar 30 10:18:12 CST 2012

9、运行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
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2



二、windows开发机器连接hadoop集群,并测试程序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中。安装成功之后在project explorer中会有一个DFSlocations的标志

在windows->preferences里面会多一个hadoop map/reduce的选项,选中这个选项,然后在右边的表单中,把下载的hadoop根目录选中。

能看到以上两点,说明插件安装成功了。
2. hadoop连接参数配置
如图所示,打开Map/Reduce Locations视图,在右上角有个大象的标志点击




在点击大象后弹出的对话框进行参数的添加,如下图

location name :随便填

map/reduce master这个框里
host:就是jobtracker的ip
port:就是jobtracker的port,这里填9001
这两个参数就是mapred-site.xml里面的mapred.job.tracker里面的ip和port

DFS master这个框里
host:namenode的IP
port:就是namenode的port,这里填9000
这两个参数就是core-site.xml里fs.default.name里面的ip和port

username:这个是连接hadoop的用户名
下面的不用填,点击finish按钮,此时,这个视图中就有了一条记录。

重启eclipse,然后重新编辑刚才建立的那个连接记录,如图,在上一步里我们填写的General tab页,现在编辑advance parameter tab页。

hadoop.job.ugi:这里填写 mark,root,Usersmark是hadoop集群中安装集群所使用的用户名。
然后点击finish,就连上了。





连上的标志如图。


3.写个wordcount程序,并在eclipse里测试。
在eclipse中建一个map/reduce工程,如图


然后在这个工程下面添加java类MyMap.java如下
package org;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MyMap extends Mapper<Object,Text,Text,IntWritable> {
       private final static IntWritable one = new IntWritable(1);
       private Text word;
      
       public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
            String line =value.toString();
            StringTokenizer tokenizer = new StringTokenizer(line);
            while(tokenizer.hasMoreTokens()){
                     word = new Text();
                     word.set(tokenizer.nextToken());
                     context.write(word, one);
            }
      }

}
添加MyReduce.java类如下 package org; import java.io.IOException; import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer; public class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable> {public void 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类如下
package org;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class MyDriver {

       /**
      * @param args
      */
       public static void main(String[] args) throws Exception,InterruptedException{
            Configuration conf = new Configuration();
            Job job = new Job(conf,"Hello Hadoop");
            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));
            FileOutputFormat.setOutputPath(job, new Path(args));
            //JobClient.runJob(conf);
            job.waitForCompletion(true);
       }

}

4. 进入c:\windows\system32\drivers\etc目录,打开hosts文件加入
192.168.1.1 NameNode
ip是master的ip,NameNode是master的机器名
5.然后设置MyDriver类的执行参数,也就是输入输出参数,要指定输入输出的文件夹


input就是输入文件存放路径,本例中要保证input目录中有要进行wordcount的文本文件,output就是mapReduce之后处理的数据结果输出的路径

6.然后run on 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 override properties of core-default.xml, mapred-default.xml and hdfs-default.xml respectively12/03/30 09:28:08 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.12/03/30 09:28:08 INFO input.FileInputFormat: Total input paths to process : 212/03/30 09:28:09 INFO mapred.JobClient: Running job: job_201203281633_000612/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_000612/03/30 09:28:33 INFO mapred.JobClient: Counters: 1812/03/30 09:28:33 INFO mapred.JobClient:   Job Counters 12/03/30 09:28:33 INFO mapred.JobClient:   Launched reduce tasks=112/03/30 09:28:33 INFO mapred.JobClient:   Rack-local map tasks=112/03/30 09:28:33 INFO mapred.JobClient:   Launched map tasks=212/03/30 09:28:33 INFO mapred.JobClient:   Data-local map tasks=112/03/30 09:28:33 INFO mapred.JobClient:   FileSystemCounters12/03/30 09:28:33 INFO mapred.JobClient:   FILE_BYTES_READ=7912/03/30 09:28:33 INFO mapred.JobClient:   HDFS_BYTES_READ=5012/03/30 09:28:33 INFO mapred.JobClient:   FILE_BYTES_WRITTEN=22812/03/30 09:28:33 INFO mapred.JobClient:   HDFS_BYTES_WRITTEN=4112/03/30 09:28:33 INFO mapred.JobClient:   Map-Reduce Framework12/03/30 09:28:33 INFO mapred.JobClient:   Reduce input groups=512/03/30 09:28:33 INFO mapred.JobClient:   Combine output records=612/03/30 09:28:33 INFO mapred.JobClient:   Map input records=212/03/30 09:28:33 INFO mapred.JobClient:   Reduce shuffle bytes=8512/03/30 09:28:33 INFO mapred.JobClient:   Reduce output records=512/03/30 09:28:33 INFO mapred.JobClient:   Spilled Records=1212/03/30 09:28:33 INFO mapred.JobClient:   Map output bytes=8212/03/30 09:28:33 INFO mapred.JobClient:   Combine input records=812/03/30 09:28:33 INFO mapred.JobClient:   Map output records=812/03/30 09:28:33 INFO mapred.JobClient:   Reduce input records=6
7.最后到output里去看一下程序执行结果。

页: [1]
查看完整版本: Eclipse3.3 (windows7)连接远程hadoop(RedHat.Enterprise.Linux.5)并测试程序