大数据学习笔记11-Hadoop基础2

一: 分布式的基础架构分析[重要]

集群架构模式:

主从架构(中心化):

  • 主角色 master: 发号施令,负责任务的接受和分配

  • 从角色 slave: 负责干活

主备架构:可以解决中心化存在的问题

  • 主角色active : 正常工作

  • 备角色standby : 观察主角色工作,并实时备份主角色数据,当主角色宕机后,立即上位.

去中心化模式 : 例如区块链

hadoop中的HDFS集群和Yarn集群都是主从模式架构.

二、HDFS的基础架构[重要]

HDFS的角色分配:

**NameNode:**是集群中的主角色或主节点,负责 DataNode的管理工作

**DataNode:**是集群中的从角色或从节点, 负责数据文件的读或写

SecondaryNameNode: 是集群中的辅助角色或辅助节点,负责帮助NameNode完成管理工作(负责元数据的合并工作).


NN在开发中只有一个主服务,容易出现单点故障,在主从架构中,一旦主服务不可用,整个服务都不可用

使用主备方式解决单点故障

运行多个NN,但是对外处理请求的只有一个

一般公司选择是一主一备方案


一个典型的HDFS集群中会有多个DataNode,但是活跃的NameNode只能有一个,如果集群资源不足,则需要扩展DataNode节点数量.如果元数据管理能力不足,则需要给namenode提升服务器性能.

HDFS是一个标准的主从架构

注意: 通常情况下, NameNode的服务器性能,要比DataNode高.(cpu和内存大)

三、HDFS集群环境部署[了解]

前期准备:

  1. 有三台服务器

  2. 验证服务器的网络畅通

  3. 可以进行ssh免密登录

  4. 关闭防火墙及selinux

  5. 安装jdk

  6. 时间同步

下载hadoop安装包:

Apache Hadoop

Index of /dist/hadoop/common

官网下载的hadoop安装包不能直接使用,需要进行编译后才可以使用

但是我们自己下载编译的安装包会出现警告

由于官网给我们的是最大化编译,在linux windows 和 mac平台中都能够运行,但是在linux运行时,与windows和mac相关的代码会报警告,在windows 和mac运行时一样

为了解决警告问题我们对于安装包一般会从新编辑后再编译

我们已经给大家编译好了对应的安装包,直接使用即可.

集群规划

在公司中由大数据运维人员进行大数据环境安装

1-申请服务器 说明cpu核心数 内存大小,磁盘大小 服务器数量

2-编写部署文档,规划服务运行形式

3-文档审核后就开始部署服务器
node1: cpu 2*1 内存 4G 60G

node2: cpu 1*1 内存 2G 60G

node3: cpu 1*1 内存 2G 60G

通过分析可知, node1服务器性能最好,可以作为主服务使用,将我们的主角色部署在node1上

但是,NameNode和SecondaryNameNode都是服务器内存消耗的大户,且SNN会将NN的元数据进行获取合并,所以建议放置在两台不同的服务上

最优方案是每个服务一台服务器

角色分配

node1: NameNode DataNode

node2: DataNode SecondaryNameNode

node3: DataNode


node4 : DataNode

node5 : DataNode

.....

hadoop用户创建,并配置免密登录

此处我们使用root用户权限进行环境部署,但是在企业开发中,会创建一个普通用户用户环境部署,而root用户负责将部署时需要的权限分配给普通用户

  1. 将hadoop安装包上传到/export/software目录下

  2. 将该安装包进行解压

复制代码
cd /export/software
tar -zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz -C ../server
  1. 创建一个软连接
复制代码
cd /export/server
ln -s hadoop-3.3.0/ hadoop
  1. 修改配置文件

先进入配置文件的文件目录

复制代码
cd /export/server/hadoop/etc/hadoop/
复制代码
workers:            配置从节点(DataNode)有哪些
hadoop-env.sh:      配置Hadoop的相关环境变量
core-site.xml:      Hadoop核心配置文件
hdfs-site.xml:      HDFS核心配置文件
yarn-site.xml:      yarn核心配置文件
mapred-site.xml:    mapreduce核心配置文件

打开workers文件(配置参会该集群工作的服务器有哪些)

复制代码
vim workers
​
# 将内部文件修改为如下内容
node1
node2
node3

打开hadoop-env.sh文件,配置hadoop的基础环境变量

复制代码
vim hadoop-env.sh
​
# 在文件末尾添加如下内容
export JAVA_HOME=/export/server/jdk  # java安装目录
export HADOOP_HOME=/export/server/hadoop  # hadoop安装目录
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop  # hadoop配置文件目录
export HADOOP_LOG_DIR=$HADOOP_HOME/logs # hadoop日志文件目录
​
#文件最后添加
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

打开core-site.xml文件,配置hadoop的一些基础服务配置信息

xml文件时以成对标签的形式进行kv结构的修饰

标签内部的名称就是key值,两个标签中间的数据就是value

复制代码
vim core-site.xml
​
# 在文件末尾添加如下内容
​
# 在文件内部填入如下内容
​
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
​
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
​
# 注意要卸载configuration的标签内部,多余的标签要删掉

打开hdfs-site.xml文件,配置hdfs的相关服务信息

复制代码
# 在文件内部填入如下内容
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
 <value>/data/nn</value>
</property>
<property>
<name>dfs.namenode.hosts</name>
<value>node1,node2,node3</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/dn</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>

准备数据存储目录

复制代码
# 进入root权限,创建目录
# node1
mkdir -p /data/nn
mkdir /data/dn
​
# node2, node3
mkdir -p /data/dn
​

将hadoop目录复制到node2和node3中

复制代码
scp -r /export/server/hadoop node2:/export/server
scp -r /export/server/hadoop node3:/export/server

配置环境变量

复制代码
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

注意:使用source /etc/profile进行激活

初始化NameNode

由于我们的NameNode在node1上,所以只在node1上执行该代码即可

可以理解为我们要存储元数据,先要构建一个元数据的结构文件,后续将数据不断的在该文件中增删改查.

复制代码
hadoop namenode -format

启动服务

复制代码
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh
​
# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh

警告不用在意,是告诉我们该目录之前没有,现在需要创建

服务启动后,可以使用jps查看服务进程

如果出现服务启动问题去日志文件中找答案

  1. cd到logs目录中
复制代码
cd /export/server/hadoop/logs
  1. 找到故障服务的.log文件
  1. 使用grep进行筛选
复制代码
# 通常我们筛选的都是error或者warning, 如果是info证明没有异常
cat hadoop-hadoop-datanode-node1.log | grep WARN

四、HDFS的服务启停[重要]

对整个hadoop服务的启动和关闭

会将hadoop中的hdfs,yarn服务都会启动

复制代码
start-all.sh
​
stop-all.sh
一键启停hdfs集群

下方指令是针对于整个hdfs的启停.在node1中执行该命令, node2, node3中的服务都会被启动. 前提是免密登录

复制代码
# 一键启动
start-dfs.sh 
# 一键停止
stop-dfs.sh
单起单停
复制代码
# 只能控制当前服务器中服务的启停
hdfs --daemon start|stop|status namenode|datanode|secondarynamenode

注意: 在开发中,一般我们的服务不会频繁启停,如果服务出现故障进行单起单停,否则影响面太广.

使用jps执行查看服务是否启动

使用浏览器访问服务,验证服务器是否启动
namenode所在服务器的ip地址:9870

192.168.88.100:9870

五、HDFS的Shell操作(了解)

hdfs的完整路径:

复制代码
hdfs://node1:8020/root/test

hdfs的文件结构和linux中基本一致 : 树状结构

hdfs中也划分目录和文件,目录只能存储子目录和文件, 文件只能存储数据

文件和数据的区别???

文件是用来存储数据的,磁盘中数据以文件的形式存储起来,方便后续查找使用,数据不一定以文件的形式展示.

hdfs的shell命令格式:

复制代码
# 新写法
hdfs dfs -命令 [-选项] [参数]
# 老写法
hadoop fs -命令 [-选项] [参数]

注意: 在hdfs dfs - 之后或hadoop fs -之后和linux终端指令基本没有区别

hadoop中的shell命令

复制代码
Usage: hadoop fs [generic options]
        [-appendToFile <localsrc> ... <dst>]
        [-cat [-ignoreCrc] <src> ...]
        [-checksum [-v] <src> ...]
        [-chgrp [-R] GROUP PATH...]
        [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
        [-chown [-R] [OWNER][:[GROUP]] PATH...]
        [-concat <target path> <src path> <src path> ...]
        [-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>]
        [-copyToLocal [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>]
        [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] [-s] <path> ...]
        [-cp [-f] [-p | -p[topax]] [-d] [-t <thread count>] [-q <thread pool queue size>] <src> ... <dst>]
        [-createSnapshot <snapshotDir> [<snapshotName>]]
        [-deleteSnapshot <snapshotDir> <snapshotName>]
        [-df [-h] [<path> ...]]
        [-du [-s] [-h] [-v] [-x] <path> ...]
        [-expunge [-immediate] [-fs <path>]]
        [-find <path> ... <expression> ...]
        [-get [-f] [-p] [-crc] [-ignoreCrc] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>]
        [-getfacl [-R] <path>]
        [-getfattr [-R] {-n name | -d} [-e en] <path>]
        [-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
        [-head <file>]
        [-help [cmd ...]]
        [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
        [-mkdir [-p] <path> ...]
        [-moveFromLocal [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
        [-moveToLocal <src> <localdst>]
        [-mv <src> ... <dst>]
        [-put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] <localsrc> ... <dst>]
        [-renameSnapshot <snapshotDir> <oldName> <newName>]
        [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
        [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
        [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
        [-setfattr {-n name [-v value] | -x name} <path>]
        [-setrep [-R] [-w] <rep> <path> ...]
        [-stat [format] <path> ...]
        [-tail [-f] [-s <sleep interval>] <file>]
        [-test -[defswrz] <path>]
        [-text [-ignoreCrc] <src> ...]
        [-touch [-a] [-m] [-t TIMESTAMP (yyyyMMdd:HHmmss) ] [-c] <path> ...]
        [-touchz <path> ...]
        [-truncate [-w] <length> <path> ...]
        [-usage [cmd ...]]
​
Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines
​
The general command line syntax is:
command [genericOptions] [commandOptions]
​

注意: 与linux中使用方法基本相同的指令我们不过多讲解

例如:ls mkdir touch.....

ls指令查看hdfs中的文件目录信息
复制代码
hdfs dfs -ls 路径    路径要从根路径指定
​
hadoop fs -ls 路径
hdfs的文件目录操作
复制代码
hdfs dfs -mkdir /路径
​
hdfs dfs -touch  /路径/文件
​
hdfs dfs -mv  原始路径  目标路径
​
hdfs dfs -cp  原始路径  目标路径
​
hdfs dfs -rm -r  /路径
文件的上传和下载

put指令: 从linux 服务器本地上传到hdfs文件系统中

hdfs dfs -put 本地文件路径(写绝对路径) hdfs的路径

复制代码
hdfs dfs -put /var/log/messages  /

get命令: 从hdfs文件系统将文件下载到linux文件系统中

hdfs dfs -get hdfs的文件路径 本地文件路径

复制代码
hdfs dfs -get /sparklog/local-1664869425770.lz4  /root

注意: 在hdfs中使用任何文件或目录,要使用绝对路径进行查找,在hdfs中 没有工作目录的概念,更没有相对路径的概念.

练习
复制代码
在hdfs中创建文件夹:/itcast/itheima,如存在请删除
hdfs dfs -ls /
hdfs dfs -mkdir -p /itcast/itheima
​
​
上传/etc/hosts文件到hdfs的/itcast/itheima内
hdfs dfs -put /etc/hosts /itcast/itheima
​
查看hdfs中刚刚上传的文件内容
hdfs dfs -put /etc/hosts /itcast/itheima
​
向hdfs中上传的文件追加:itheima到最后一行
echo itheima > a.txt
hdfs dfs -appendToFile /root/a.txt /itcast/itheima/hosts
​
下载hdfs中上传的文件到本地任意目录
 hdfs dfs -get /itcast/itheima/hosts /root
 
在hdfs中创建文件夹:/itcast/bigdata,将/itcast/itheima/hosts文件复制到/itcast/bigdata内
hdfs dfs -mkdir /itcast/bigdata
hdfs dfs -cp /itcast/itheima/hosts /itcast/bigdata
​
在hdfs中将/itcast/itheima/hosts文件重命名为/itcast/itheima/myhost
hdfs dfs -mv /itcast/itheima/hosts /itcast/itheima/myhosts
​
在hdfs中删除/itcast文件夹
hdfs dfs -rm -r /itcast

六、HDFS webUI的使用(掌握)

我们可以使用node1:9870打开hdfs的网页端,但是前提是必须配置windows系统下的主机映射,否则只能使用ip访问

192.168.88.100:9870

打开C:\Windows\System32\drivers\etc\hosts文件

在下方写入主机映射内容

复制代码
192.168.88.100 node1 node1.itcast.cn
192.168.88.101 node2 node2.itcast.cn
192.168.88.102 node3 node3.itcast.cn

MAC电脑,使用mac电脑终端打开

复制代码
sudo vim /etc/hosts

1-查看datanode状态
2-文件系统操作
数据存储说明

相关推荐
A懿轩A21 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
云边有个稻草人25 分钟前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
TGB-Earnest27 分钟前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化
大圣数据星球2 小时前
Fluss 写入数据湖实战
大数据·设计模式·flink
suweijie7682 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
Data跳动8 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
南宫生8 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__8 小时前
Web APIs学习 (操作DOM BOM)
学习
冷眼看人间恩怨9 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
woshiabc1119 小时前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎