工欲善其事必先利其器,在学习新的技术之前,我们必须搭建好一个适合的环境,但万事开头难,搭建环境的各种错误劝退了不少人,Pola 安装的过程中真的是错误百出,一度想放弃,但是Pola坚持下来了,并基于参考文章写出来这篇教程,本篇教程就是Pola在配置一台虚拟机的hadoop时写的,所以每一步都经过Pola测试,Pola有理由相信,你按照以下步骤去认真的进行Hadoop的单机配置或者伪分布式配置,是绝对不会出错的!!!
Pola在解决安装过程中的错误的时候没有怎么记录(错误太多了),所以如果你出现错误了可以评论或私信,因为你的问题Pola一定遇见过,不要怀疑Pola这个只要配置环境就必踩坑的天选之子!!!
本教程基于 CentOS 7 64位 作为系统环境(其他系统也可以,因为安装步骤是一样的,但是需要切换成你对应系统的命令和文件)
我们安装系统后登录使用的多是 root 用户,但其实这样并不安全。因此,在安装Hadoop前,我们要创建一个 hadoop 用户:
useradd hadoop # 创建hadoop用户
passwd hadoop # 设置hadoop用户的密码,按提示输入两次密码
⭐ 注意:密码需要输两次,如果提示无效,说明你的密码等级过低不安全,但是你不想换密码也可以继续输入密码进行确定
hadoop 用户是我们创建的普通用户,系统为了安全,会对普通用户的一些操作做限制,但这对我们配置环境来说不是很方便,因此我们需要为 hadoop 用户增加管理员的权限,之后便可以使用 sudo 命令进行一些限制操作:
vi /etc/sudoers
打开 sudoers文件,找到 root ALL=(ALL) ALL,在其下面一行添加普通用户,我们的普通用户是 hadoop,则添加 hadoop ALL=(ALL) ALL,如下所示:
⭐ 注意:退出关闭时使用 wq!
强制保存并退出,否则会提示 E45:'readonly' option is set(add ! to override)
之前的操作我们一直是以 root 用户的身份在登录,但是之后的操作我们需要切换为 hadoop 用户,输入以下命令切换用户:
su hadoop # 切换为hadoop用户登录
我们在下载软件时,可能会因为网络原因而下载失败,因此我们选择更新软件源,输入以下命令更新软件源:
sudo yum -y update # 更新源
⭐ 注意,我们现在登录的用户是hadoop,因此需要使用 sudo 命令来进行需要 root 权限的操作
集群、单机模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),在使用 SSH 登陆服务之前,我们需要先输入 yum list installed | grep openssh-server
命令检测 openssh-server 是否安装:
确定 openssh-server 已安装后,我们就可以愉快的使用 SSH 服务了,输入 ssh localhost
命令登陆本机:
按照以上的登陆方式:每次登陆都需要输入密码,很不方便,因此我们需要配置成SSH无密码登陆,更方便一点。具体操作如下:
exit
命令退出之前的 ssh,回到我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:exit # 退出之前的 ssh localhost
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa # 会有提示,一直按回车即可
cat ./id_rsa.pub >> ./authorized_keys # 加入授权
chmod 600 authorized_keys # 更改文件权限
之后再输入 ssh localhost
命令登陆时,就无需再输入密码,如下所示:
⭐ 注意:Hadoop3.1.3 需要 JDK 版本在 1.8 及以上
第一步,通过 Xftp 将下载好的 jdk 文件上传到 hadoop 用户的工作目录(即 /home/hadoop )下,如下图所示:
第二步,执行以下命令解压缩JDK文件(注意:当前登录用户名是hadoop),如下所示:
cd /home/hadoop # 进入用户家目录
sudo mkdir -p /usr/lib/jvm # 创建/usr/lib/jvm目录用来存放JDK文件
sudo tar -zxvf jdk-8u131-linux-x64.tar.gz -C /usr/lib/jvm # 把JDK文件解压到/usr/lib/jvm目录下
cd /usr/lib/jvm # 进入/usr/lib/jvm目录下
ls #查看当前目录(即/usr/lib/jvm)的文件
可以看到,/usr/lib/jvm 目录下有一个 jdk1.8.0_131 目录
第三步,执行以下命令配置环境变量(注意:当前登录用户名是 hadoop),如下所示:
cd ~ # 进入用户家目录,注意:~ 等价于 /home/hadoop
sudo vi ~/.bash_profile # 编辑当前hadoop用户的环境变量配置文件(该文件只影响当前用户)
打开文件后,在文件末尾处添加以下内容( jdk 版本根据个人安装版本进行填写),保存并退出:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source ~/.bash_profile
然后可以执行以下命令查看是否安装成功:
java -version
⭐ 注意:我们安装的是 Hadoop3.1.3
第一步,通过 Xftp 将下载好的 Hadoop3.1.3 文件上传到 hadoop 用户的工作目录(即 /home/hadoop )下,如下图所示:
第二步,执行以下命令解压缩 hadoop3.1.3 文件(注意:当前登录用户名是 hadoop),如下所示:
sudo tar -zxf ~/hadoop-3.1.3.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/ # 进入/usr/local目录下
sudo mv ./hadoop-3.1.3/ ./hadoop # 将hadoop-3.1.3文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
Hadoop 解压后即可使用,输入以下命令检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
cd /usr/local/hadoop # 进入/usr/local/hadoop目录
./bin/hadoop version # 查看hadoop版本信息
Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。即 Hadoop 安装成功后即可使用。我们可以执行一些例子来感受一下 Hadoop 的运行。Hadoop 附带了丰富的例子,运行以下命令可以看到所有例子,包括 wordcount、terasort、join、grep 等:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar
我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选其中符合正则表达式 dfs[a-z.]+ 的单词并统计单词出现的次数,然后将结果输出到 output 文件夹中,具体执行命令如下:
cd /usr/local/hadoop # 进入/usr/local/hadoop目录
mkdir ./input # 在当前目录下,创建input目录
cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入复制到input目录下
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep ./input ./output 'dfs[a-z.]+' # 运行grep实例
cat ./output/* # 查看运行结果
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,其读取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改 2 个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
执行以下命令修改 core-site.xml 文件:
cd /usr/local/hadoop/etc/hadoop/ # 进入/usr/local/hadoop/etc/hadoop/目录
sudo vi core-site.xml # 编辑 core-site.xml 文件
<configuration>
</configuration>
修改为以下的配置:
<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>
执行以下命令修改 hdfs-site.xml 文件:
# 注意当前目录是/usr/local/hadoop/etc/hadoop/目录
sudo vi hdfs-site.xml # 编辑 hdfs-site.xml 文件
打开 hdfs-site.xml 文件后,将其中的
<configuration>
</configuration>
修改为以下的配置:
<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>
执行以下命令修改 hadoop-env.sh 文件:
# 注意当前目录是/usr/local/hadoop/etc/hadoop/目录
sudo vi hadoop-env.sh # 编辑 hadoop-env.sh 文件
在 hadoop-env.sh 文件里找到 # export JAVA_HOME=
这行,如下所示:
将其修改为JAVA安装路径的具体地址,如下所示:
以上配置完成后,执行以下命令进行 NameNode 的格式化:
cd /usr/local/hadoop # 进入/usr/local/hadoop目录
./bin/hdfs namenode -format # 执行 NameNode 的格式化
成功的话,会看到 successfully formatted
的提示,具体返回信息类似以下内容:
NameNode 格式化后,接着执行以下命令开启 NameNode 和 DataNode 守护进程:
cd /usr/local/hadoop # 进入/usr/local/hadoop目录
./sbin/start-dfs.sh # 注意:start-dfs.sh 是个完整的可执行文件,中间没有空格
然后执行以下 jps
命令判断是否成功启动,若成功启动则会列出以下进程:NameNode
、DataNode
、SecondaryNameNode
成功启动后,可以在虚拟机的浏览器上访问 Web 界面 http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件,也可以将localhost
替换为虚拟机的IP地址,在本机的浏览器上访问 Web 界面,例如我的虚拟机的IP地址是192.168.91.150
,我就可以将http://localhost:9870替换为http://192.168.91.150:9870,然后在我本机上进行访问,如下所示:
之前的单机模式,grep 例子里读取的是本地数据,而伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录,接着将./etc/hadoop
中的xml
文件作为输入文件复制到分布式文件系统中,即将/usr/local/hadoop/etc/hadoop
复制到分布式文件系统中的/user/hadoop/input
中。我们使用的是 hadoop 用户,并且已创建相应的用户目录/user/hadoop
,因此在命令中就可以使用相对路径如input
,其对应的绝对路径就是/user/hadoop/input
,具体执行命令如下:
cd /usr/local/hadoop # 进入/usr/local/hadoop目录
./bin/hdfs dfs -mkdir -p /user/hadoop # 在 HDFS 中创建用户目录
./bin/hdfs dfs -mkdir input # 在用户目录下创建input目录
./bin/hdfs dfs -put ./etc/hadoop/*.xml input # 将`./etc/hadoop`中的`xml`文件作为输入文件复制到input目录
./bin/hdfs dfs -ls input # 查看input目录的文件列表
测试实例我们仍旧选择 grep 例子,伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是 HDFS 中的文件,创建的也是 HDFS 中的文件(可以将单机步骤中创建的本地 input 文件夹和输出结果 output 文件夹都删掉来验证这一点),测试运行完 grep 实例后查看运行结果(查看的是位于 HDFS 中的输出结果),具体执行命令如下:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+' # 运行测试实例,注意当前目录是/usr/local/hadoop目录
./bin/hdfs dfs -cat output/* # 查看位于 HDFS 中的输出结果
⭐注意:我们更改了一些配置文件,所以运行结果与单机的运行结果不同
至此,我们完成了CentOS的Hadoop3.1.3 版本的单机配置和伪分布式配置,总结起来安装步骤就是文章开头显示的目录内容,但是需要注意,配置过程中一定要细心大胆,特别是用户身份切换、目录切换这些小细节,千万不要直接使用root用户直接进行操作,如果配置出错,不要着急,回过头看看你之前的配置是不是漏掉了哪些细节,真的解决不了的话,评论或者私信Pola,Pola帮你一起解决!
[参考文章:Hadoop3.1.3安装教程_单机/伪分布式配置_Hadoop3.1.3/Ubuntu18.04(16.04)]