英文参考文档链接如下:

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/SingleCluster.html

 

这篇文章描述了单节点的伪分布式hadoop部署。下面是我根据官方文档进行自我部署测试 。

 

一、写在前面的话

       hadoop包括的东西很多,而且文档上的东西也不一定全都正确 ,再加上运行环境的多样化,学习中途出现各种问题是很常见的,遇到问题的时候,先自己花点时间想想能不能自己解决,如果不能再上网找方法,既然都准备要学习它了,就要有自信,hadoop在牛逼也是一种技术,是技术就没有学不会的。

       还有我的个人建议是不要一上来就开始跑hadoop这种hello级别的例子,先自己了解下hadoop是什么,主要包括哪些方面,这些东西又是干什么的。这时候我们不知道具体操作,但是心里有点概念会让自己对后面学习过程中的一些步骤多些理解。

 

二、说说环境

       操作系统:看官网推荐的是ubuntu系统,所以我用的是64bit 的ubuntu12.10这个版本

       必要软件:ssh 用 apt-get install ssh

                        rsync 用 apt-get install rsync

                        java 用 orache 的 64bit 7u55版本,安装方法见链接

                        hadoop 上官网下2.6.0的stable版本

 

三、准备工作

    将下载的hadoop 解压到/usr/local/下

cp hadoop-2.6.0.tar /usr/local
cd /usr/local
tar xf hadoop-2.6.0.tar

    修改配置文件,我用的是vim,也可以用其他的工具,安装的话也是apt-get install vim


 

 

vim /usr/local/hadoop-2.6.0/etc/hadoop/hadoop-env.sh

    在26行,修改java home的路径 


 

 

export JAVA_HOME="/usr/local/java/jdk1.7.0_55"

    我没有找到 HADOOP_PREFIX的内容所有

没有加下面的内容


 

 

export HADOOP_PREFIX=/usr/local/hadoop

    运行hadoop应该会有下面的一些命令提示


 

 

root@mtang-VirtualBox:/usr/local/hadoop-2.6.0/bin# ./hadoop
Usage: hadoop [--config confdir] COMMAND
       where COMMAND is one of:
  fs                   run a generic filesystem user client
  version              print the version
  jar <jar>            run a jar file
  checknative [-a|-h]  check native hadoop and compression libraries availability
  distcp <srcurl> <desturl> copy file or directories recursively
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
  credential           interact with credential providers
                       Hadoop jar and the required libraries
  daemonlog            get/set the log level for each daemon
  trace                view and modify Hadoop tracing settings
 or
  CLASSNAME            run the class named CLASSNAME

 

四、独立的hadoop

独立的就是没有配置任何分布式特性的,默认的就是这样,这比较方便调试,下面的命令可以让给你看到点输出信息。

 

$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
$ cat output/*

 

五、伪分布式hadoop

 

5.1 修改配置文件

将下面的内容拷贝到你的配置文件/usr/local/hadoop-2.6.0/etc/hadoop/core-site.xml ,刚打开的时候应该是自由<configuration>,中间是空的。

 

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

 如上,拷贝下面内容到配置文件/usr/local/hadoop-2.6.0/etc/hadoop/hdfs-site.xml


 

 

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

 

5.2 设置免密码的ssh

       首先试下下面的命令ssh localhost看是否需要密码,如果要那么执行下面的命令,$表示一行的开头,不要拷贝进去了。

 

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

       上面的命令是生成一个证书,然后通过这个证书完成免密码ssh连接


 

 

5.3 开始执行吧

      1. 格式化文件系统,这次我们用到了HDFS了,HDFS是一种分布文件系统,对分布式文件系统不了解的就先把它当作本地的文件系统,FAT32,NTFS之类的,再简单点说就是你的硬盘,这次的任务是格式化你的"硬盘“

 

/usr/local/hadoop-2.6.0/bin/hdfs namenode -format

 

   2.接下来我们启动我们的namenode,namenode是hdfs的内容

 

/usr/local/hadoop-2.6.0/sbin/start-dfs.sh

 

   3. 这时候我们可以通过浏览器查看namenode的界面,在浏览器输入下面内容,当然如果不是本机localhost换成机器IP吧。

 

http://localhost:50070/

 

   4. 在dfs上创建目录吧,用来存放待处理的文件的

 

/usr/local/hadoop-2.6.0/bin/hdfs dfs -mkdir -p /user/root/input

 

 

    5. 把本地待处理的文件拷贝到dfs上的

 

/usr/local/hadoop-2.6.0/bin/hdfs dfs -put /usr/local/hadoop-2.6.0/etc/hadoop/* /user/root/input

 

    6. 接下来我们就可以运行期待的已久的hadoop分析任务了,注意是一行

 

/usr/local/hadoop-2.6.0/bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'

    如果你多次运行上面的命令碰巧出现下面的错误的话


 

 

org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/root/output already exists

    你需要先删除这个文件夹


 

 

/usr/local/hadoop-2.6.0/bin/hdfs dfs -rm -r /user/root/output

 

    7. 好了,运行完了,把结果拷贝到本地磁盘看看

/usr/local/hadoop-2.6.0/bin/hdfs dfs -get /user/root/output /root/output

    看看结果

 

cat /root/output/*

   其实也可以不用拷贝,直接在hfs上看的


/usr/local/hadoop-2.6.0/bin/hdfs dfs -cat /user/root/output/*


6	dfs.audit.logger
4	dfs.class
3	dfs.server.namenode.
2	dfs.period
2	dfs.audit.log.maxfilesize
2	dfs.audit.log.maxbackupindex
1	dfsmetrics.log
1	dfsadmin
1	dfs.servers
1	dfs.replication
1	dfs.file


    8. 别忘了擦屁股,dfs关了


/usr/local/hadoop-2.6.0/sbin/stop-dfs.sh


六、YARN的伪分布式hadoop


    YARN 作为第二代map/reduce框架,是必然要替代第一代的,这里我们不管,既然是map/reduce的替代,现在我们运行应该就是替换map/reduce相关的内容,其他的不用动吧。


注:下面的路径我不写全了,假设已经cd到/usr/local/hadoop-*下了


    1. 我们修改配置文件,etc/hadoop/mapred-site.xml,我们可能找不到这个文件,但是我们有mapred-site.xml.template,先拷贝一份出来吧


cp mapred-site.xml.template mapred-site.xml


<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

 然后继续修改 etc/hadoop/yarn-site.xml


<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>


   2. 然后启动


sbin/start-yarn.sh


http://localhost:8088/


bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'

    当你运行的时候可能会遇到Connect refused 的错误,提示服务器9000拒绝,然后我们回到前面看看哪里用了9000端口会发现DFS用了,所以继续定位重新启动dfs ,etc/hadoop/start-dfs.sh的日志会发现datanode没有启动,而且会有java.io.IOException: Incompatible clusterIDs的错误,上网查了下是因为做format 的时候没有清空dataNode下的data目录引起的,一个可行的解决方法是手动删除data目录下所有文件。


看下datanode 的日志 ,一般在%hadoop_home%/logs/下,我们会发先我们的datanode的data目录为/tmp/hadoop-root/dfs/data,手动删除即可。


P.S 如果不想这么麻烦就把tmp下的全删除吧,反正我的只有hadoop 相关的内容,当然这个路径是可以设置的,然后从hdfs format开始,again。(亲测可用,来来回回好多遍命令基本都记住了,format namenode ,启动hdfs,创建目录拷贝文件,启动yarn,运行map/reduce任务,查看结果,关闭hdfs和yarn服务,so easy).


    5. 停止


sbin/stop-yarn.sh