本教程适合于在 CentOS 6.x 系统中安装原生 Hadoop 2,适用于Hadoop 2.7.1, Hadoop 2.6.0 等版本,主要参考了官方安装教程,步骤详细,辅以适当说明,相信按照步骤来,都能顺利在 CentOS 中安装并运行 Hadoop。本 Hadoop 教程由给力星出品,转载请注明。html
本教程使用 CentOS 6.4 32位 做为系统环境,请自行安装系统。若是用的是 Ubuntu 系统,请查看相应的 Ubuntu安装Hadoop教程。java
本教程基于原生 Hadoop 2,在 Hadoop 2.6.0 (stable) 版本下验证经过,可适合任何 Hadoop 2.x.y 版本,例如 Hadoop 2.7.1, Hadoop 2.4.1等。node
Hadoop 有两个主要版本,Hadoop 1.x.y 和 Hadoop 2.x.y 系列,比较老的教材上用的多是 0.20 这样的版本。Hadoop 2.x 版本在不断更新,本教程都可适用。若是需安装 0.20,1.2.1这样的版本,本教程也能够做为参考,主要差异在于配置项,配置请参考官网教程或其余教程。linux
新版是兼容旧版的,书上旧版本的代码应该可以正常运行(我本身没验证,欢迎验证反馈)。正则表达式
装好了 CentOS 系统以后,在安装 Hadoop 前还须要作一些必备工做。shell
若是你安装 CentOS 的时候不是用的 “hadoop” 用户,那么须要增长一个名为 hadoop 的用户。apache
首先点击左上角的 “应用程序” -> “系统工具” -> “终端”,首先在终端中输入 su
,按回车,输入 root 密码以 root 用户登陆,接着执行命令建立新用户 hadoop:vim
以下图所示,这条命令建立了能够登录的 hadoop 用户,并使用 /bin/bash 做为shell。浏览器
CentOS建立hadoop用户bash
接着使用以下命令修改密码,按提示输入两次密码,可简单的设为 “hadoop”(密码随意指定,若提示“无效的密码,过于简单”则再次输入确认就行):
可为 hadoop 用户增长管理员权限,方便部署,避免一些对新手来讲比较棘手的权限问题,执行:
以下图,找到 root ALL=(ALL) ALL
这行(应该在第98行,能够先按一下键盘上的 ESC
键,而后输入 :98
(按一下冒号,接着输入98,再按回车键),能够直接跳到第98行 ),而后在这行下面增长一行内容:hadoop ALL=(ALL) ALL
(当中的间隔为tab),以下图所示:
为hadoop增长sudo权限
添加好内容后,先按一下键盘上的 ESC
键,而后输入 :wq
(输入冒号还有wq,这是vi/vim编辑器的保存方法),再按回车键保存退出就能够了。
最后注销当前用户(点击屏幕右上角的用户名,选择退出->注销),在登录界面使用刚建立的 hadoop 用户进行登录。(若是已是 hadoop 用户,且在终端中使用 su
登陆了 root 用户,那么须要执行 exit
退出 root 用户状态)
使用 hadoop 用户登陆后,还须要安装几个软件才能安装 Hadoop。
CentOS 使用 yum 来安装软件,须要联网环境,首先应检查一下是否连上了网络。以下图所示,桌面右上角的网络图标若显示红叉,则代表还未联网,应点击选择可用网络。
检查是否联网
链接网络后,须要安装 SSH 和 Java。
集群、单节点模式都须要用到 SSH 登录(相似于远程登录,你能够登陆某台 Linux 主机,而且在上面运行命令),通常状况下,CentOS 默认已安装了 SSH client、SSH server,打开终端执行以下命令进行检验:
若是返回的结果以下图所示,包含了 SSH client 跟 SSH server,则不须要再安装。
检查是否安装了SSH
若须要安装,则能够经过 yum 进行安装(安装过程当中会让你输入 [y/N],输入 y 便可):
接着执行以下命令测试一下 SSH 是否可用:
此时会有以下提示(SSH首次登录提示),输入 yes 。而后按提示输入密码 hadoop,这样就登录到本机了。
测试SSH是否可用
但这样登录是须要每次输入密码的,咱们须要配置成SSH无密码登录比较方便。
首先输入 exit
退出刚才的 ssh,就回到了咱们原先的终端窗口,而后利用 ssh-keygen 生成密钥,并将密钥加入到受权中:
在 Linux 系统中,~ 表明的是用户的主文件夹,即 “/home/用户名” 这个目录,如你的用户名为 hadoop,则 ~ 就表明 “/home/hadoop/”。 此外,命令中的 # 后面的文字是注释。
此时再用 ssh localhost
命令,无需输入密码就能够直接登录了,以下图所示。
SSH无密码登陆
Java 环境可选择 Oracle 的 JDK,或是 OpenJDK,如今通常 Linux 系统默认安装的基本是 OpenJDK,如 CentOS 6.4 就默认安装了 OpenJDK 1.7。按 http://wiki.apache.org/hadoop/HadoopJavaVersions 中说的,Hadoop 在 OpenJDK 1.7 下运行是没问题的。须要注意的是,CentOS 6.4 中默认安装的只是 Java JRE,而不是 JDK,为了开发方便,咱们仍是须要经过 yum 进行安装 JDK,安装过程当中会让输入 [y/N],输入 y 便可:
经过上述命令安装 OpenJDK,默认安装位置为 /usr/lib/jvm/java-1.7.0-openjdk(该路径能够经过执行 rpm -ql java-1.7.0-openjdk-devel | grep '/bin/javac'
命令肯定,执行后会输出一个路径,除去路径末尾的 “/bin/javac”,剩下的就是正确的路径了)。OpenJDK 安装后就能够直接使用 java、javac 等命令了。
接着须要配置一下 JAVA_HOME 环境变量,为方便,咱们在 ~/.bashrc 中进行设置(扩展阅读: 设置Linux环境变量的方法和区别):
在文件最后面添加以下单独一行(指向 JDK 的安装位置),并保存:
以下图所示:
设置JAVA_HOME环境变量
接着还须要让该环境变量生效,执行以下代码:
设置好后咱们来检验一下是否设置正确:
若是设置正确的话,$JAVA_HOME/bin/java -version
会输出 java 的版本信息,且和 java -version
的输出结果同样,以下图所示:
成功设置JAVA_HOME环境变量
这样,Hadoop 所需的 Java 运行环境就安装好了。
Hadoop 2 能够经过 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下载,本教程选择的是 2.6.0 版本,下载时请下载 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另外一个包含 src 的则是 Hadoop 源代码,须要进行编译才可以使用。
下载时强烈建议也下载 hadoop-2.x.y.tar.gz.mds 这个文件,该文件包含了检验值可用于检查 hadoop-2.x.y.tar.gz 的完整性,不然若文件发生了损坏或下载不完整,Hadoop 将没法正常运行。
本文涉及的文件均经过浏览器下载,默认保存在 “下载” 目录中(若不是请自行更改 tar 命令的相应目录)。另外,若是你用的不是 2.6.0 版本,则将全部命令中出现的 2.6.0 更改成你所使用的版本。
若文件不完整则这两个值通常差异很大,能够简单对比下前几个字符跟后几个字符是否相等便可,以下图所示,若是两个值不同,请务必从新下载。
检验文件完整性
咱们选择将 Hadoop 安装至 /usr/local/ 中:
Hadoop 解压后便可使用。输入以下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
请务必注意命令中的相对路径与绝对路径,本文后续出现的 ./bin/...
,./etc/...
等包含 ./ 的路径,均为相对路径,以 /usr/local/hadoop 为当前目录。例如在 /usr/local/hadoop 目录中执行 ./bin/hadoop version
等同于执行 /usr/local/hadoop/bin/hadoop version
。能够将相对路径改为绝对路径来执行,但若是你是在主文件夹 ~ 中执行 ./bin/hadoop version
,执行的会是 /home/hadoop/bin/hadoop version
,就不是咱们所想要的了。
Hadoop 默认模式为非分布式模式,无需进行其余配置便可运行。非分布式即单 Java 进程,方便进行调试。
如今咱们能够执行例子来感觉下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
能够看到全部例子),包括 wordcount、terasort、join、grep 等。
在此咱们选择运行 grep 例子,咱们将 input 文件夹中的全部文件做为输入,筛选当中符合正则表达式 dfs[a-z.]+
的单词并统计出现的次数,最后输出结果到 output 文件夹中。
若运行出错,如出现以下图提示:
运行Hadoop实例时可能会报错
若出现提示 “WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable”,该 WARN 提示能够忽略,不会影响 Hadoop 正常运行(可经过编译 Hadoop 源码解决,解决方法请自行搜索)。
若出现提示 “INFO metrics.MetricsUtil: Unable to obtain hostName java.net.UnknowHostException”,这须要执行以下命令修改 hosts 文件,为你的主机名增长IP映射:
主机名在终端窗口标题里能够看到,或执行命令 hostname
查看,以下图所示,在最后面增长一行 “127.0.0.1 dblab”:
设置主机名的IP映射
保存文件后,从新运行 hadoop 实例,若执行成功的话会输出不少做业的相关信息,最后的输出信息以下图所示。做业的结果会输出在指定的 output 文件夹中,经过命令 cat ./output/*
查看结果,符合正则的单词 dfsadmin 出现了1次:
Hadoop例子输出结果
注意,Hadoop 默认不会覆盖结果文件,所以再次运行上面实例会提示出错,须要先将 ./output
删除。
Hadoop 能够在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既做为 NameNode 也做为 DataNode,同时,读取的是 HDFS 中的文件。
在设置 Hadoop 伪分布式配置前,咱们还须要设置 HADOOP 环境变量,执行以下命令在 ~/.bashrc 中设置:
此次咱们选择用 gedit 而不是 vim 来编辑。gedit 是文本编辑器,相似于 Windows 中的记事本,会比较方便。保存后记得关掉整个 gedit 程序,不然会占用终端。在文件最后面增长以下内容:
保存后,不要忘记执行以下命令使配置生效:
这些变量在启动 Hadoop 进程时须要用到,不设置的话可能会报错(这些变量也能够经过修改 ./etc/hadoop/hadoop-env.sh 实现)。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/
中,伪分布式须要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每一个配置以声明 property 的 name 和 value 的方式来实现。
修改配置文件 core-site.xml (经过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml
),将当中的
修改成下面配置:
一样的,修改配置文件 hdfs-site.xml:
配置完成后,执行 NameNode 的格式化:
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
执行NameNode格式化
接着开启 NaneNode
和 DataNode
守护进程:
若出现以下 SSH 的提示 “Are you sure you want to continue connecting”,输入 yes 便可。
首次启动Hadoop时的SSH提示
启动时可能会有 WARN 提示 “WARN util.NativeCodeLoader…” 如前面提到的,这个提示不会影响正常使用。
启动完成后,能够经过命令 jps
来判断是否成功启动,若成功启动则会列出以下进程: “NameNode”、”DataNode”和SecondaryNameNode
(若是 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,而后再次尝试启动尝试)。若是没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查以前步骤,或经过查看启动日志排查缘由。
经过jps查看启动的Hadoop进程
有时 Hadoop 没法正确启动,如 NameNode 进程没有顺利启动,这时能够查看启动日志来排查缘由,注意几点:
成功启动后,能够访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还能够在线查看 HDFS 中的文件。
Hadopp的Web界面
上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先须要在 HDFS 中建立用户目录:
接着将 ./etc/hadoop 中的 xml 文件做为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。咱们使用的是 hadoop 用户,而且已建立相应的用户目录 /user/hadoop ,所以在命令中就可使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
复制完成后,能够经过以下命令查看 HDFS 中的文件列表:
伪分布式运行 MapReduce 做业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(能够将单机步骤中建立的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
结果以下,注意到刚才咱们已经更改了配置文件,因此运行结果不一样。
Hadoop伪分布式运行grep的结果
咱们也能够将运行结果取回到本地:
Hadoop 运行程序时,输出目录不能存在,不然会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,所以若要再次执行,须要执行以下命令删除 output 文件夹:
运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,不然会提示错误,所以运行前须要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上以下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操做:
若要关闭 Hadoop,则运行
下次启动 hadoop 时,无需进行 NameNode 的初始化,只须要运行 ./sbin/start-dfs.sh
就能够!
(伪分布式不启动 YARN 也能够,通常不会影响程序执行)
有的读者可能会疑惑,怎么启动 Hadoop 后,见不到书上所说的 JobTracker 和 TaskTracker,这是由于新版的 Hadoop 使用了新的 MapReduce 框架(MapReduce V2,也称为 YARN,Yet Another Resource Negotiator)。
YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性,YARN 的更多介绍在此不展开,有兴趣的可查阅相关资料。
上述经过 ./sbin/start-dfs.sh
启动 Hadoop,仅仅是启动了 MapReduce 环境,咱们能够启动 YARN ,让 YARN 来负责资源管理与任务调度。
首先修改配置文件 mapred-site.xml,这边须要先进行重命名:
而后再进行编辑,一样使用 gedit 编辑会比较方便些 gedit ./etc/hadoop/mapred-site.xml
:
接着修改配置文件 yarn-site.xml:
而后就能够启动 YARN 了(须要先执行过 ./sbin/start-dfs.sh
):
开启后经过 jps
查看,能够看到多了 NodeManager 和 ResourceManager 两个后台进程,以下图所示。
开启YARN
启动 YARN 以后,运行实例的方法仍是同样的,仅仅是资源管理方式、任务调度不一样。观察日志信息能够发现,不启用 YARN 时,是 “mapred.LocalJobRunner” 在跑任务,启用 YARN 以后,是 “mapred.YARNRunner” 在跑任务。启动 YARN 有个好处是能够经过 Web 界面查看任务的运行状况:http://localhost:8088/cluster,以下图所示。
开启YARN后能够查看任务运行信息
但 YARN 主要是为集群提供更好的资源管理与任务调度,然而这在单机上体现不出价值,反而会使程序跑得稍慢些。所以在单机上是否开启 YARN 就看实际状况了。
若是不想启动 YARN,务必把配置文件 mapred-site.xml 重命名,改为 mapred-site.xml.template,须要用时改回来就行。不然在该配置文件存在,而未开启 YARN 的状况下,运行程序会提示 “Retrying connect to server: 0.0.0.0/0.0.0.0:8032” 的错误,这也是为什么该配置文件初始文件名为 mapred-site.xml.template。
一样的,关闭 YARN 的脚本以下:
自此,你已经掌握 Hadoop 的配置和基本使用了。
在这里额外讲一下 PATH 这个环境变量(可执行 echo $PATH
查看,当中包含了多个目录)。例如咱们在主文件夹 ~ 中执行 ls
这个命令时,实际执行的是 /bin/ls
这个程序,而不是 ~/ls
这个程序。系统是根据 PATH 这个环境变量中包含的目录位置,逐一进行查找,直至在这些目录位置下找到匹配的程序(若没有匹配的则提示该命令不存在)。
上面的教程中,咱们都是先进入到 /usr/local/hadoop 目录中,再执行 ./sbin/hadoop
,实际上等同于运行 /usr/local/hadoop/sbin/hadoop
。咱们能够将 Hadoop 命令的相关目录加入到 PATH 环境变量中,这样就能够直接经过 start-dfs.sh
开启 Hadoop,也能够直接经过 hdfs
访问 HDFS 的内容,方便平时的操做。
在前面咱们设置 HADOOP 环境变量时,咱们已经顺便设置了 PATH 变量(即 “export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin”),那么之后咱们在任意目录中均可以直接经过执行 start-dfs.sh
来启动 Hadoop 或者执行 hdfs dfs -ls input
查看 HDFS 文件了,读者不妨如今就执行 hdfs dfs -ls input
试试看。
在平时的学习中,咱们使用伪分布式就足够了。若是须要安装 Hadoop 集群,请查看Hadoop集群安装配置教程。