一、在单节点上配置Hadoop
一、基础环境配置
Ubuntu 20.04/Hadoop3.2/JDK8/Hadoop单节点配置/Hadoop集群配置/超级详细,本人自己的配置流程
1、基础环境
Ubuntu 20.04 LTS、Hadoop3.2、JDK8
1、Ubuntu 20.04 LTS
Ubuntu 20.04 LTS下载(从阿里云):https://mirrors.aliyun.com/ubuntu-releases/focal/ubuntu-20.04.5-live-server-amd64.iso
下载速度还可以,Ubuntu 20.04 LTS的安装教程这里不做介绍,需要自己查
2、Hadoop3.2
hadoop-3.2.0.tar.gz 下载地址 http://archive.apache.org/dist/hadoop/core/hadoop-3.2.0/
或者从百度云盘下载 链接:https://pan.baidu.com/s/1PXXE9d6xi43nYMPN6YCsAw
提取码:72el
3、JDK8
jdk-8u351-linux-x64.tar.gz下载地址oracle官网 https://download.oracle.com/otn/java/jdk/ 需要登录Oracle账号,下载的版本为
或者从百度云盘下载 链接:https://pan.baidu.com/s/1yiRzvgLLudm0d5OTMgdSGQ
提取码:q7yy
2、修改主机名字
[sst@hadoop01 ~]$ sudo hostnamectl set-hostname ‘hadoop01’
3、配置静态ip,
虚拟机选择桥接模式
第一步:cd /etc/netplan
[sst@hadoop01 ~]$ cd /etc/netplan
[sst@hadoop01 ~]$ vim 01-network-manager-all.yaml
第二步:修改01-network-manager-all.yaml
修改结果入下
network:
ethernets:
ens33:
dhcp4: no
dhcp6: no
addresses: [192.168.31.200/24]
gateway4: 192.168.31.1
nameservers:
addresses: [192.168.31.1]
version: 2
4、设置无密码 ssh
现在检查您是否可以在没有密码的情况下通过 ssh 连接到本地主机:
$ ssh 192.168.31.200 #本机ip
如果没有密码,则无法通过 ssh 连接到本地主机,请执行以下命令:
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
二、安装JDK
1、加压jdk /usr/local/java/
[sst@hadoop01 ~]$ sudo mkdir /usr/local/java
[sst@hadoop01 ~]$ sudo tar -zxvf jdk-8u351-linux-x64.tar.gz -C /usr/local/java/
2、随后配置jdk环境
[sst@hadoop01 ~]$ sudo vim /etc/profile
vi 或者vim都可以打开/etc/profile 文件,添加以下代码
29 export JAVA_HOME=/usr/local/java/jdk1.8.0_351
30 export PATH=$PATH:$JAVA_HOME/bin
如图所示
3、修改完成后更新配置
[sst@hadoop01 ~]$ source /etc/profile
三、安装配置Hadoop
1、加压hadoop
[sst@hadoop01 ~]$ sudo tar -zxvf hadoop-3.2.0.tar.gz -C /usr/local
可以看到/usr/local目录下存在hadoop-3.2.0文件夹
[sst@hadoop01 ~]$ cd /usr/local
[sst@hadoop01 /usr/local]$ ls
bin etc games hadoop-3.2.0 include java lib man sbin share src
[sst@hadoop01 /usr/local]$ sudo mv ./hadoop-3.2.0/ ./hadoop #将文件夹名改为hadoop
[sst@hadoop01 /usr/local]$ sudo chown -R sst ./hadoop # 修改文件夹所属用户为sst
修改后ls查看
2、验证hadoop是否安装成功
[sst@hadoop01 /usr/local]$ cd /usr/local/hadoop
[sst@hadoop01 /usr/local/hadoop]$ ./bin/hadoop version
显示Hadoop版本
3、配置hadoop环境
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ vim ~/.bash_profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_351
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ source ~/.bash_profile
4、创建文件夹
进入到解压后的hadoop目录
[sst@hadoop01 ~]$ cd /usr/local/hadoop/etc/hadoop
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$
#创建以下文件夹
[sst@hadoop01 /usr/local/hadoop]$ mkdir tmp
[sst@hadoop01 /usr/local/hadoop]$ mkdir tmp/dfs
[sst@hadoop01 /usr/local/hadoop]$ mkdir tmp/dfs/name #用于存放name
[sst@hadoop01 /usr/local/hadoop]$ mkdir tmp/dfs/data
5、修改Hadoop配置文件
配置文件作用
- core-site.xml 指定hdfs的访问方式
- hdfs-site.xml 指定namenode 和 datanode 的数据存储位置
- mapred-site.xml 配置mapreduce
- yarn-site.xml 配置yarn
修改hadoop-env.sh
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ vim hadoop-env.sh
#找到下面内容添加java home
export JAVA_HOME=/usr/local/java/jdk1.8.0_351
如图:
修改 core-site.xml 在 <configuration>节点中添加
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
修改hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
配置主机映射:将主机静态ip绑定到 hadoop01
[sst@hadoop ~]$ vim /etc/hosts
来到hadoop的bin目录
[sst@hadoop01 /usr/local/hadoop/bin]$ cd /usr/local/hadoop/bin
[sst@hadoop01 /usr/local/hadoop/bin]$ ./hdfs namenode -format #(格式化,这个命令只运行一次)
启动hdfs 进入到 /usr/local/hadoop
[sst@hadoop01 /usr/local/hadoop]$ sbin/start-dfs.sh
启动成功结果
命令行输入jps,可以查看当前hadoop启动的进程
在浏览器输入网址 http://192.168.31.200:9870/ 可以查看当前资源使用情况
完成后,使用以下命令停止守护程序:
$ sbin/stop-dfs.sh
---------------------------------------至此,单节点配置成功!!----------------------------------------------------------------------
二、在多节点上配置Hadoop
一、拷贝虚拟机
1、找到当前ubuntu安装的文件夹
2、拷贝该文件夹到其他电脑用
3、找到 .vmx后缀文件
4、在vmware 中一次选择
文件 —> 打开
找到拷贝过来的文件夹,选择 .vmx后缀结尾的文件选择打开
5、修改虚拟机设置
复制完成,先不要打开虚拟机,先修改虚拟机设置,
注意,我们三台虚拟机是装在三台不同电脑上,所以要保证这三台电脑的连接了同一个局域网下,且虚拟机的网络适配器要选择桥接模式,这样保证不同虚拟上的ip处于同一个局域网内,实现互相通信。 本机在复制前设置的静态ip是192.168.31.200,都在192.168.31.1~192.168.31.255这个网段内。
无论是所有节点虚拟机都要选择桥接模式,且不同如果虚拟机
除了设置桥接模式,这里还需要3台虚拟机生成不同的MAC地址(因为我们是把一台虚拟机复制了三份,所以默认的MAC都是一样的)
点击上图的 高级,弹出下框,在MAC地址(M)后,点击 生成 即可
二、开启虚拟机
注意:最好不要三台虚拟机同时启动,以为目前三天虚拟配置的是同一静态ip(避免不必要冲突可能),而是逐一配置好IP后再同时开启
1、开启虚拟机弹框选择则 移动虚拟机
2、修改静态ip
第一步:cd /etc/netplan
[sst@hadoop01 ~]$ cd /etc/netplan
[sst@hadoop01 ~]$ vim 01-network-manager-all.yaml
第二步:修改01-network-manager-all.yaml
修改结果入下(三台虚拟机的静态ip分别为192.168.31.200、192.168.31.201、192.168.31.202)
network:
ethernets:
ens33:
dhcp4: no
dhcp6: no
addresses: [192.168.31.200/24] #只有这里不同
gateway4: 192.168.31.1
nameservers:
addresses: [192.168.31.1]
version: 2
3、修改主机名字
三台虚拟机分别设置名字为 hadoop01、hadoop02、hadoop03
[sst@hadoop01 ~]$ sudo hostnamectl set-hostname ‘hadoop01’
4、修改hosts文件
这是为了方便集群配置时,只给主机名,系统能根据主机名映射到ip地址
vim /etc/hosts
#将一下添加到hosts文件,三台虚拟机都一样配置一下三条
192.168.31.200 hadoop01
192.168.31.201 hadoop02
192.168.31.202 hadoop03
5、配置无密钥登录
注意:1、此步骤需要在以上4步分别在三台虚拟机配置完成后,同时开机三台虚拟机,才能执行。
2、三台虚拟都需要配置
第一步:先清除之前单机配置ssh
rm -rf ~/.ssh #清除家目录下的 .ssh文件夹
如果没有密码,则无法通过 ssh 连接到本地主机,请执行以下命令:
[sst@hadoop01 ~] $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa #生成公钥和私钥,敲完此命令后,连续按3个回车即可。
#以上操作在三台机器执行完后在进行下面操作
#执行以下命令会时需要输入不同虚拟机的sst的用户密码,
#执行以下命令将会将本机的的公钥 即~/.ssh/id_rsa.pub的内容追加写入到远程机器的~/.ssh/authorized_keys
[sst@hadoop01 ~]$ ssh-copy-id hadoop01
[sst@hadoop01 ~]$ ssh-copy-id hadoop02
[sst@hadoop01 ~]$ ssh-copy-id hadoop03
#这里之所以需要三台机器都要拷贝,是因为一份是将本机id_rsa.pub拷贝到本机的authorized_keys
三、修改Hadoop配置文件
1、cd到我们安装Hadoop和文件夹
[sst@hadoop01 ~/.ssh]$ cd /usr/local/hadoop/
#再进入配置文件所在文件夹
[sst@hadoop01 /usr/local/hadoop]$ cd etc/hadoop/
2、修改vim core-site.xml文件
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ vim core-site.xml #配置内容如下
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
</configuration>
3、修改hdfs-site.xml文件
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ vim hdfs-site.xml #配置内容如下
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
4、修改mapred-site.xml文件
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ vim mapred-site.xml #配置内容如下
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>
以下是在出现运行hadoop后,执行了计算任务时报错,新增的配置,
报错提示,需要在mapred-site.xml增加以下几项配置
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value></property>
HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}
遇到此报错后,以下是解决办法
首先执行以下命令
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ hadoop classpath
/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/share/hadoop/yarn:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$
然后将${full path of your hadoop distribution directory}替换成返回的路径
以下是修改后的mapred-site.xml配置文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/share/hadoop/yarn:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/share/hadoop/yarn:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/share/hadoop/yarn:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*</value></property>
</configuration>
解决以上报错可能有更好的办法,之所出现报错可能有些地方配置文件没配好。
5、修改yarn-site.xml文件
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ vim yarn-site.xml #配置内容如下
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop01:8031</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
6、修改workers文件
[sst@hadoop01 /usr/local/hadoop/etc/hadoop]$ vim workers #配置内容如下
hadoop01
hadoop02
hadoop03
7、重新初始化节点
在重新初始化hdfs namenode -format前,还有一步要做
因为我们是在单机迁移过来的,,之前执行过一次hdfs namenode -format,所以每个节点都已经namenode节点了,这里要先清除
[sst@hadoop01 /usr/local/hadoop]$ rm -rf logs #先清除所有logs文件夹
[sst@hadoop01 /usr/local/hadoop]$ mkdir logs #创建logs文件夹
[sst@hadoop01 /usr/local/hadoop]$ cd tmp/dfs #cd dfs文件
[sst@hadoop01 /usr/local/hadoop/tmp/dfs]$ rm -rf data name namesecondary #删除dfs下的三个文件夹
[sst@hadoop01 /usr/local/hadoop/tmp/dfs]$ mkdir data name #删除data name两个文件夹
以上清理需要在三台虚拟机都要一模一样操作。
#以上操作完成后再主机节点也是hadoop01重新初始化namenode节点
[sst@hadoop01 /usr/local/hadoop/bin]$ cd /usr/local/hadoop/bin
[sst@hadoop01 /usr/local/hadoop/bin]$ ./hdfs namenode -format #(格式化,这个命令只运行一次)
四、启动Hadoop
1、启动Hadoop
进入到 /usr/local/hadoop,执行命令sbin/start-all.sh,启动所有节点
[sst@hadoop01 /usr/local/hadoop]$ sbin/start-all.sh
2、启动成功结果
命令行输入jps,可以查看当前hadoop启动的进程
在浏览器输入网址 http://192.168.31.200:9870/ 可以查看namenode节点情况使用情况
可以看到总容量118.69GB,因为我每天台虚拟机配40GB的磁盘空间,可以看到活跃节点3个
点击查看 Live Nodes
在浏览器输入网址 http://192.168.31.200:8088/,可以查看当前计算任务及其硬件资源使用情况,不过这里我没运行,所以看不到
点击节点,可以看到有3个节点资源,每个节点有8GB内存可用
3、关闭Hadoop
-
完成后,使用以下命令停止守护程序:
$ sbin/stop-all.sh
----------------------------------------------------------- 至此,Hadoop集群配置成功。!!!-----------------------------------------------------------
三、上传Shakespeare文件到HDFS–(这部分是我的课程作业)
事先将 Shakespeare文件夹保存到sst的用户家目录下
1、查看当前HDFS文件系统根目录有啥,
[sst@hadoop01 ~]$ hadoop fs -ls /
可以卡到为空,下面执行put命令,将本地Shakespeare文件夹上传到HDFS,在用ls命令查看
[sst@hadoop01 ~]$ hadoop fs -put Shakespeare /
[sst@hadoop01 ~]$ hadoop fs -ls /
Found 1 items
drwxr-xr-x - sst supergroup 0 2022-12-03 11:24 /Shakespeare
2、查看play文件夹里的文件
[sst@hadoop01 ~]$ hadoop fs -ls /Shakespeare/data/play
-------------------------------------------------------至此,上传文件至HDFS完成------------------------------------------------------------------------------
四、完成入门程序
使用mapreduce分别统计Shakespeare文件中play 和sonnet的单词数量
1、Hadoop Streaming 实现wordcount
代码默认找计算的单词位置是play,计数sonnet只需替换即可
1、编写代码文件mapper.py
import sys
#输入为标准输入stdin
for line in sys.stdin:
#删除开头和结尾的空行
line = line.strip()
#以默认空格分隔单词到words列表
words = line.split()
for word in words:
#输出所有单词,格式为“单词 1”以便作为Reduce的输入
print("%s %s"%(word,1))
2、编写代码文件reducer.py
import sys
current_word = 'play' #如果统计sonnets,则换成'sonnets',这里采用严格匹配,
#如果需要忽略大小写和单复数,可采用正则表达式
current_count = 0
word = None
#获取标准输入,即mapper.py的标准输出
for line in sys.stdin:
#删除开头和结尾的空行
line = line.strip()
#解析mapper.py输出作为程序的输入,以tab作为分隔符
word,count = line.split()
#转换count从字符型到整型
try:
count = int(count)
except ValueError:
#count非数字时,忽略此行
continue
#要求mapper.py的输出做排序(sort)操作,以便对连续的word做判断
if current_word == word:
current_count += count
#输出统计结果
print("%s\t%s"% (current_word,current_count))
注:hadoop-streaming会主动将map的输出数据进行字典排序
3、编写streaming.sh
此文件是启动提交mapreduce计算任务
#!/bin/bash
# hadoop streaming jar包所在位置
STREAM_JAR_PATH="/root/bigdata/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.2.0.jar"
INPUT_FILE_PATH_1="/Shakespeare/data/play" #要进行词频统计的文档在hdfs中的路径
#当统计'sonnet'词频时,只需将路径更改成此路径即可 "/Shakespeare/data/sonnet"
OUTPUT_PATH="/output" #MR作业后结果的存放路径
hadoop fs -rm -r -skipTrash $OUTPUT_PATH # 输出路径如果之前存在 先删掉否则会报错
hadoop jar $STREAM_JAR_PATH \
-input $INPUT_FILE_PATH_1 \ # 指定输入文件位置
-output $OUTPUT_PATH \ #指定输出结果位置
-mapper "python mapper.py" \ #指定mapper执行的程序
-reducer "python reducer.py" \ # 指定reduce阶段执行的程序
-file ./mapper.py \ # 通过-file 把python源文件分发到集群的每一台机器上
-file ./reducer.py
4、先将以上三个文件保存到家目录
5、执行脚本
注意:需要执行前ubuntu需转好pthon3,正常安装的Ubuntu20.04版本已经自带了python3.8,其他版本如果没装python3,需先安装
[sst@hadoop01 ~]$ ./streaming.sh
6、查看运行过程和结果
执行过程中,命令行输入jps,可看到比没启动streaming多了个YarnChild进程
在http://192.168.31.200:8088/ 查看节点使用情况 看到内存有使用
首页也会出现运行的任务,状态是RUNNING,结束后状态时FINISHED ,最终状态是SUCCESSED,下图两条记录,一条是真正运行,一条是运行结束成功的。
下图是运行时节点资源使用情况
任务结束后,控制台提示
查看计算结果
[sst@hadoop01 ~]$ hadoop fs -cat /output/part-00000
hadoop fs -cat /output1/part-00000
五、两次单词统计耗时(这部分也是作业)
1、查看耗时
打开 http://192.168.31.200:8088/ ,
在任务列表,点击ID, 可以查看运行任务的详细信息
下图为任务列表
下图显示统计play是的任务信息,可见总耗时37秒
下图显示统计sonnets是的任务信息,可见总耗时2分6秒
2、数据对比
play | sonnet | |
---|---|---|
文件数量 | 37 | 154 |
单文件单词量 | 23000左右 | 150左右 |
计数结果 | 208 | 154 |
任务耗时 | 37秒 | 2分6秒 |
3、分析
本次实验结果统计出词频接近,但是2个任务耗时相差较大。分析原因是由文件数量和单文件词汇量相差太大造成的。sonnet是小文件,且文件数量少,plays的是大文件,文件数量少。
首先,HDFS不适合批量存储小文件,文件的元数据保存在NameNode的内存中,一个文件/目录/文件块一般占有150字节的元数据内存空间,小文件数量过多会批量占用NameNode的内存,会造成寻道时间>=读取文件时间,导致程序运行速度下降。
其次,在执行mapreduce任务前应将小文件进行合并,因为大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致mapreduce运行较慢。
时