02 Hadoop2.7 安装教程_单机、伪分布式配置
1、hadoop基础知识
1.1 hadoop是什么?
是指Apache软件基金会的一款开源软件
,允许用户使用简单的编程模型
实现跨机器集群
对海量数据进行分布式计算处理
1.2 hadoop核心组件
- hadoop HDFS(
分布式文件存储系统
):解决海量数据存储
- hadoop YARN(
集群资源管理和任务调度框架
):解决资源任务调度
- hadoop MapReduce(
分布式计算框架
):解决海量数据计算
1.3 hadoop工作流程
- HDFS存储数据
- 客户端发起请求,提交作业
- YARN分配资源,创建MapReduce任务
- 任务结果再入HDFS
- 作业结果返回客户端
1.3 hadoop核心组件介绍
1.3.1 HDFS
HDFS
:Hadoop DFS
Hadoop分布式文件系统
DFS
:Distributed FileSystem
分布式文件系统
HDFS的特点
-
在HDFS中,对于文件是进行切块保存
-
HDFS中有2类主要的节点:NameNode和DataNode
-
NameNode负责管理DataNode
-
DataNode负责存储数据
-
HDFS会对文件块进行自动的备份,每一个备份称之为复本(Replication),HDFS默认是3个复本
-
如果某一个DataNode宕机,那么在HDFS中默认将这个DataNode所存储的复本再进行一次备份,保证指定的复本数量,宕机的设备恢复后不会删除多余副本。
Block
-
在HDFS中,会对文件进行切块,每一个块实际上就是一个Block
-
Block是HDFS中存储的基本单位
-
Block在Hadoop1.0中的大小是64M,在Hadoop2.0中的大小是128M
-
如果一个文件或者数据的大小不满足Block的大小,那么这个文件或者数据是多大那么对应的Block就是多大
-
切块的意义:
a. 便于存储超大文件
b. 便于进行快速的备份 -
HDFS对每一个Block分配一个递增的编号
NameNode
- NameNode是HDFS中的核心节点,用于管理其他的DataNode
- NameNode本身会记录元数据(Meta Data)
- 元数据包含:
a. 文件的存储路径,例如/a.log,/test/b.txt
b. 复本数量
c. 文件所对应的文件块 — Block
d. 每一个Block的存储节点 - 每一条元数据一般是在150B大小左右
- 只有写请求会产生元数据,读请求不产生元数据
- 元数据在NameNode中存储在内存以及磁盘中
- 元数据存储在内存中的目的是为了快速查询
- 元数据存储在磁盘中是为了崩溃恢复
- 元数据存储在磁盘上的位置由core-site.xml中的属性hadoop.tmp.dir来决定,在指定的目录的子目录dfs/name/current下
- 元数据存储的文件:
a. edits:记录NameNode接收的每一次的写(上传、删除、追加)请求
b. fsimage:记录元数据,但是这个文件中的元数据不是实时的 - 当NameNode接收到一个新的写请求的时候,会先将这个请求写到edits文件中,当edits文件写成功之后,再去更改内存中的元数据,当内存中的元数据更改完毕之后,会个客户端返回一个成功信号
DateNode
-
DataNode用于存储数据,数据是以Block形式存储
-
DataNode通过心跳机制(每隔固定时间)来向NameNode发送心跳信号
心跳信号包含:
a. 当前节点的状态
b. 当前DataNode存储的数据 -
DataNode每隔3s向NameNode发送一次心跳
-
如果NameNode超过10min没有收到DataNode的心跳,那么NameNode认为这个DataNode已经lost(丢失)
-
当NameNode认为DataNode已经lost的时候,NameNode要将这个DataNode上的Block备份到其他的节点上
多副本放置策略
- 第一个复本:如果是从集群内部上传,哪个节点上传第一个复本就放在哪个节点上;如果是从集群外部上传,那么NameNode会选择一个相对比较空闲的DataNode存储第一个复本
- 第二个复本:放在和第一个复本不同机架的节点上
- 第三个复本:放在和第二个复本相同机架的节点上
- 更多复本:选择相对空闲的节点来放置
1.3.2 MapReduce
MapReduce定义
-
MapReduce作为大数据生态圈
第一代分布式计算引擎
-
MapReduce是采用一种
分而治之
的思想设计出来的分布式计算框架 -
如一项复杂的计算任务,单台服务器无法胜任时,可将此大任务切分成一个个小的任务,分别交给不同的服务器上并行执行,最终再汇总每个小任务的结果
-
MapReduce的分布式计算框架分为两个阶段:
第一个Map【映射】阶段 (Map负责“分”:把一个任务切分成多个任务)
第二个Reduce【规约】阶段(reduce负责“合”:汇总分解后多任务的结果)
MapReduce并行计算
- HDFS存储数据时对大于128M的数据会进行数据切分,每128M一个数据块,数据块会分散、分布存储到HDFS。
- MapReduce在进行计算前会复制计算程序,每个数据块会分配一个独立的计算程序副本(MapTack)。计算时多个数据块几乎同时被读取并计算,但是计算程序完全相同。最终将各个计算程序计算的结果进行汇总(Reduce来汇总)
MapReduce优缺点
优点
- MapReduce易于编程:他简单的实现一些接口,就可以完成一个分布式程序
- 良好的扩展性:可以通过简单的增加机器来扩展它的计算能力
- 高容错性:假设集群中一台集群挂了,他可以把上面的计算任务转移到另一个节点上运行,而不至于这个任务失败。
- 适合PB级以上海量数据的离线处理:集群中的服务器并发工作,数据处理能力强。
缺点
- 不擅长实时计算:无法像一些OLTP数据库一样,在毫秒或者秒级内返回结果。
- 不擅长流式计算:流式计算的输入数据是动态的,而MapReduce的输入集数据是静态的,不能动态变化。
1.3.3 Yarn
yarn作为分布式通用的集群资源管理系统和任务调度平台,支持各种计算引擎运行
1.4 hadoop优点
- 高可靠性
Hadoop 维护存储多个数据副本
,增加数据冗余,避免数据丢失,并且在任务失败后能自动地重新部署计算任务
- 高扩展性
Hadoop 集群可以方便地扩展更多的集群节点
- 高效性
Hadoop 能够在集群节点之间动态地移动数据,并保证各个节点数据的动态平衡,以并行的方式工作,处理速度非常快
- 高容错性
Hadoop 维护存储多个数据副本,并且能够自动将失败的任务重新分配
- 低成本
Hadoop 是开源框架,Hadoop集群允许通过部署普通廉价的集群组成集群来处理大数据。
Hadoop 使用 Java 语言编写,可以跨平台运行
1.5 Hadoop 生态圈
Hadoop 生态圈是指围绕 Hadoop 软件框架为核心而出现的越来越多的相关软件框架,这些软件框架和 Hadoop 框架一起构成了一个生机勃勃的 Hadoop 生态圈。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nmVnna6f-1664094811177)(imp/02-1Hadoop安装教程_单机伪分布式配置(Hadoop2.7)]/image-20220918123108516.png)
Hadoop 生态圈的架构图
Hadoop Common:Hadoop 体系最底层的一个模块,是其他模块的基础设施
HDFS:Hadoop 分布式文件系统,是 Hadoop 的基石
YARN:另一种资源协调器,是统一资源管理和调度平台
MapReduce:是一种编程模型,非常适合进行分布式计算
Spark:是当前最流行的开源大数据内存计算框架,可以基于Hadoop上存储的大数据进行计算
Flink:是当前最流行的开源大数据内存计算框架,用于实时计算的场景比较多
HBase:是一个分布式的、面向列族的数据库(底层依赖 HDFS),非结构化数据存储的数据库
Hive:是一个基于 Hadoop 的数据仓库工具(SQL 语句),可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行执行。
Pig:与Hive 类似,也是对大型数据集进行分析和评估的工具
Impala:与 Hive 类似,可以对存储在 HDFS、HBase的海量数据提交交互式 SQL 查询的工具
Mahout:是一个机器学习和数据挖掘库,可以实现经典的机器学习算法
Flume:是一个高可用、高可靠、分布式的海量日志采集框架
Sqoop:是一款开源的工具,主要用于在Hadoop、Hive与传统数据库(Mysql、Oracle)之间进行数据的传递,可以将一个关系型数据库中的数据导进HDFS中,也可以将HDFS的数据导入关系型数据库中
Kafka:是一种高吞吐量的分布式发布/订阅消息系统
ZooKeeper:是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等
、
2、Hadoop 的运行模式
2.1 单机模式
- 默认情况下,Hadoop即处于该模式,用于开发和调式。
不对配置文件进行修改。
使用本地文件系统
,而不是分布式文件系统。- Hadoop不会启动NameNode、DataNode、JobTracker、TaskTracker等守护进程,Map()和Reduce()任务作为同一个进程的不同部分来执行的。
用于对MapReduce程序的逻辑进行调试
,确保程序的正确。
守护进程(daemon):
是一类在后台运行的特殊进程,用于执行特定的系统任务。
很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
Map()和Reduce()任务
hadoop的分布式计算框架分为两个阶段,第一个是map阶段,第二个是reduce阶段。map阶段负责对输入文件进行切分处理,然后汇总再分组给reduce进行处理,以达到高效的分布式计算效率
2.2 伪分布模式
-
在一台主机模拟多主机。
-
Hadoop的守护进程运行在本机机器,模拟一个小规模的集群。
-
Hadoop启动NameNode、DataNode、JobTracker、TaskTracker这些守护进程都在
同一台机器上运行
,是相互独立的Java进程。 -
在这种模式下,
Hadoop使用的是分布式文件系统
,各个作业也是由JobTraker服务,来管理的独立进程。在单机模式之上增加了代码调试功能,允许检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。类似于完全分布式模式,因此,这种模式常用来开发测试Hadoop程序的执行是否正确。
-
修改4个配置文件:
core-site.xml
(配置Hadoop集群的特性:例如HDFS、MapReduce和YARN常用的I/O设置等)hdfs-site.xml
(配置HDFS集群的工作属性:Hadoop守护(守护是后台的意思)进程的配置项,包括namenode、辅助namenode(即SecondNameNode)和datanode等)mapred-site.xml
( 配置MapReduce集群的属性:MapReduce守护进程的配置项,包括作业历史服务器 )yarn-site.xml
( 配置Yarn集群的属性:YARN守护进程的配置项,包括资源管理器、web应用代理服务器和节点管理器 ) -
格式化文件系统
2.3 完全分布式模式
-
Hadoop的
守护进程运行在由多台主机搭建的集群
上,是真正的生产环境
。 -
在
所有的主机上安装JDK和Hadoop
,组成相互连通的网络。 -
在主机间设置
SSH(secure shell)免密码登录
,把各从节点生成的公钥添加到主节点的信任列表。 -
修改3个配置文件:
core-site.xml
(配置Hadoop集群的特性:例如HDFS、MapReduce和YARN常用的I/O设置等)hdfs-site.xml
(配置HDFS集群的工作属性:Hadoop守护(守护是后台的意思)进程的配置项,包括namenode、辅助namenode(即SecondNameNode)和datanode等)mapred-site.xml
( 配置MapReduce集群的属性:MapReduce守护进程的配置项,包括作业历史服务器 )yarn-site.xml
( 配置Yarn集群的属性:YARN守护进程的配置项,包括资源管理器、web应用代理服务器和节点管理器 ) -
指定NameNode和JobTraker的位置和端口,设置文件的副本等参数。
-
格式化文件系统
3、Hadoop单机配置
3.1 软件要求
-
Ubuntu18.04 64位
-
jdk-8u271-linux-x64.tar.gz
-
**Hadoop 2.7.7 **
3.2 环境要求
本教程使用 VMware12+Ubuntu18.04 64位 作为系统环境
本教程基于原生 Hadoop 2,在 Hadoop 2.7.7 (stable) 版本下验证通过,可适合任何 Hadoop 2.x.y 版本,如 Hadoop 2.7.1、2.6.3、2.4.1等
安装好了 VMware12+Ubuntu18.04 系统之后,在安装 Hadoop 前还需要做一些必备的配置工作。
如果以下命令在安装 Ubuntu 系统时已经完成配置 ,可以跳过
# 更新apt
# apt是包管理器。主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
sudo apt update
# 安装 VMware Tools(桌面全屏、windows与虚拟机之间可以拖放文件)
sudo apt install open-vm-tools-desktop -y
# 解决使用FinalShell不能连接Ubuntu的问题
# 解决SSH 远程登录的问题
sudo apt install openssh-server
# 解决不能使用ifconfig查看Ubuntu的IP地址
sudo apt install net-tools # 在虚拟机打开终端,先安装net-tools
ifconfig # 查看IP
ip addr # 查看IP(不需要安装)
ip a
# 在Ubuntu系统安装vim文本编辑器(可以在FinalShell连接Ubuntu后,在FinalShell完成)
# 也可以将后面用到 vim 的地方改为 nano,这样可以使用文本编辑器进行修改:
sudo apt install vim
# 解决ubuntu每次sudo都要输入密码
sudo visudo
把%sudo ALL=(ALL:ALL) ALL 修改为 %sudo ALL=(ALL:ALL) NOPASSWD:ALL
3.3 创建hadoop用户
如果你安装 Ubuntu 的时候不是用的 “hadoop” 用户,那么需要增加一个名为 hadoop 的用户。
1. 首先打开终端窗口,创建新用户 :
cat /etc/passwd # 查看所有用户的列表
sudo useradd -m hadoop -s /bin/bash # 创建新用户hadoop
这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。
2. 接着使用如下命令设置密码,可设置密码为123456,按提示输入两次密码:
sudo passwd hadoop
root@master:~# sudo passwd hadoop
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码
3. 可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题:
sudo adduser hadoop sudo
root@master:~# sudo adduser hadoop sudo
正在添加用户"hadoop"到"sudo"组...
正在将用户“hadoop”加入到“sudo”组中
完成。
4. 最后注销当前用户,重新登录hadoop用户
- 点击屏幕右上角选择切换用户,或者执行reboot重启系统,返回登陆界面使用hadoop 用户登录。
- 重新编辑Finalshell的登录用户名为hadoop,重新连接
3.4 安装SSH、配置SSH无密码登陆
集群、单节点模式都需要用到 SSH 登陆,Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:
1. 安装 SSH server
# 注:以下命令如果已安装过,可以跳过。
sudo apt install openssh-server
2. 登陆本机
ssh localhost # 本机的IP默认127.0.0.1 localhost映射到本机IP
此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 ,这样就登陆到本机了。
但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。
3. 配置成SSH无密码登陆:
exit # 退出刚才的登录,回到了我们原先的终端窗口
# 配置成SSH无密码登陆
ssh-keygen -t rsa # 利用ssh-keygen(注册机)生成公钥与私钥,会有提示,三次都按回车
cd ~/.ssh # 隐藏文件(查看命令:ls -al 或者 ll)
cat ./id_rsa.pub >> ./authorized_keys # 将密钥加入到授权中(authorized_keys存放公钥的地方)
ssh-keygen -t rsa :参数-t 指定创建rsa认证密钥
SSH 密钥默认保留在 ~/.ssh 目录中。 如果没有 ~/.ssh 目录,ssh-keygen命令会使用正确的权限创建一个。
id_rsa 是私钥文件
id_rsa.pub 是公钥文件‘>>’ 输出重定向:会在目标原有内容后追加内容,没有就创建。
’ >’ 输出重定向:会覆盖目标的原有内容,没有就创建。
4. 再次登陆本机
ssh localhost # 可能需要输入密码,退出再次登录就无需密码登录了
hostname # 查看主机名(因为是本机登录,故主机名是一样的)
如图:
3.5 安装Java环境
JDK 是使用 Java 编程语言构建应用程序的开发环境。
手动安装JDK方式
下载并手动安装JDK
- 下载网址:
https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
- 百度网盘下载地址:
链接:https://pan.baidu.com/s/1vDginShl7CC4O8a9Nq2_gg
提取码:1234
请把压缩格式的文件jdk-8u271-linux-x64.tar.gz
下载到本地电脑,并保存在Ubuntu
系统的“/home/hadoop/Downloads/
”目录下。
mkdir /home/hadoop/Downloads
或者:
mkdir ~/downloads
# 如果因为权限的限制,不能直接使用Finalshell进行拖动文件上传,使用以下方法赋于权限后就可以上传了
chmod -R 777 /home/hadoop/Downloads/
备注:
chmod :是改变权限的命令(change mode)
-R :当前目录及目录下所有文件
777 :可读、可写、可执行
在Linux命令行界面中,执行如下Shell命令(注意:当前登录用户名是hadoop):
cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
cd Downloads #注意区分大小写字母
sudo tar -zxvf ./jdk-8u271-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下
JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:
cd /usr/lib/jvm
ls
可以看到,在/usr/lib/jvm
目录下有个jdk1.8.0_271
目录。
配置环境变量:
cd ~
vim ~/.bashrc
在这个文件的开头位置添加内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_271
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
配置立即生效:
source ~/.bashrc
使用如下命令查看是否安装成功:
java -version
如果能够在屏幕上返回如下信息,则说明安装成功:
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
至此,就成功安装了Java环境。下面就可以进入Hadoop的安装。
3.6 安装 Hadoop 2.7.7
- 下载地址:
http://archive.apache.org/dist/hadoop/common/
选择下载 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的
- 百度网盘下载地址:
链接:https://pan.baidu.com/s/1vDginShl7CC4O8a9Nq2_gg
提取码:1234
请把下载的文件hadoop-2.7.7.tar.gz
保存在Ubuntu的“/home/hadoop/Downloads/”目录下。
解压安装 Hadoop :
sudo tar -zvxf ~/Downloads/hadoop-2.7.7.tar.gz -C /usr/local # 解压安装到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.7.7/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop:hadoop ./hadoop # 修改hadoop文件夹的用户和属组都是hadoop
sudo chmod -R 777 ./hadoop # 修改hadoop文件夹的读写权限为rwx(即777)
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
cd /usr/local/hadoop
./bin/hadoop version
3.7 配置Hadoop的环境变量
配置Hadoop环境变量:
vim ~/.bashrc
在文件最前面加入如下单独一行:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# /bin里面一般是普通可执行程序 ,而/sbin里多为系统管理程序和服务程序
配置生效:
source ~/.bashrc
添加后执行 source ~/.bashrc
使设置生效,在任意目录中,都可以直接使用 hadoop
等命令了.
例如执行 hadoop version
查看 hadoop 版本试试看。
3.8 初识Hadoop目录
3.9 Hadoop单机实例(非分布式)
Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。
非分布式即单 Java 进程,方便进行调试。
现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子:
cd /usr/local/hadoop
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar
# hadoop:$HADOOP_HOME/bin 下的shell脚本名。
# jar:hadoop脚本需要的command参数。
# jar包是对写好的java类进行了打包,类似ZIP文件
可以看到所有例子,包括 Wordcount、join、Grep 等。
3.9.1 Wordcount案例
- 这个程序可以统计某个文件中,各个单词出现的次数。
注:Wordcount是MapReduce的入门示例程序
Wordcount程序自带的jar包已经放置在hadoop安装目录下的 /share/hadoop/mapreduce
文件夹中。
-
在
/usr/local/hadoop
目录下面创建一个wcinput文件夹cd /usr/local/hadoop mkdir wcinput
-
在wcinput文件下创建一个wc.input文件,并输入以下内容
cd ./wcinput vim wc.input # 输入以下单词 hello hadoop hello mapreduce hello yarn
-
回到
/usr/local/hadoop
下,执行程序./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount wcinput wcoutput # .bin/hadoop jar :执行一个jar包程序 # share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar :jar包所在的目录 # wordcount :表示执行jar包程序中wordcount功能 # wcinput :输入目录 # wcoutput :输出目录
刷新/usr/local/hadoop
文件夹,会添加一个wcoutput 文件夹
- 查看结果
打开part-r-0000
文件
或者输入以下命令查看
cat part-r-0000
3.9.2 grep 案例
任务:
- 实现正则匹配
- 统计正则匹配到的字符出现的个数
dfs[a-z.]+
:查询dfs开头的,后面跟1个或1个以上的字母,比如 dfsa; dfsbgfg; dfscuhjhhkjgds
解释:我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+
的单词并统计出现的次数,最后输出结果到 output 文件夹中。
cd /usr/local/hadoop
mkdir ./input
cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar grep ./input ./output 'dfs[a-z.]+'
# .bin/hadoop jar :执行一个jar包程序
# share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar :jar包所在的目录
# wordcount :表示执行jar包程序中grep功能
# ./input :输入目录
# ./output :输出目录
# 'dfs[a-z.]+' :正则表达式(以dfs开头的任意字符串)
# 程序成功运行............
cat ./output/* # 查看运行结果
注意,Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会出错,需要先将 ./output
删除。
rm -r ./output
4、Hadoop伪分布式配置
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
-
在一台主机模拟多主机。
-
Hadoop的守护进程运行在本机机器,模拟一个小规模的集群。
-
Hadoop启动NameNode、DataNode、JobTracker、TaskTracker这些守护进程都在
同一台机器上运行
,是相互独立的Java进程。 -
JobTracker是一个后台服务进程
,启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息
,包括资源使用情况和任务运行情况等信息。
JobTracker 对应于 NameNode
TaskTracker 对应于 DataNode
DataNode 和NameNode 是针对数据存放来而言的
JobTracker和TaskTracker是对于MapReduce执行而言的、主节点称为作业节点(jobtracker)
从节点称为任务节点(tasktracker)
-
在这种模式下,
Hadoop使用的是分布式文件系统
,各个作业也是由JobTraker服务,来管理的独立进程。在单机模式之上增加了代码调试功能,允许检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。类似于完全分布式模式,因此,这种模式常用来开发测试Hadoop程序的执行是否正确。
-
修改配置文件:
core-site.xml
(配置Hadoop集群的特性:例如HDFS、MapReduce和YARN常用的I/O设置等)hdfs-site.xml
(配置HDFS集群的工作属性:Hadoop守护(守护是后台的意思)进程的配置项,包括namenode、辅助namenode(即SecondNameNode)和datanode等)mapred-site.xml
( 配置MapReduce集群的属性:MapReduce守护进程的配置项,包括作业历史服务器 )yarn-site.xml
( 配置Yarn集群的属性:YARN守护进程的配置项,包括资源管理器、web应用代理服务器和节点管理器 ) -
格式化文件系统
准备工作
4.1 克隆hadoop(单机)虚拟机
把上一步安装好的hadoop(单机)虚拟机克隆一份,在克隆出来的新虚拟机中进行伪分布配置
克隆的虚拟机具备的实验环境:
1、VMware12
2、ubtuntu 18.04 64位
3、ubtuntu 18.04 环境配置
4、JDK (jdk-8u271-linux-x64)
5、Hadoop 2.7.7
6、JDK和Hadoop的环境变量已配置
4.2 修改主机名
sudo vim /etc/hostname #修改文件(永久修改主机名)
# 清空文件内容,更改为以下内容后存盘退出
master
# 重启系统
sudo reboot
运行结果:
4.3 修改配置文件
伪分布式需要修改4个配置文件
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
本机中的Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/
路径中
Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
4.3.1 core-site.xml
将当中的
<configuration>
</configuration>
修改为下面配置:
<configuration>
<!--定hadoop运行时产生文件的存储路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<!-- 指定HDFS老大(namenode)的通信地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
解释 :
hadoop.tmp.dir
:是hadoop文件系统依赖的基础配置,很多路径都依赖它。比如HDFS的NameNode数据默认都存放这个配置的目录下它的默认位置是在 /tmp/{KaTeX parse error: Expected 'EOF', got '}' at position 5: user}̲下面,注意这是个临时目录!!!…user}下的所有东西都会丢失
<value>/usr/local/hadoop/tmp</value>
这里定义的路径注意修改为你自己的路径!!!
fs.defaultFS
: 代表配置NN节点地址和端口号fs.defaultFS - 这是一个描述集群中NameNode结点的URI(包括协议、主机名称、端口号);
- 集群里面的每一台机器都需要知道NameNode的地址。DataNode结点会先在NameNode上注册,这样它们的数据才可以被使用。
- 独立的客户端程序通过这个URI跟DataNode交互,以取得文件的块列表。
4.3.2 hdfs-site.xml
<configuration>
<!-- 文件的副本数,一份文件保存多少份 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 定义nameNode数据存储的目录路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/tmp/dfs/name</value>
</property>
<!-- 定义dataNode数据存储的目录路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/tmp/dfs/data</value>
</property>
<!-- 指定了http访问的地址与端口 -->
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
</configuration>
解读:
dfs.replication
:它决定着系统里面的文件块的数据备份个数。对于一个实际的应用,它应该被设为3(这个数字并没有上限,但更多的备份可能并没有作用,而且会占用更多的空间)。少于三个的备份,可能会影响到数据的可靠性(系统故障时,也许会造成数据丢失)。本次为单机所以填写1
dfs.namenode.name.dir
:这是NameNode结点存储Hadoop文件信息的本地系统路径。
dfs.datanode.data.dir
:这是DataNode结点被指定存储数据的本地文件系统路径。
将绑定IP改为0.0.0.0,而不是本地回环IP,这样,就能够实现外网访问本机的50070端口了
Hadoop配置文件说明
Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
4.3.3 mapred-site.xml
1.将样本文件复制为可使用的配置文件
mv mapred-site.xml.template mapred-site.xml
2.使用编辑器打开配置文件
sudo vim mapred-site.xml
3.修改配置文件
<configuration>
<!--指定MapReduce程序运行在YARN上(默认是运行在local)-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
解读:
yarn 是一种资源管理和作业调度技术,Hadoop 的核心组件之一
yarn 负责将系统资源分配给在 Hadoop 集群中运行的各种应用程序,并调度要在不同集群节点上执行的任务
yarn是 master/slave 结构,在资源管理框架中,ResourceManager 为 master,NodeManager 是 slaver。
4.3.4 yarn-site.xml
1.使用编辑器打开配置文件
sudo vim yarn-site.xml
2.修改配置文件
<configuration>
<!-- 定义yarn的机制 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
解读:
NodeManager上运行的附属服务,需配置成mapreduce_shuffle,才可运行MapReduce程序。
NodeManager是Slave上一个独立运行的进程,负责上报节点的状态;
这个属性用于指定在进行mapreduce作业时,yarn使用mapreduce_shuffle混洗技术
在MapReduce中,shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理
4.4 格式化与启动
4.4.1 NameNode 的格式化
cd /usr/local/hadoop
hdfs namenode -format
成功的话,会看到 “successfully formatted
” 的提示,若为 “Exitting with status 1” 则是出错。
4.4.2 启动进程
cd /usr/local/hadoop
启动方式1:
# 启动方式1
start-dfs.sh # 只启动namenode 和 datanode守护进程
检查已启动的进程
# jps是jdk查看当前java进程的工具
jps
成功启动进程如图:
启动方式2:
# 启动方式2
start-all.sh # 启动所有进程(如包括yarn的resourcemanager 和nodemanager)
检查已启动的进程
# jps是jdk查看当前java进程的工具
jps
成功启动进程如图:
可能会出现的错误:(如果成功启动以上的守护进程,可以跳过)
如果 SecondaryNameNode
没有启动,请运行 stop-dfs.sh
关闭进程,检查配置后再次尝试启动。
如果没有 NameNode
或 DataNode
,就是配置不成功,请仔细检查之前步骤,或查看启动日志排查原因。
Hadoop无法正常启动的解决方法
一般可以查看启动日志来排查原因,注意几点:
一般出错的提示在最后面,通常是写着
Fatal
、Error
、Warning
或者Java Exception
的地方。启动时会提示形如 “
DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out
”,其中 DBLab-XMU 对应你的机器名,但其实启动日志信息是记录在/usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log
中,所以应该查看这个后缀为 .log 的文件;每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,对比下记录的时间就知道了。
可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。
此外,若是
DataNode
没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做)# 针对 DataNode 没法启动的解决方法 cd /usr/local/hadoop stop-dfs.sh # 关闭dfs进程 rm -r ./tmp # 删除tmp目录,注意这会删除 HDFS 中原有的所有数据 hdfs namenode -format # 重新格式化 NameNode start-dfs.sh # 重启dfs进程
登录HDFSWeb浏览器(http://IP地址:50070
)
成功启动后,在windows浏览器中可以访问HDFS 的 Web 界面
http://192.168.36.158:50070 # 192.168.36.158 为主机的当前IP地址
可以查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
或者在虚拟机中的Firefox中用http://localhost:50070 进行web访问
4.4.3 结束进程
cd /usr/local/hadoop
# 可以使用以下两种方式结束进程
stop-dfs.sh # 只结束namenode 和datanode守护进程
stop-all.sh # 结束所有进程(如包括yarn的resourcemanager 和nodemanager)
4.5 Hadoop伪分布式实例
4.5.1 wordcount案例
注:Wordcount是MapReduce的入门示例程序
Wordcount程序自带的jar包已经放置在hadoop安装目录下的 /share/hadoop/mapreduce
文件夹中。
1.在 /usr/local/hadoop
文件夹下面创建一个wcinput文件夹
如前面做单机实例时已创建过该文件夹,就不需要再创建了
cd /usr/local/hadoop
mkdir wcinput
2.在wcinput目录下创建一个wc.input文件,并输入以下内容
如前面做单机实例时已创建过该文件,就不需要再创建了
cd /usr/local/hadoop/wcinput
vim wc.input
# 输入以下内容
hello hadoop
hello mapreduce
hello yarn
3.要使用 HDFS,首先需要在 HDFS 中创建用户目录:
hdfs dfs -mkdir -p /user/hadoop
两种方法相看刚才创建的目录:
1.使用命令
hdfs dfs -ls /
2.WEB方法 (点击Utilities-Browse the file system
)
接着将/usr/local/hadoop/wcinput
中的 wc.input
文件作为输入文件复制到分布式文件系统中,
即将 /usr/local/hadoop/wcinput/wc.input
复制到分布式文件系统中的 /user/hadoop/input 中。
我们使用的是 hadoop 用户,并且已在HDFS中创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
4.在HDFS下新建input目录(默认在user/hadoop下创建):
hdfs dfs -mkdir input
5.将本地的wordcount.txt上传到HDFS的input目录下:
hdfs dfs -put /usr/local/hadoop/wcinput/wc.input input
6.查看文件是否上传成功:
hdfs dfs -ls -R /
7.Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:
hdfs dfs -rm -r output # 删除 output 文件夹
运行程序时,输出目录不能存在
8.回到/usr/local/hadoop
下,执行程序
cd /usr/local/hadoop
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount input output
9.查看运行结果:
hdfs dfs -cat output/*
10.也可以在web网页中下载文件查看
4.5.2 grep 案例
上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。
要使用 HDFS,首先需要在 HDFS 中创建用户目录(上个实例创建就不需要再创建了):
hdfs dfs -mkdir -p /user/hadoop
两种方法相看刚才创建的目录:
1.使用命令
hdfs dfs -ls /
2.WEB方法 (点击Utilities-Browse the file system
)
接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,
即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。
我们使用的是 hadoop 用户,并且已在HDFS中创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
hdfs dfs -mkdir input2
hdfs dfs -put ./etc/hadoop/*.xml input2
hdfs dfs -rm -r output2 # 删除 output 文件夹(Hadoop 运行程序时,输出目录不能存在,否则会提示错误 )
复制完成后,可以通过如下命令查看文件列表:
hdfs dfs -ls input2
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件(可以将单机步骤中创建的本地 input2 文件夹,输出结果 output2 文件夹都删掉来验证这一点)。
cd /usr/local/hadoop
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input2 output2 'dfs[a-z.]+'
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
hdfs dfs -cat output2/*
结果如下,注意到刚才我们已经更改了配置文件,所以运行结果不同。
我们也可以将运行结果取回到本地:
rm -r ./output2 # 先删除本地的output文件夹(如果存在)
hdfs dfs -get output2 ./output2 # 将 HDFS 上的 output 文件夹拷贝到本机
cat ./output2/*
Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:
hdfs dfs -rm -r output2 # 删除 output 文件夹
运行程序时,输出目录不能存在
运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。
若要关闭 Hadoop,则运行
stop-dfs.sh
注意
下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 start-dfs.sh
就可以!