【Hadoop实战】在Mac OS上配置Hadoop伪分布式环境

最近大数据很流行,而Hadoop又 是分析大数据的有力工具,加之工作需要,我近期也在学习hadoop的相关知识。学习归学习,还是要实践;而实践,得先有环境。看到教科书上的一些方法, 都是在linux上配置;mac与linux相近,我就在mac os上实践了。mac os版本是10.8.1,配置的是单机伪分布式环境,目的是学习hadoop程序编写;至于hadoop集群搭建,暂时不感兴趣。

主要参考的资料是《hadoop实战》第二章,p18 -- p21的内容。

《Hadoop实战》中文版+英文文字版+源码【PDF】 下载见 http://www.linuxidc.com/Linux/2012-10/71901.htm

hadoop伪分布式环境搭建,大概分三个步骤:1. java环境配置;2. mac os自身环境设置;3. hadoop环境配置。

1. java环境配置

这一步主要是让mac os支持java,并且配置相关环境变量,使得系统能够自动找到javac和java。在mac系统下,支持java相对简单。我打开terminal, 想看下是否系统已经安装了java(之前安装过xcode的command line版本),键入"java -version",结果mountain lion很智能的问我要不要安装java,并且自动连接apple网站下载安装了java编译、运行环境,并配置好相关环境变量。

在terminal里再次键入"java -version",出现如下信息:

java version "1.6.0_35"

Java(TM) SE Runtime Environment (build 1.6.0_35-b10-428-11M3811)

Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01-428, mixed mode)

为了进一步验证,打开vim写了一段helloworld程序,并保存为helloworld.java,如下:

  1. package helloworld;     
  2. public class helloworld 
  3.      public static void main (String [] args) 
  4.      { 
  5.          System.out.println ("Hello world for java!"); 
  6.      } 
  7.  } 

需要注意的是,文件名字“helloworld.java”需要和主类的名字一致。而且,package的名字,最终会在生成.class文件的时 候决定路径的深度,例如:我最开始起的名字是“package java.tryjava.helloworld”,结果.class文件生成在了“.../java/tryjava/helloworld”路径下, 烦死。

命令行中用javac编译刚才的文件,如下:

javac -d ../bin/ helloworld.java

其中“-d”表示生成文件的目录,再往后,是要编译的源代码文件。查看../bin/helloworld/目录下,生成helloworld.class文件,cd到该目录,输入

java hell world/helloworld

注意第二个是不带后缀的文件名hellworld,而不是生成的全名hellworld.class。如期得到

Hello world for java!

至此,java环境安装完毕。在《hadoop实战》中,还要设置一些环境变量。这些在mac系统下可以省略,在刚才安装过程中,已经设置好这些变量了。

2. 配置mac os 自身环境

这个主要是配置ssh环境。先在terminal里面输入

ssh localhost

会有错误提示信息,表示当前用户没有权限。这个多半是系统为安全考虑,默认设置的。更改设置如下:进入system preference --> sharing --> 勾选remote login,并设置allow access for all users。再次输入“ssh localhost",再输入密码并确认之后,可以看到ssh成功。

不过这里面还有一个麻烦,就是每次都会要求输入用户密码。《Hadoop实战》提供了一种免登陆的方法。首先,输入

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

ssh-keygen表示生成秘钥;-t表示秘钥类型;-P用于提供密语;-f指定生成的秘钥文件。这个命令在”~/.ssh/“文件夹下创建两个文件id_dsa和id_dsa.pub,是ssh的一对儿私钥和公钥。接下来,将公钥追加到授权的key中去,输入:

cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

ssh免登陆设置完成。

3. 安装并运行hadoop

首先下载hadoop,链接是http://apache.etoak.com/hadoop/common/,里面由hadoop的各个版本。看到书上用的是0.20.2版本,我也就下这个了。文件不大,135M左右。接下来,到 hadoop-0.20.2/conf 文件夹下,要配置的几个文件都在这里。

第一个是hadoop-env.sh脚本文件,设置如下环境变量:

  1. export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home   
  2. export HADOOP_INSTALL=/Volumes/Data/Works/Hadoop/hadoop-0.20.2/   
  3. export PATH=$PATH:$HADOOP_INSTALL/bin 

从名字都能判断各个环境变量的含义。需要说明的是,第一个路径,实际上是从”/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home“来的,只不过中间有些软连接,最后的实际目录如上面所示。

接下来是core-site.xml文件,配置hdfs的地址和端口号,如下:

  1. <?xml version="1.0"?>   
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>   
  3. <!-- Put site-specific property overrides in this file. -->   
  4.    
  5. <configuration>   
  6.     <property>   
  7.         <name>fs.default.name</name>   
  8.         <value>hdfs://localhost:9000</value>   
  9.     </property>   
  10. </configuration> 

默认是没有中间<property>区域的,需要自己加上。

然后是mapred-site.xml文件,设置map-reduce中jobtracker的地址和端口号,如下:

  1. <?xml version="1.0"?>   
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>   
  3. <!-- Put site-specific property overrides in this file. -->   
  4.    
  5. <configuration>   
  6.   <property>   
  7.     <name>mapred.job.tracker</name>   
  8.     <value>localhost:9001</value>   
  9.   </property>   
  10. </configuration>   

最后是hdfs-site.xml文件,设置hdfs的默认备份方式。默认值是3,在伪分布式系统中,需要修改为1,如下:

  1. <?xml version="1.0"?>   
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>   
  3. <!-- Put site-specific property overrides in this file. -->   
  4.    
  5. <configuration>   
  6.   <property>   
  7.     <name>dfs.replication</name>   
  8.     <value>1</value>   
  9.   </property>   
  10. </configuration>   

设置总算是完成了,接下来,格式化namenode。啊,namenode是啥?问度娘吧。在terminal里输入如下命令:

bin/Hadoop NameNode -format

我曾担心把我的整个Data盘都给废掉,后来看看,不是的。不知道这个namenode在mac系统中的哪个目录下。

接下来,启动hadoop,输入命令:

bin/start-all.sh

如果一切正常的话,会在http://localhost:50030和http://localhost:50070分别看到map-reduce和hdfs的相关信息。总之,走到这一步,我看到信息了,虽然没太看懂吧,但证明hadoop在我的mac上运行起来了.

相关推荐