本文是hadoop的运行环境搭建实际的操作过程的记录和总结,整个文档包括如下内容:
- 概述
- 环境配置
- 创建用户
- 配置SSH
- hadoop安装
- hadoop运行模式
- 单机模式
一、概述
因为hadoop是一个分布式大数据系统,在实际生产环境下,是在集群环境下运行的,少则几台机器,多在几百/几千台机器。搭建一个集群的环境,一来需要有资源,二来也比较复杂。这也是阻碍很多新人学习hadoop大数据技术的一个原因。那我们在学习阶段,如何准备这个环境呢?
在学习的初期阶段,我们主要目的是为了了解大数据组件的基本架构和原理,重点是站在应用角度学习如何使用hadoop大数据系统,包括命令行操作和编写代码进行操作。好在hadoop在开发阶段并不需要一定要有集群的环境,而是可以在一台机器(即单节点)下进行相关的开发和功能测试。
实际上,单机环境的搭建也是集群环境搭建的基础,只有先熟悉单机环境的搭建,才有可能掌握集群环境的搭建。另外在开发阶段,通常都是在单机环境下进行开发和测试通过后,基本上不用修改代码就能运行到集群环境下。
因此,我们这个系列的学习,无论是搭建环境,还是使用测试,都是在一台Linux机器(即单节点环境)下进行的。
掌握了单机环境下的安装和应用,如果要学习在集群环境下如何使用hadoop,也不是很麻烦的事。比较简单的方式可以利用虚拟机,在一台机器上创建多个虚拟机来搭建集群环境,当然这个对机器的性能配置有要求。还有一种更简单的方式是使用docker,启动多个docker容器,把每个docker容器作为一个节点来看待。
二、环境配置
在我们的这个测试中,所使用的操作系统和hadoop版本如下:
1、操作系统:CentOS 7.2
2、JAVA版本:JAVA1.8
3、hadoop版本:2.7.6
这里下载的是二进制压缩包 hadoop-2.7.6.tar.gz
三、创建用户
我们需要确定用什么用户去运行hadoop,当然可以直接用root用户,只是一般不推荐这么做,一般会创建一个独立的用户来运行hadoop。假设我们会创建一个名称为hadoop的用户(用户名可任意取)。
在linux控制台下执行如下操作:
1、 运行useradd命令,添加用户,用户名为hadoop,命令如下:
useradd hadoop
2、运行passwd命令,为hadoop用户设置密码,命令如下:
passwd hadoop
3、给hadoop用户增加sudo权限,这样可以使用sudo来执行root用户的权限才能执行的命令,在/etc/sudoers文件中找到如下语句
root ALL=(ALL:ALL) ALL
然后在上面语句的下面添加一行如下内容
hadoop ALL=(ALL:ALL) ALL
说明:从下面开始,没有特别说明的情况下,所有的操作都是以hadoop用户登陆后进行操作的。
四、配置SSH
因为hadoop的启动运行,需要用到ssh登陆,为了避免每次都输入密码,可以设置ssh免密码登陆。
首先测试本机的ssh是否安装,以及ssh服务是否正常启动。当前登陆用户为前面创建的hadoop用户,在控制台下执行如下命令:
ssh localhost
一般会提示输入hadoop用户密码,如果输入正确密码后,显示登陆成功,表示ssh一切正常。执行exit命令可以退出ssh。
这时我们可以通过如下的设置来达到ssh无密码登陆。
1、用hadoop用户登陆后,执行如下命令
ssh-keygen -t rsa -P “”
会出现各种提示,一路回车,如果提示是否覆盖已存在的文件,选择覆盖。上述命令会生成一对公钥/私钥,私钥存在 ~/.ssh/id_rsa文件中,公钥存在~/.ssh/id_rsa.pub文件中。~是hadoop用户的主目录,即/home/hadoop目录。
2、要想用ssh无密码登陆机器,需要确保公钥存放在用户打算连接的所有机器的~/.ssh/authorized_keys文件中。因为我们是登陆本机,执行下面命令:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
上面linux命令是将 ~/.ssh/id_rsa.pub 文件中的内容添加到~/.ssh/authorized_keys文件的后面,如果~/.ssh/authorized_keys文件不存在,会新建该文件。
3、设置权限,因为SSH进行认证的过程中除了对用户目录有权限要求外,对 .ssh 文件夹和 authorized_keys 文件同样也要限制,执行如下命令:
sudo chmod 700 /home/hadoop/.ssh
sudo chmod 600 /home/hadoop/.ssh/authorized_keys
说明:如果当前用户是hadoop用户,可能没有执行chmod的权限,所以加上sudo命令。
4、测试 ssh localhost
如果上面命令不需要输入密码,则说明设置成功
五、hadoop安装
假设我们已经下载好了二进制压缩包,如hadoop-2.7.6.tar.gz 文件。
1、解压文件,执行如下命令
tar –zxvf hadoop-2.7.6.tar.gz
上述命令会生成一个目录 hadoop-2.7.6 ,目录中有如下子目录和文件:
bin data etc include lib libexec LICENSE.txt logs NOTICE.txt README.txt sbin share
2、利用linux命令将hadoop-2.7.6目录移到自己想放置的位置,目录名也可以修改。当然也可以不做任何变动。这里我们假设最后的hadoop安装位置是/home/hadoop-2.7.6
3、设置hadoop用户为hadoop-2.7.6目录及下面子目录和文件的所有者,命令如下:
sudo chown -R hadoop:hadoop hadoop-2.7.6
4、修改hadoop配置文件,设置JAVA_HOME路径
hadoop的配置文件都在hadoop-2.7.6目录下的etc/hadoop下,在该目录下找到其中的hadoop-env.sh文件,打开该文件,找到如下的内容
export JAVA_HOME=${JAVA_HOME}
然后将${JAVA_HOME}更改为本机的jdk路径。说明,即使有JAVA_HOME环境变量,也需要进行设置为具体的路径。如设置为:
export JAVA_HOME=/home/data/jdk1.8.0_102
说明:上面只是举例,需要根据本机jdk的安装位置设置正确的目录。
5、设置hadoop用户的环境变量
进入 /home/hadoop目录,修改.bash_profile文件,增加如下的环境变量:
export HADOOP_INSTALL=/home/hadoop-2.7.6
export HADOOP_HOME=/home/hadoop-2.7.6
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin
export PATH
说明:上面的/home/hadoop-2.7.6路径只是例子, 需要改成实际的hadoop版本所安装(放置)的位置。
5、进行测试
以hadoop用户登陆,执行如下命令:
hadoop version
如果一切正常,上面命令会输出正确的hadoop版本等信息,说明前面的配置一切正确。hadoop是一个可执行程序,位于hadoop安装目录的bin目录下。因为前面的操作已经将hadoop目录下的bin和sbin目录加到PATH环境变量中,所以可以在任何当前命令下执行hadoop程序。
上述命令的输出如下:
Hadoop 2.7.6
Subversion https://shv@git-wip-us.apache.org/repos/asf/hadoop.git -r 085099c66cf28be31604560c376fa282e69282b8
Compiled by kshvachk on 2018-04-18T01:33Z
Compiled with protoc 2.5.0
From source with checksum 71e2695531cb3360ab74598755d036
This command was run using /home/hadoop-2.7.6/share/hadoop/common/hadoop-common-2.7.6.jar
六、hadoop运行模式
hadoop可以有三种运行模式:
(一)、独立(本地)模式
在该模式下不需要事先启动任何服务(守护进程),数据存在本地磁盘,可以执行hdfs的文件操作命令,但操作的是本地磁盘。这种模式下可以很方便的运行和调试mapreduce程序,因为是在一个jvm上执行的,可以很方便的单步跟踪等。这样我们可以在本地模式下编写调试Mapreduce程序后,然后移植到集群环境下,基本上也不需要修改很多代码。
独立模式是默认的方式,前面的工作完成后,我们不再需要额外做任何配置就可以在独立模式下工作。
这时我们可以直接在命令行下执行hdfs命令,如执行命令:
hadoop fs -ls /
该命令会列出本地系统根目录(/)下的所有目录和文件,和直接执行linux下的命令 ls -al / 命令输出的信息类似。
说明:hadoop fs可以带各种参数来执行hdfs的各种操作。
我们也可以执行如下命令:
hadoop fs -mkdir /home/hadoop/hello
上面命令会在hadoop用户的主目录 /home/hadoop下创建一个新的目录hello。
总结下,也就是说在独立模式下执行 hadoop fs命令,就等同于执行linux本地的文件系统命令。如果要学习hdfs的各项命令,这是一种最简单方便的方式。更多的hdfs操作命令我们会在后面的hdfs组件学习中详细介绍。
在该模式下如何编写mapreduce程序我们会在后面的mapreduce学习中单独介绍。
(二)单机模式(伪分布模式)
在该模式下,只需要一台linux机器,需要在本地启动服务(如hdfs服务和yarn服务,对应多个进程),这是模拟一个小规模的集群。在这种模式下,从使用和开发角度看,其实和真正的多台机器上的集群模式没有太多差别。
如本文开头所说,我们这系列的学习,都是在单机模式下进行的。如何进行单机模式的配置和启动,我们在下面的章节单独进行介绍。
(三)全分布模式(集群模式)
这种模式下,hadoop服务运行在一个集群(多台机器)上,此模式环境搭建需要更多操作,也需要更多的配置。具体如何做本文不做介绍。
七、单机模式
要hadoop在单机模式上运行,我们要进行一系列的配置和操作,下面进行详细介绍。
(一)修改配置文件
我们先需要对hadoop的几个配置文件进行相关的设置。hadoop所有的配置文件都位于安装目录的etc/hadoop目录下。具体设置如下:
1、修改配置文件core-site.xml
该文件初始情况下其xml根节点configuration下没有信息,我们需要加上如下的信息:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost/</value>
</property>
</configuration>
2、修改配置文件hdfs-site.xml,修改后的内容如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
3、修改配置文件mapred-site.xml,可能该文件不存在,而存在mapred-site.xml.template文件,就把mapred-site.xml.template文件改名为mapred-site.xml即可。修改后的文件内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4、修改配置文件yarn-site.xml,修改后的文件内容如下:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
hadoop有大量的参数,每个参数都有一个名字(如yarn.resourcemanager.hostname)和对应的值(如localhost)。这些参数都有默认值,如果我们不想使用默认值,就可以在配置文件中进行配置,如上面的配置文件中的设置。hadoop在启动时,会把这些参数的值加载到程序中,供服务启动和运行时使用。hadoop的参数有些在启动后不能改变,有些还可以启动后通过编写程序进行动态设置。
上面一共修改了hadoop的4个配置文件,涉及到最少的几个参数,我们暂时不用管这些参数的含义。在后面的学习中我们还会涉及到更多的参数,到时会了解各个参数具体的含义和作用。
(二)格式化文件系统
配置文件修改好后,我们还需要进行一步操作,就是在首次使用hadoop的分布式文件系统hdfs之前,必须先格式化文件系统。只需要执行如下的命令:
hdfs namenode -format
执行上述命令,会有很多信息输出,如果没有错误信息出现,说明操作成功。
(三)启动和停止服务
独立模式下,需要启动相应的服务。一共有两个服务,一个是hdfs服务,也就是分布式文件系统服务;另一个是yarn服务。
这两个服务可以通过执行 start-all.sh脚本全部启动起来 ,该脚本位于hadoop安装目录的sbin目录下,因为sbin目录在前面的设置中已经加到PATH环境变量下,所以我们可以在任何当前目录运行该脚本。该脚本运行中,会有很多日志信息在控制台上输出,日志信息会写入到hadoop安装目录下的logs目录下,如果有错误信息,一般就是到日志中查看原因。
执行脚本完毕后,我们可以执行jps命令,(jps是java的一个工具,可用来查看有哪些java进程启动了),正常输出的信息中会包含如下条目信息:
9105 NameNode
9973 NodeManager
9319 DataNode
9594 SecondaryNameNode
9853 ResourceManager
上述进程就是hdfs和yarn服务启动后的进程。
如果我们想停止hdfs和yarn服务,可以执行stop-all.sh脚本来停止这些服务。当然服务停止后就不可用了。
除了通过start-all.sh和stop-all.sh脚本来启动和停止hdfs和yarn服务外。还可以单独执行start-dfs.sh脚本来启动hdfs服务(对应的停止服务的脚本为stop-dfs.sh脚本);执行start-yarn脚本来执行yarn服务(对应的停止服务的脚本为stop-yarn.sh脚本)。
(四)进行测试
服务启动后,我们可以进行相应的测试。我们可以执行一些hdfs命令来查看hdfs服务是否启动正常,如:
[hadoop@localhost ~]$ hadoop fs -ls /
[hadoop@localhost ~]$ hadoop fs -mkdir /hello
[hadoop@localhost ~]$ hadoop fs -ls /
Found 1 items
drwxr-xr-x – hadoop supergroup 0 2018-11-07 17:31 /hello
[hadoop@localhost ~]$ hadoop fs -put test.txt /hello
[hadoop@localhost ~]$ hadoop fs -ls /hello
Found 1 items
-rw-r–r– 1 hadoop supergroup 5 2018-11-07 17:32 /hello/test.txt
下面我们来简单解释下上述操作的含义。
先了解下hdfs分布式文件系统的文件目录结构,hdfs文件目录结构和linux系统的文件目录结构类似,根目录为 / ,下面就是一层层的目录和文件。如果对linux文件系统了解的话,就很容易理解hdfs的文件系统目录结构。
1、上面命令先执行了 hadoop fs -ls / ,这是用于查看根目录/下的内容,显然因为环境刚搭建,根目录下没有任何内容。
2、再执行了hadoop fs -mkdir /hello,这是在根目录下创建了hello目录。
3、再次执行hadoop fs -ls / ,可以看出,显示出/目录下有了hello目录,就是我们上一步创建的目录,这说明上一步创建目录成功了。
4、再执行hadoop fs -put test.txt /hello ,该命令的作用是把本地当前目录下的test.txt文件(前提这个文件得存在)上传到hdfs文件系统下的/hello目录下。
5、再次执行 hadoop fs -ls /hello ,可以看到 hdfs的 /hello目录下有了一个test.txt文件。
通过上面简单的操作,我们可以看出,从使用角度看,hdfs分布式文件系统和linux本地文件系统非常类似,只不过正常情况下,hdfs分布式文件系统下的各个文件是存储在不同的节点(机器)上。更详细的hdfs操作我们在后面的学习中会详细介绍,这里只是为了验证我们的环境搭建是否正常。
本文是我们后面后续学习的基础,我们后面的所有学习都是在本文搭建的单机模式环境基础上进行的。