
1.1 Windows 下使用Hadoop 的环境配置
(1)安装Hadoop 前,首先需要安装Cygwin
首先下载Cygwin(http://cygwin.com/install.html),当setup.exe 下载成功后,直接运行,在弹出的“Cygwin Net Release Setup Program”的对话框中直接点击“下一步”,选择“download source”如下:
选择“Install from Internet”,进入下图所示对话框:
设置Cygwin 的安装目录,Install For 选择“All Users”,Default Text File Type
选择“Unix/binary”。“下一步”之后,设置Cygwin 安装包存放目录:
设置“Internet Connection”的方式,选择“Direct Connection”:
之后选择“Download site”:
选择最好选.cn结尾的,若无可以随意选择,若安装失败可多尝试几个。
“下一步”之后,可能会弹出下图的“Setup Alert”对话框,直接“确定”即可。
在上图所示的对话框过程中,可能会弹出如下图所示的“Setup Alert”对话框,直接点击“确定”即可。
进入“Select Packages”对话框,必须保证“Net Category”下的“OpenSSL”被安装:
安装中需要选中Net category 中的openssh,如下图所示:
如果还打算在eclipse上编译Hadoop,则还必须安装“Base Category”下的“sed”,如下图所示:
另外,安装“Editors Category”下的vim,以方便在Cygwin上直接修改配置文件;“Devel Category”下的subversion 建议安装,如下图所示:
安装完成后进行环境变量的配置。
(2)安装JDK
(3)配置Windows 系统变量
新建系统变量CYGWIN,变量值为ntsec
编辑系统变量里的Path 变量,将JDK的bin目录、Cygwin的bin目录以及Cygwin的usr\sbin目录加入到Path变量中。
(e:\\cygwin,e:\\cygwin\sbin)
新建系统变量JAVA_HOME,变量指向JRE安装目录。
(4)安装配置ssh
启动cygwin,执行命令:$ ssh-host-config。
当询问"Should privilege separation be used"时,输入no;当询问"Do you want to install sshd as a service? "选yes;当提示"Enterthe value of CYGWIN for the daemon:[]"时,选择ntsec。(好像没出现ntsec)
当看到“Have fun”时,一般表示sshd 服务安装成功了。
输入命令$ net start sshd,启动SSH,或者在Windows 服务项里启动CYGWIN sshd。
注意:
SSH无法启动的解决方法:
解决方案:
按上图配置命令的提示说明,需要执行mkpasswd 和 mkgroup重新生成权限信息
依次执行下面命令
$ mkpasswd -l > /etc/passwd
$ mkgroup -l > /etc/group
$ cygrunsrv -R sshd 删除ssd服务
$ ssh-host-config -y 重新配置
$ cygrunsrv -S sshd 启动服务。
sshd服务启动成功。
(注意:sshd在cyg_server帐户下运行)
然后执行$ ssh-keygen来生成密钥对,然后一直回车键确定。这样会把生产的密钥对保存在.ssh 目录下。使用命令将RSA 公钥加入到公钥授权文件authorized_keys 中:
$ cd /home/Administrator/.ssh
$ cat id_rsa.pub >> authorized_keys
最后执行$ ssh localhost,就可以实现无需密码的SSH 连接。
完成上述操作后,执行exit命令先退出Cygwin窗口。
执行ssh localhost时,会有如下图所示的提示,输入yes,然后回车即可:
如果不是第一次执行则会出现如下对话框:
成功启动ssh服务。
1.2 安装Hadoop
将Hadoop安装包(在此使用的是hadoop-0.20.2,相关apache软件下载地址:http://archive.apache.org/dist/)解压到你自己选择的目录(e:\\hadoop),然后需要修改hadoop 的配置文件,它们位于conf 子目录下,分别是hadoop-env.sh、core-site.xml、hdfs-site.xml 和mapred-site.xml 共四个文件。
1.2.1修改hadoop-env.sh
只需要将JAVA_HOME 修改成JDK 的安装目录即可,需要注意两点:
(1) JDK 必须是1.6 或以上版本;
(2) 设置JDK 的安装目录时,路径不能是Windows 风格的目录例如:C:\jdk1.7,而是LINUX 风格: /cygdrive/c/jdk1.7。
因此在hadoop-env.sh 中设定JDK 的安装目录:
export JAVA_HOME=/cygdrive/c/jdk1.7(注意删除-sun和export前面的注释“#”)
1.2.2 修改core-site.xml
为简化core-site.xml 配置,将src\\core 目录下的core-default.xml文件复制到conf 目录下,并将core-default.xml文件名改成core-site.xml。
修改:
1.2.3 修改hdfs-site.xml
为简化hdfs-site.xml 配置,将src\\hdfs 目录下的hdfs-default.xml文件复制到conf 目录下,并将hdfs-default.xml 文件名改成hdfs-site.xml。
修改:
1.2.4 修改mapred-site.xml
为简化mapred-site.xml 配置,将src\\mapred 目录下的mapreddefault.xml 文件复制到conf 目录下,并将mapred-default.xml 文件名改成mapred-site.xml。
修改:
到此修改完成,然后启动hadoop。
1.3 启动hadoop
在Cygwin 中,进入hadoop 的bin 目录,运行./hadoop namenode -format做格式化处理(仅第一次需要),再运行./start-all.sh 启动hadoop,在启动成功之后,可以执行./hadoop fs -ls /命令,查看hadoop 的根目录,如下图所示:
首先我们要先启动sshd服务,然后登录:
然后启动hadoop:
我们可以验证是否启动成功:(./hadoop dfsadmin -report)
也可以这样查看:
http://127.0.0.1:50030/
http://127.0.0.1:50070/
最后,使用 /bin/hadoop dfsadmin -safemode leave 命令使Hadoop退出安全模式。
有时在启动的时候会遇到一些问题,可能会出现
这时需要关闭系统./stop-all.sh ,然后删除hadoop/tmp下所有文件与目录,重新格式化并启动系统。至此,我们的Hadoop安装成功。
1.4 Hadoop运行wordcount实例
运行WordCount 实例。在本地文件系统上建立e:/hadoop/run/input目录,放入若干文件,文件为由多个单词组成(单词由空格分隔)的文本。
将文件复制到HDFS 的目录下,命名为input,并运行:
$ bin/hadoop dfs -put run/input input
没有内容输出就说明上传至文件系统成功。
运行:$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount input output
$ bin/hadoop jar WordCount.jar input output2
(WordCount.jar 为自定义类,参见后面插件部分)
另需注:
WordCount.jar\\META-INF\\MANIFET.MF:(内容)
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 10.0-b23 (Sun Microsystems Inc.)
Main-Class: com/cyberware/WordCount
output 为数据处理完成后输出目录, 默认在Hadoop 根目录下。任务执行完,用以下命令查看分布式文件系统上数据处理的结果:
$ bin/hadoop dfs -cat output /* 或
$ bin/hadoop fs -cat hdfs://localhost:9000/user/2012-20120728zh/administrator
/input/file1.txt
至此,完成wordcount实例的运行。
1.5使用eclipse编写Hadoop应用程序
在此,用eclipse编写了一个简单的程序。
1)在eclipse下创建一个java工程DFSOperator,并创建相应的类。
2)配置编译参数
配置“Build Path”,选中“DFSOperator”,单击右键,点击下图所示菜单“Build Path -> Configure Build Path”,进入“Java Build Path”配置界面。选择“Libraries”标签页,点击右侧的“Add External JAR”按钮,将安装好的“hadoop-0.20.2-core.jar”添加进来。
3)编辑源代码
4)编译生成jar包
右键“DFSOperator”项目,选择“Build Project”,编译项目工程,编译“DFSOperator.java”后,生成下图所示的DFSOperator.class 文件:
右键项目,选择“Export”,导出“JAR file”,也就是jar包。然后将导出的jar 文件上传到Hadoop Master 节点。
5)运行
导出的jar文件放到hadoop的bin文件下,进入Hadoop 的bin 目录,用以下命令进行测试运行:
(1) ls:查看当前目录,检查dfs_operator.jar是否存在;
(2) ./hadoop fs -ls /:查看Hadoop根目录下是否存在dfs_operator.txt文件;
(3) ./hadoop jar ./dfs_operator.jar DFSOperator:运行dfs_operator.jar,以生成dfs_operator.txt 文件;
(4) ./hadoop fs -ls /:再查看Hadoop根目录下是否存在dfs_operator.txt文件;
(5) ./hadoop fs -cat /dfs_operator.txt:检查dfs_operator.txt文件的内容。
该程序完成的功能简单,但从中可以学到如何在Windows下利用eclipse进行Hadoop编程。
1.6 使用IBM MapReduce Tools for Eclipse进行Hadoop编程(完成wordcount)
使用 IBM MapReduce Tools for Eclipse,使用这个Eclipse plugin可以简化开发和部署 Hadoop 并行程序的过程。基于这个plugin,可以在 Eclipse 中创建一个 Hadoop MapReduce 应用程序,并且提供了一些基于 MapReduce 框架的类开发的向导,可以打包成 JAR 文件,部署一个 Hadoop MapReduce 应用程序到一个 Hadoop 服务器(本地和远程均可),可以通过一个专门的视图 ( perspective ) 查看 Hadoop 服务器、Hadoop 分布式文件系统( DFS )和当前运行的任务的状态。
1)安装插件IBM MapReduce Tools for Eclipse
安装插件,然后点击 Eclipse 主菜单上 Windows->Preferences,然后在左侧选择 Hadoop Home Directory,设定Hadoop 主目录:
2)创建MapReduce Project
点击Eclipse主菜单上File->New->Project,在弹出的对话框中选择MapReduce Project。然后就可以一个普通的Eclipse Java project那样,添加入Java类。
编码后导出jar包,与创建java Project相同。导出jar包后,在hadoop下运行。
至此完成wordcount。
IBM MapReduce tools 还提供了几个实用的向导 ( wizard ) 工具,帮助创建单独的Mapper类,Reducer类,MapReduce Driver类,在编写比较复杂的 MapReduce程序时,将这些类出来是非常有必要的,也有利于在不同的计算任务中重用自己编写的各种Mapper类和Reducer类。
附录:
用IBM的MapReduce Tools for Eclipse插件简化Hadoop开发和部署
使用Cygwin模拟Linux环境,配置ssh以及认证就非常麻烦了,不过真要是走一遍那个流程,会学会不少东西的啊。
IBM的MapReduce Tools for Eclipse插件,极大地简化了这些配置,你可以想运行一个Java类一样轻松进行开发、调试和部署。
下载IBM的MapReduce Tools for Eclipse插件,地址是http://www.alphaworks.ibm.com/tech/mapreducetools,下载完成后,解压缩,将plugins目录下的文件夹拷贝到Eclipse目录下的plugins目录下,启动Eclipse,进行一番简单地配置就能进行Hadoop的开发、调试和部署了。
hadoop-0.20.2下自带的eclise插件已过时。
解决方案:
1、下载正确的插件:https://issues.apache.org/jira/secure/attachment/12460491/hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar
2、重命名:将下载的插件重命名为"hadoop-0.20.2-eclipse-plugin.jar"
3、替换原来的插件(D:\\Myeclipse10\\MyEclipse 10\\dropins下)。
4、重启eclipse
配置过程:
启动Eclipse,选择Window—>Preferences,弹出如图所示的对话框:
设置Hadoop Main Directory为自己下载的Hadoop发行包的解压包所在目录。设置完成后单击“OK”完成。
新建一个 Project ,选择MapReduce Project,如图所示:
继续进行创建,选择填写工程名后,完成一个MapReduce Project工程的创建,可以进行Hadoop程序的开发了。
比如,我直接把Hadoop自带的WordCount类程序一点不动地拷贝过来,修改包名。
然后进行运行时配置,选择Run As—>Open Debug Dialog选项,在Arguments选项卡中设置:
在其中填写两个目录,分别为数据输入目录和输出目录,中间用空格分隔:
e:\\hadoop\run\input e:\\hadoop\run\output (注意output需要先删除)
然后,就可以像运行一个Java程序一样运行了,控制台上打印出执行任务的信息,如下所示:
08/09/21 22:35:47 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
08/09/21 22:35:47 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
08/09/21 22:35:47 INFO mapred.FileInputFormat: Total input paths to process : 7
08/09/21 22:35:48 INFO mapred.JobClient: Running job: job_local_1
08/09/21 22:35:48 INFO mapred.MapTask: numReduceTasks: 1
08/09/21 22:35:49 INFO mapred.JobClient: map 0% reduce 0%
08/09/21 22:35:50 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/a.txt:0+1957
08/09/21 22:35:50 INFO mapred.TaskRunner: Task 'job_local_1_map_0000' done.
08/09/21 22:35:50 INFO mapred.TaskRunner: Saved output of task 'job_local_1_map_0000' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:50 INFO mapred.MapTask: numReduceTasks: 1
08/09/21 22:35:50 INFO mapred.JobClient: map 100% reduce 0%
08/09/21 22:35:51 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/b.txt:0+10109
08/09/21 22:35:51 INFO mapred.TaskRunner: Task 'job_local_1_map_0001' done.
08/09/21 22:35:51 INFO mapred.TaskRunner: Saved output of task 'job_local_1_map_0001' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:51 INFO mapred.MapTask: numReduceTasks: 1
08/09/21 22:35:51 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/c.txt:0+1957
08/09/21 22:35:51 INFO mapred.TaskRunner: Task 'job_local_1_map_0002' done.
08/09/21 22:35:51 INFO mapred.TaskRunner: Saved output of task 'job_local_1_map_0002' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:51 INFO mapred.MapTask: numReduceTasks: 1
08/09/21 22:35:51 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/d.txt:0+1987
08/09/21 22:35:51 INFO mapred.TaskRunner: Task 'job_local_1_map_0003' done.
08/09/21 22:35:51 INFO mapred.TaskRunner: Saved output of task 'job_local_1_map_0003' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:52 INFO mapred.MapTask: numReduceTasks: 1
08/09/21 22:35:52 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/e.txt:0+1957
08/09/21 22:35:52 INFO mapred.TaskRunner: Task 'job_local_1_map_0004' done.
08/09/21 22:35:52 INFO mapred.TaskRunner: Saved output of task 'job_local_1_map_0004' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:52 INFO mapred.MapTask: numReduceTasks: 1
08/09/21 22:35:52 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/f.txt:0+1985
08/09/21 22:35:52 INFO mapred.TaskRunner: Task 'job_local_1_map_0005' done.
08/09/21 22:35:52 INFO mapred.TaskRunner: Saved output of task 'job_local_1_map_0005' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:52 INFO mapred.MapTask: numReduceTasks: 1
08/09/21 22:35:53 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/g.txt:0+1957
08/09/21 22:35:53 INFO mapred.TaskRunner: Task 'job_local_1_map_0006' done.
08/09/21 22:35:53 INFO mapred.TaskRunner: Saved output of task 'job_local_1_map_0006' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:53 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/b.txt:0+10109
08/09/21 22:35:54 INFO mapred.JobClient: map 28% reduce 0%
08/09/21 22:35:54 INFO mapred.LocalJobRunner: file:/G:/hadoop-0.16.4/in/c.txt:0+1957
08/09/21 22:35:54 INFO mapred.LocalJobRunner: reduce > reduce
08/09/21 22:35:54 INFO mapred.TaskRunner: Task 'reduce_xk6d4v' done.
08/09/21 22:35:54 INFO mapred.TaskRunner: Saved output of task 'reduce_xk6d4v' to file:/G:/hadoop-0.16.4/myout
08/09/21 22:35:55 INFO mapred.JobClient: Job complete: job_local_1
08/09/21 22:35:55 INFO mapred.JobClient: Counters: 9
08/09/21 22:35:55 INFO mapred.JobClient: Map-Reduce Framework
08/09/21 22:35:55 INFO mapred.JobClient: Map input records=7
08/09/21 22:35:55 INFO mapred.JobClient: Map output records=39
08/09/21 22:35:55 INFO mapred.JobClient: Map input bytes=21909
08/09/21 22:35:55 INFO mapred.JobClient: Map output bytes=36511
08/09/21 22:35:55 INFO mapred.JobClient: Combine input records=39
08/09/21 22:35:55 INFO mapred.JobClient: Combine output records=21
08/09/21 22:35:55 INFO mapred.JobClient: Reduce input groups=7
08/09/21 22:35:55 INFO mapred.JobClient: Reduce input records=21
08/09/21 22:35:55 INFO mapred.JobClient: Reduce output records=7
和使用Cygwin模拟时的运行过程信息是一致的。
有了这个MapReduce Tools 插件,可真是太方便了。
中文格式支持:
1,UTF-8无BOM格式;
2,UTF-8格式,
其他将乱码!
