02Hadoop安装教程_单机、伪分布式配置

02 Hadoop2.7 安装教程_单机、伪分布式配置

1、hadoop基础知识

1.1 hadoop是什么?

​ 是指Apache软件基金会的一款开源软件,允许用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理

1.2 hadoop核心组件

  • hadoop HDFS(分布式文件存储系统):解决海量数据存储
  • hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
  • hadoop MapReduce(分布式计算框架):解决海量数据计算

1.3 hadoop工作流程

  1. HDFS存储数据
  2. 客户端发起请求,提交作业
  3. YARN分配资源,创建MapReduce任务
  4. 任务结果再入HDFS
  5. 作业结果返回客户端

1.3 hadoop核心组件介绍

1.3.1 HDFS

HDFSHadoop DFS Hadoop分布式文件系统

DFSDistributed FileSystem 分布式文件系统

HDFS的特点

  1. 在HDFS中,对于文件是进行切块保存

  2. HDFS中有2类主要的节点:NameNode和DataNode

  3. NameNode负责管理DataNode

  4. DataNode负责存储数据

  5. HDFS会对文件块进行自动的备份,每一个备份称之为复本(Replication),HDFS默认是3个复本

  6. 如果某一个DataNode宕机,那么在HDFS中默认将这个DataNode所存储的复本再进行一次备份,保证指定的复本数量,宕机的设备恢复后不会删除多余副本。

Block

  1. 在HDFS中,会对文件进行切块,每一个块实际上就是一个Block

  2. Block是HDFS中存储的基本单位

  3. Block在Hadoop1.0中的大小是64M,在Hadoop2.0中的大小是128M

  4. 如果一个文件或者数据的大小不满足Block的大小,那么这个文件或者数据是多大那么对应的Block就是多大

  5. 切块的意义:
    a. 便于存储超大文件
    b. 便于进行快速的备份

  6. HDFS对每一个Block分配一个递增的编号

NameNode

  1. NameNode是HDFS中的核心节点,用于管理其他的DataNode
  2. NameNode本身会记录元数据(Meta Data)
  3. 元数据包含:
    a. 文件的存储路径,例如/a.log,/test/b.txt
    b. 复本数量
    c. 文件所对应的文件块 — Block
    d. 每一个Block的存储节点
  4. 每一条元数据一般是在150B大小左右
  5. 只有写请求会产生元数据,读请求不产生元数据
  6. 元数据在NameNode中存储在内存以及磁盘中
  7. 元数据存储在内存中的目的是为了快速查询
  8. 元数据存储在磁盘中是为了崩溃恢复
  9. 元数据存储在磁盘上的位置由core-site.xml中的属性hadoop.tmp.dir来决定,在指定的目录的子目录dfs/name/current下
  10. 元数据存储的文件:
    a. edits:记录NameNode接收的每一次的写(上传、删除、追加)请求
    b. fsimage:记录元数据,但是这个文件中的元数据不是实时的
  11. 当NameNode接收到一个新的写请求的时候,会先将这个请求写到edits文件中,当edits文件写成功之后,再去更改内存中的元数据,当内存中的元数据更改完毕之后,会个客户端返回一个成功信号

DateNode

  1. DataNode用于存储数据,数据是以Block形式存储

  2. DataNode通过心跳机制(每隔固定时间)来向NameNode发送心跳信号

    心跳信号包含:
    a. 当前节点的状态
    b. 当前DataNode存储的数据

  3. DataNode每隔3s向NameNode发送一次心跳

  4. 如果NameNode超过10min没有收到DataNode的心跳,那么NameNode认为这个DataNode已经lost(丢失)

  5. 当NameNode认为DataNode已经lost的时候,NameNode要将这个DataNode上的Block备份到其他的节点上

多副本放置策略

  1. 第一个复本:如果是从集群内部上传,哪个节点上传第一个复本就放在哪个节点上;如果是从集群外部上传,那么NameNode会选择一个相对比较空闲的DataNode存储第一个复本
  2. 第二个复本:放在和第一个复本不同机架的节点上
  3. 第三个复本:放在和第二个复本相同机架的节点上
  4. 更多复本:选择相对空闲的节点来放置

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          # 查看主机名(因为是本机登录,故主机名是一样的)

如图:
在这里插入图片描述

图:SSH无密码登录

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

在这里插入图片描述

<图> 安装的hadoop版本

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 文件夹中。

  1. /usr/local/hadoop 目录下面创建一个wcinput文件夹

     cd /usr/local/hadoop
     mkdir wcinput
    
  2. 在wcinput文件下创建一个wc.input文件,并输入以下内容

    cd ./wcinput
    
    vim wc.input
    
    # 输入以下单词
    hello hadoop
    hello mapreduce
    hello yarn
    
    
  3. 回到/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 文件夹

在这里插入图片描述

  1. 查看结果

打开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

成功启动进程如图:

在这里插入图片描述

图示:通过jps查看启动的Hadoop进程

启动方式2:

# 启动方式2

start-all.sh  # 启动所有进程(如包括yarn的resourcemanager 和nodemanager) 

检查已启动的进程

# jps是jdk查看当前java进程的工具
jps

成功启动进程如图:

在这里插入图片描述

图示:通过jps查看启动的Hadoop进程

可能会出现的错误:(如果成功启动以上的守护进程,可以跳过)

如果 SecondaryNameNode 没有启动,请运行 stop-dfs.sh 关闭进程,检查配置后再次尝试启动。

如果没有 NameNodeDataNode ,就是配置不成功,请仔细检查之前步骤,或查看启动日志排查原因。

Hadoop无法正常启动的解决方法

一般可以查看启动日志来排查原因,注意几点:

  • 一般出错的提示在最后面,通常是写着 FatalErrorWarning 或者 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 就可以!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值