本 Hadoop 教程由出品,转载请注明。本教程适合于在 CentOS .UnknowHostException”,这需要执行如下命令修改 hosts 文件,为你的主机名增加IP映射:
主机名在终端窗口标题里可以看到,或执行命令 hostname
查看,如下图所示,在最后面增加一行 “127.0.0.1 dblab”:
保存文件后,重新运行 hadoop 实例,若执行成功的话会输出很多作业的相关信息,最后的输出信息如下图所示。作业的结果会输出在指定的 output 文件夹中,通过命令 cat ./output/*
查看结果,符合正则的单词 dfsadmin 出现了1次:
注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output
删除。
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
在设置 Hadoop 伪分布式配置前,我们还需要设置 HADOOP 环境变量,执行如下命令在 ~/.bashrc 中设置:
这次我们选择用 gedit 而不是 vim 来编辑。gedit 是文本编辑器,类似于 Windows 中的记事本,会比较方便。保存后记得关掉整个 gedit 程序,否则会占用终端。在文件最后面增加如下内容:
保存后,不要忘记执行如下命令使配置生效:
这些变量在启动 Hadoop 进程时需要用到,不设置的话可能会报错(这些变量也可以通过修改 ./etc/hadoop/hadoop-env.sh 实现)。
配置完成后,执行 NameNode 的格式化:
DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
有时 Hadoop 无法正确启动,如 NameNode 进程没有顺利启动,这时可以查看启动日志来排查原因,注意几点:
- 每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,看下记录的时间就知道了。
- 可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。
运行Hadoop伪分布式实例
上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
复制完成后,可以通过如下命令查看 HDFS 中的文件列表:
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。
我们也可以将运行结果取回到本地:
运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:
若要关闭 Hadoop,则运行
(伪分布式不启动 YARN 也可以,一般不会影响程序执行)
YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性,YARN 的更多介绍在此不展开,有兴趣的可查阅相关资料。
首先修改配置文件 mapred-site.xml,这边需要先进行重命名:
启动 YARN 之后,运行实例的方法还是一样的,仅仅是资源管理方式、任务调度不同。观察日志信息可以发现,不启用 YARN 时,是 “mapred.LocalJobRunner” 在跑任务,启用 YARN 之后,是 “mapred.YARNRunner” 在跑任务。启动 YARN 有个好处是可以通过 Web 界面查看任务的运行情况:,如下图所示。
开启YARN后可以查看任务运行信息
但 YARN 主要是为集群提供更好的资源管理与任务调度,然而这在单机上体现不出价值,反而会使程序跑得稍慢些。因此在单机上是否开启 YARN 就看实际情况了。
同样的,关闭 YARN 的脚本如下:
自此,你已经掌握 Hadoop 的配置和基本使用了。
附加教程: 配置PATH环境变量
在这里额外讲一下 PATH 这个环境变量(可执行 echo $PATH
查看,当中包含了多个目录)。例如我们在主文件夹 ~ 中执行 ls
这个命令时,实际执行的是 /bin/ls
这个程序,而不是 ~/ls
这个程序。系统是根据 PATH
这个环境变量中包含的目录位置,逐一进行查找,直至在这些目录位置下找到匹配的程序(若没有匹配的则提示该命令不存在)。
开启 Hadoop,也可以直接通过 hdfs
访问 HDFS 的内容,方便平时的操作。
在平时的学习中,我们使用伪分布式就足够了。如果需要安装 Hadoop 集群,请查看。
- : 用文本编辑器写 Java 程序是不靠谱的,还是用 Eclipse 比较方便。
- : 有时候需要直接通过命令来编译 MapReduce 程序。