前言:
这个Hadoop的安装和使用操作起来很容易出错,反正各种的问题,所以在实验过程中需要细心、重复,有的时候是机器的问题,还有配置的问题。
下面我讲一下我遇到的坑!
第3章 Hadoop的安装和使用
注:本教程全部统一采用hadoop用户名登录Linux系统,用户名:hadoop 密码:hadoop
3.1 安装 Hadoop 前的准备工作
本节介绍安装Hadoop之前的一些准备工作,包括更新APT、安装SSH和安装Java环境等。
3.1.1 更新 APT
为了确保Hadoop安装过程顺利进行,建议执行下面命令更新APT软件:
$ sudo apt-get update
3.1.2 安装 SSH
Ubuntu默认已安装了SSH客户端,因此,这里还需要安装SSH服务端,请在Linux的终端中执行以下命令:
$ sudo apt-get install openssh-server
安装后,可以使用如下命令登录本机:
$ ssh localhost
执行该命令后会,会出现“yes/no”选择提示,输入“yes
”,然后按提示输入密码hadoop,就登录到本机了。
然后,请输入命令“exit
”退出刚才的SSH,就回到了原先的终端窗口;然后,可以利用ssh-keygen生成密钥,并将密钥加入到授权中,命令如下:
$ cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
$ ssh-keygen -t rsa # 会有提示,都按回车即可
$ cat ./id_rsa.pub >> ./authorized_keys # 加入授权
此时,再执行ssh localhost命令,无需输入密码就可以直接登录了。
3.1.3 安装 Java 环境
在Linux终端中,执行如下命令:
$ sudo apt-get install default-jre default-jdk
上述安装过程需要访问网络下载相关文件,请保持联网状态。安装结束以后,需要配置JAVA_HOME环境变量,请在Linux终端中输入下面命令打开当前登录用户的环境变量配置文件.bashrc:
$ vim ~/.bashrc
在文件最前面添加如下单独一行(注意,等号“=”前后不能有空格),然后 保存退出export JAVA_HOME=/usr/lib/jvm/default-java
注意:保存退出,按insert
才能添加内容;添加完毕后,按esc
键退出添加状态;然后直接键盘输入:wq
,这个在哪输入都可以;这样就保存退出了
接下来,要让环境变量立即生效,请执行如下代码:
$ source ~/.bashrc # 使变量设置生效
执行上述命令后,可以检验一下是否设置正确:
$ echo $JAVA_HOME # 检验变量值
$ java -version
$ $JAVA_HOME/bin/java -version # 与直接执行java -version一样
至此,就成功安装了Java环境。下面就可以进入Hadoop的安装。
3.2 安装Hadoop
Hadoop包括三种安装模式:
单机模式:只在一台机器上运行,存储是采用本地文件系统,没有采用分布式文件系统HDFS;
伪分布式模式:存储采用分布式文件系统HDFS,但是,HDFS的名称节点和数据节点都在同一台机器上;
分布式模式:存储采用分布式文件系统HDFS,而且,HDFS的名称节点和数据节点位于不同机器上。
本节介绍Hadoop的具体安装方法,包括下载安装文件、单机模式配置、伪分布式模式配置、分布式模式配置等。
3.2.1 下载安装文件
到Hadoop官网下载安装文件hadoop-2.7.1.tar.gz,假设下载得到的安装文件为hadoop-2.7.1.tar.gz。下载完安装文件以后,需要对文件进行解压。按照Linux系统使用的默认规范,用户安装的软件一般都是存放在“/usr/local/”目录下。请使用hadoop用户登录Linux系统,打开一个终端,执行如下命令:
$ cd ~/下载 # 进入下载目录
$ wget http://10.132.239.12:8000/file/hadoop-2.7.1.tar.gz # 下载hadoop软件
$ sudo tar -zxf ~/下载/hadoop-2.7.1.tar.gz -C /usr/local # 解压到/usr/local中
$ cd /usr/local/
$ sudo mv ./hadoop-2.7.1/ ./hadoop # 将文件夹名改为hadoop
$ sudo chown -R hadoop ./hadoop # 修改文件权限
Hadoop解压后即可使用,可以输入如下命令来检查 Hadoop是否可用,成功则会显示 Hadoop版本信息:
$ cd /usr/local/hadoop
$ ./bin/hadoop version
3.2.2 单机模式配置
Hadoop默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。Hadoop附带了丰富的例子,运行如下命令可以查看所有例子:
$ cd /usr/local/hadoop
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar
上述命令执行后,会显示所有例子的简介信息,包括grep、join、wordcount等。这里选择运行grep例子,可以先在“/usr/local/hadoop”目录下创建一个文件夹input,并复制一些文件到该文件夹下,然后,运行grep程序,将 input文件夹中的所有文件作为grep的输入,让grep程序从所有文件中筛选出符合正则表达式“dfs[a-z.]+”的单词,并统计单词出现的次数,最后,把统计结果输出到“/usr/local/hadoop/output”文件夹中。完成上述操作的具体命令如下:
$ cd /usr/local/hadoop
$ mkdir input
$ cp ./etc/hadoop/*.xml ./input # 将配置文件复制到input目录下
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
$ cat ./output/* # 查看运行结果
执行成功后,输出了作业的相关信息,输出的结果是符合正则表达式的单词 “dfsadmin”出现了1次。
需要注意的是,Hadoop默认不会覆盖结果文件,因此,再次运行上面实例会提示出错。如果要再次运行,需要先使用如下命令把output文件夹删除:
$ rm -r ./output
3.2.3 伪分布式模式配置
Hadoop可以在单个节点(一台机器)上以伪分布式的方式运行,同一个节点既作为名称节点(NameNode),也作为数据节点(DataNode),读取的是分布式文件系统 HDFS 中的文件。
修改配置文件
这里修改配置文件:需要我们进入虚拟机左侧的文件计算机文件夹内,找到下面路径下面的文件,然后右击文件,选择打开方式vim,然后就可以进行编辑了,可以复制粘贴进去,在粘贴的时候需要右击鼠标才能粘贴哦~,然后同样的方法保存退出。
需要配置相关文件,才能够让Hadoop在伪分布式模式下顺利运行。Hadoop的配置文件位于“/usr/local/hadoop/etc/hadoop/”中,进行伪分布式模式配置时,需要修改2个配置文件,即core-site.xml和hdfs-site.xml。
可以使用vim编辑器打开core-site.xml文件,它的初始内容如下:
<configuration>
</configuration>
修改以后,core-site.xml文件的内容如下:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
在上面的配置文件中,hadoop.tmp.dir用于保存临时文件,若没有配置hadoop.tmp.dir这个参数,则默认使用的临时目录为“/tmp/hadoo-hadoop”,而这个目录在Hadoop重启时有可能被系统清理掉,导致一些意想不到的问题,因此,必须配置这个参数。fs.defaultFS这个参数,用于指定HDFS的访问地址,其中,9000是端口号。
同样,需要修改配置文件hdfs-site.xml,修改后的内容如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
执行名称节点格式化
修改配置文件以后,要执行名称节点的格式化,命令如下:
$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format
如果格式化成功,会看到“successfully formatted”和“Exitting with status 0
”的提示信息,若为“Exitting with status 1”,则表示出现错误。
启动Hadoop
执行下面命令启动Hadoop:
$ cd /usr/local/hadoop
$ ./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格
启动时可能会出现如下警告信息:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN
这个警告提示信息可以忽略,并不会影响Hadoop正常使用。
Hadoop启动完成后,可以通过命令 jps 来判断是否成功启动,命令如下:
$ jps
若成功启动,则会列出如下进程:NameNode、DataNode和SecondaryNameNode。
通过start-dfs.sh命令启动Hadoop以后,就可以运行MapReduce程序处理数据,此时是对HDFS进行数据读写,而不是对本地文件进行读写。
使用Web界面查看HDFS信息
Hadoop成功启动后,可以在Linux系统中(不是Windows系统)打开一个浏览器,在地址栏输入地址“http://localhost:50070
”,就可以查看名称节点和数据节点信息,还可以在线查看 HDFS 中的文件。
运行Hadoop伪分布式实例
上面的单机模式中,grep例子读取的是本地数据,伪分布式模式下,读取的则是分布式文件系统HDFS 上的数据。要使用HDFS,首先需要在HDFS中创建用户目录(本教程全部统一采用hadoop用户名登录Linux系统),命令如下:
$ cd /usr/local/hadoop
$ ./bin/hdfs dfs -mkdir -p /user/hadoop
接着需要把本地文件系统的“/usr/local/hadoop/etc/hadoop”目录中的所有xml文件作为输入文件,复制到分布式文件系统HDFS中的“/user/hadoop/input”目录中,命令如下:
$ cd /usr/local/hadoop
$ ./bin/hdfs dfs -mkdir input #在HDFS中创建hadoop用户对应的input目录
$ ./bin/hdfs dfs -put ./etc/hadoop/*.xml input #把本地文件复制到HDFS中
复制完成后,可以通过如下命令查看HDFS中的文件列表:
$ ./bin/hdfs dfs -ls input
执行上述命令以后,可以看到input目录下的文件信息。
现在就可以运行Hadoop自带的grep程序,命令如下:
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
运行结束后,可以通过如下命令查看HDFS中的output文件夹中的内容:
$ ./bin/hdfs dfs -cat output/*
需要强调的是,Hadoop运行程序时,输出目录不能存在,否则会提示如下错误信息:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists
因此,若要再次执行grep程序,需要执行如下命令删除HDFS中的output文件夹:
$ ./bin/hdfs dfs -rm -r output # 删除 output 文件夹
关闭Hadoop
如果要关闭Hadoop,可以执行下面命令:
$ cd /usr/local/hadoop
$ ./sbin/stop-dfs.sh
下次启动Hadoop时,无需进行名称节点的初始化(否则会出错),也就是说,不要再次执行“hdfs namenode -format”命令,每次启动Hadoop只需要直接运行start-dfs.sh命令即可。
配置PATH变量
前面在启动Hadoop时,都要加上命令的路径,比如,“./sbin/start-dfs.sh”这个命令中就带上了路径,实际上,通过设置PATH变量,就可以在执行命令时,不用带上命令本身所在的路径。具体操作方法是,首先使用vim编辑器打开“~/.bashrc”这个文件,然后,在这个文件的最前面位置加入如下单独一行:
export PATH=$PATH:/usr/local/hadoop/sbin
添加后,执行命令“source ~/.bashrc”使设置生效。设置生效后,在任何目录下启动Hadoop,都只要直接输入start-dfs.sh命令即可,同理,停止Hadoop,也只需要在任何目录下输入stop-dfs.sh命令即可。