【大数据】深入了解Hadoop

【大数据】深入了解Hadoophdfs 的元数据两个部分内存上的元数据在服务运行期间 所有的元数据会先存储在内存上文件信息 datanode 信息 块信息元数据文件为了避免内存上的元数据丢失 会将内存的上的元数据保存在磁盘上 s

大家好,欢迎来到IT知识分享网。

一、Hadoop

1.1、Hadoop发展

1.2、Hadoop特性

  • 扩容能力(Scalable):Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可以方便的扩展到数以千计的节点中。
  • 成本低(Economical):Hadoop通过普通廉价的机器组成服务器集群来分发以及处理数据,以至于成本很低。
  • 高效率(Efficient):通过并发数据,Hadoop可以在节点之间动态并行的移动数据,使得速度非常快。
  • 可靠性(Rellable):能自动维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。所以Hadoop的按位存储和处理数据的能力值得信赖。

1.3、Hadoop三大组件

  • HDFS 负责数据存储服务
  • MapReduce 负责数据计算
  • Yarn 负责计算资源的调度 hadoop2.0 之后的版本引入

二、Hadoop—HDFS(分布式文件存储系统)

负责大数据的数据储存功能

对海量数采用文件的方式进行存储,同一个文件的数据可能会存储在不同的服务器实现分布式存储

2.1、hdfs服务的构成

  • namenode服务 管理hdfs的主服务
    • 所有的数据的读写请求都要交给namenode处理
    • 由namenode负责将数据进行分配存在不同的datanode上
    • namenode主服务只会有一个,一旦namenode服务出现问题,整个hdfs服务都不可用,namenode是单点故障
  • datanode服务 负责存储数据
    • 和namenode保持通讯,将自身信息告知namenode
    • 数据存储时,是按照块(block)进行存储,默认块大小 128M
      • 当数据大小不够128M时,按照数据大小存储数据到磁盘上
    • 为了保证数据安全可靠,会对数据进行副本备份, 默认是3副本,每块数据会存储3份,三份数据会存储在不同服务器
  • SecondaryNameNode 负责协助namenode完成对元数据的存储
    • 元数据是文件的信息(名字,大小,存储位置),datanode信息,块信息
    • 在hdfs运行期间,元数据是在内存上存储的,内存存储数据是临时存储,一点断电或服务不可用宕机会造成内存数据丢失,hdfs为了避免数据丢失,会将元数据在磁盘上进行存储
    • SecondaryNameNode 协助namenode将元数据存在磁盘上
    • 如果namenode完成磁盘存储数据,需要耗费大量时间,此时无法处理其他请求,所以元数据的磁盘存储交给SecondaryNameNode 实现

2.2、HDFS的Shell操作

在hadoop的2.x版本中没有web页面的操作选项,只能通过shell方式操作

hdfs dfs 参数 
hdfs dfs -mkdir /hdfs_data hdfs dfs -touch /hdfs_data/a.txt hdfs dfs -rm -r /hdfs_data hdfs dfs -cp /hdfs_data/a.txt /data hdfs dfs -mv /data/画图.pptx /hdfs_data hdfs dfs -mv /hdfs_data/画图.pptx /hdfs_data/a.pptx hdfs dfs -cat /hdfs_data/a.txt hdfs dfs -ls / 

hdfs的文件上传下载

hdfs dfs -get hdfs上的文件路径 本地的文件路径(本地指操作的当前服务器) hdfs dfs -put 本地的文件路径(本地指操作的当前服务器) hdfs上的目录路径 

2.3、HDFS读写流程

  • 读流程
  • 写流程

2.4、三副本机制

保证每个块在不同的服务器不同机架上

服务器数量低于副本数量,存储数据时会报错

1-第一个副本,由NN决定找哪个DN

2-第二个副本,有NN找第一个副本所在机架的不同服务器上

3-第三个副本,找和第一个副本不同机架的服务器上

2.5、元数据介绍

hdfs的元数据两个部分

  • 内存上的元数据
    • 在服务运行期间,所有的元数据会先存储在内存上
    • 文件信息,datanode信息,块信息
  • 元数据文件
    • 为了避免内存上的元数据丢失,会将内存的上的元数据保存在磁盘上
    • secondarynamenode完成元数据文件的保存
    • 存储位置在hadoop的指定数据
      • /export/data/hadoop-3.3.0/dfs/name/current
    • edits_xxxxx 编辑日志文件,记录所有的文件操作信息
     hdfs oev -i edits_0000000000000010086-0000000000000010100 -o edits.xml 
    • fsimage_xxxxx 镜像文件,保存了元数据内容 文件和块内容
      • datanode会汇报自身状态给NameNode,默认是3秒
hdfs oiv -i fsimage_0000000000000010119 -p XML -o fsimage.xml 
  • 元数据备份流程
  • 元数据保存文件的条件
# Checkpoint操作受两个参数控制,可以通过hdfs-site.xml进行配置: <property> <name> dfs.namenode.checkpoint.period</name> <value>3600</value> <description> # 两次连续的checkpoint之间的时间间隔。默认1小时 </description> </property> <property> <name>dfs.namenode.checkpoint.txns</name> <value>0</value> <description> # 最大的没有执行checkpoint事务的数量,满足将强制执行紧急checkpoint,即使尚未达到检查点周期。默认设置为100万。  </description> </property> 

2.6、HDFS的归档

  • 文件归档
hadoop archive -archiveName data.har -p /data /hdfs_data 
  • 归档的查看
hdfs dfs -ls har:///hdfs_data/data.har 
  • 归档解压
hdfs dfs -cp har:///hdfs_data/data.har/a.txt /hdfs_data 

归档注意点
归档后并不会删除原有数据
原有数据依然会占用内存空间
要节省内存空就需要删除原有文件


2.7、HDFS垃圾桶机制

<property> <name>fs.trash.interval</name> <value>1440</value> </property> 
[root@node1 hadoop] hdfs dfs -rm /hdfs_data/a.txt 2023-06-18 18:01:34,332 INFO fs.TrashPolicyDefault: Moved: 'hdfs://node1:8020/hdfs_data/a.txt' to trash at: hdfs://node1:8020/user/root/.Trash/Current/hdfs_data/a.txt [root@node1 hadoop] hdfs dfs -rm -skipTrash /hdfs_data/a.pptx Deleted /hdfs_data/a.pptx 

在这里插入图片描述

2.8、HDFS安全机制

  • 安全机制检查的内容

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

  • shell操作
    • 查看
    hdfs dfsadmin -safemode get 
    • 启动
    hdfs dfsadmin -safemode enter 
    • 关闭
    hdfs dfsadmin -safemode leave hdfs dfsadmin -safemode forceExit 

在这里插入图片描述

三、Hadoop—MapReduce(分布式计算引擎)

MapReduce 是hadoop负责计算的服务功能,采用的计算方式是分布式计算,就算思想’分而治之’

3.1、MapReudce简单使用

hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 5 100 
  • 词频统计
 hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output 

3.2、MapReduce 计算流程

  1. Map过程:(Map数量由块决定)
    a. 通过split切割读取文件中的每行数据
    b. 将每行需要计算的数据转为kv结构
    c. 将kv数据写入环形缓冲区,默认大小100M,当达到80%开始spill溢出写入文件进行shuffle操作


  2. shuffle过程:
    a. 分区:partition
    ⅰ. 将Map处理后的数据分成多份:
    1. 采用hash取余的方式进行分区
    2. 采用hash(key)%分区数(reduce个数) –余数相同的数据放同一分区
    3. 分区数由reduce个数决定
      b. 排序:sort
      ⅰ. 会对相同分区后的数据进行排序–排序的分区数据会写入文件
      c. 合并:merge
      ⅰ. 将相同分区的小文件数据合并成大文件(合并后的数据会排序,最终保证数据有序)





  3. Reduce过程:(Reduce数量由开发人员决定)
    a. 先通过fetch拉取合并后的文件数据,将数据加载到内存,然后将拉取后的数据进行排序
    b. 堆排序后的数据聚合计算
    c. 不同分区的数据会有对应的reduce进行拉取


3.3、MapReduce计算历史服务

  • 需要对历史日志服务进行配置
    在这里插入图片描述
  • 启动历史日志服务
mapred --daemon start historyserver 

在这里插入图片描述

  • hadoop服务运行错误查看的日志文件
    在这里插入图片描述

四、Hadoop—Yarn(资源调度系统)

Yarn是hadoop中负责资源调度的服务功能,mapreduce计算时使用的资源都需要找yarn申请,申请成功后才能进行计算。

yarn是hadoop2.x版本之后引入的服务,在之前计算实时都是使用各自服务器上的资源,有了yarn可以协调分配多台服务器的资源。

4.1、Yarn服务的构成

  • ResourceManager 简写RM
    • 管理整个yarn服务
    • 处理所有的计算任务资源申请请求
    • 单点故障,出现问题后整个yarn都不可用
    • 计算时会指定创建applicationmaster服务
    • 不参与具体计算的资源分配
  • NodeManager 简写NM
    • 监控每台服务器的资源情况,汇报给RM
    • 创建container资源空间给计算任务使用
  • ApplicationMaster
    • 只有在进行计算时会由RM创建
    • 负责整个计算任务的管理(具体资源的分配),也就是管Map和Reduce计算
    • Map和Reduce在计算时的信息会汇报给ApplicationMaster
    • 计算完成,会由RM释放

4.2、Yarn的资源调度流程

4.3、Yarn资源调度方案

# 容量调度 默认 yarn.resourcemanager.scheduler.class= org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler # 公平调度 yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.reservation.FairSchedulerPlanFollower 
<configuration> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>prod,dev</value> # 将资源分成两份一个叫prod一个dev </property> <property> <name>yarn.scheduler.capacity.root.dev.queues</name> <value>mapreduce,spark</value> # 将dev分成两份 一个叫mapreduce一个spark </property> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>40</value> # 分配prod资源空间占比为40% </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>60</value> # 分配dev资源空间占比为60% </property> <property> <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name> <value>75</value> # 动态调整dev的大小 最大为75% </property> <property> <name>yarn.scheduler.capacity.root.dev.mapreduce.capacity</name> <value>50</value> # 指定dev下的mapreduce 占用dev的空间的50% </property> <property> <name>yarn.scheduler.capacity.root.dev.spark.capacity</name> <value>50</value> # 指定dev下的spark 占用dev的空间的50% </property> </configuration> 

五、Hadoop集群搭建

在这里插入图片描述

5.1、搭建步骤

1.上传hadoop压缩包(hadoop-3.3.0-Centos7-64-with-snappy.tar.gz)解压,注意:上传文件位置为 /export/server目录

cd /export/server tar zxvf /export/server/hadoop-3.3.0-Centos7-64-with-snappy.tar.gz 

2.配置环境变量

echo 'export HADOOP_HOME=/export/server/hadoop-3.3.0' >> /etc/profile echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> /etc/profile source /etc/profile 

3.手动修改配置文件(3和4二选一)

进入/export/server/hadoop-3.3.0/etc/hadoop目录下进行修改

① hadoop-env.sh文件

export JAVA_HOME=/export/server/jdk #文件最后添加 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支持file、HDFS、GFS、ali|Amazon云等文件系统 --> <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> <!-- 设置Hadoop本地保存数据路径 --> <property> <name>hadoop.tmp.dir</name> <value>/export/data/hadoop-3.3.0</value> </property> <!-- 设置HDFS web UI用户身份 --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> <!-- 整合hive 用户代理设置 --> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> 

③ hdfs-site.xml文件

<!-- 设置SNN进程运行机器位置信息 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>node2:9868</value> </property> 

④ mapred-site.xml文件

<!-- 设置MR程序默认运行模式: yarn集群模式 local本地模式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- MR程序历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> 

⑤ yarn-site.xml文件

<!-- 设置YARN集群主角色运行机器位置 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 是否将对容器实施物理内存限制 --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <!-- 是否将对容器实施虚拟内存限制。 --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <!-- 开启日志聚集 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置yarn历史服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://node1:19888/jobhistory/logs</value> </property> <!-- 保存的时间7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value></value> </property> 

⑥ workers文件

node1 node2 node3 

4.使用配置文件替换(3和4二选一)

上传配置文件压缩包(hadoop-config.tar)解压,注意:上传文件位置为 /export/server目录

tar xvf /export/server/hadoop-config.tar mv -f /export/server/hadoop-config/* /export/server/hadoop-3.3.0/etc/hadoop/ rm /export/server/hadoop-config* -rf 

5.集群搭建说明

需要将node1中的Hadoop文件复制到node2和node3的对应位置

scp可以进行主机的文件复制拷贝 scp -r /export/server/hadoop-3.3.0 root@node2:/export/server/ 

注意: 初始化操作必须在node1中执行

hdfs namenode -format 

② 脚本启动和关闭

start-all.sh stop-all.sh 

5.2、高可用搭建步骤

  1. 安装软件

三台服务器都要安装

yum install psmisc -y # 实现多个服务的通讯 zkfc和nn及zk的通讯 rpm -ivh psmisc-22.20-17.el7.x86_64.rpm 
  1. 备份hadoop安装信息
tar cvf hadoop.tar /export/server/hadoop-3.3.0 
  1. 删除原有数据文件
    三台服务器都操作
rm -rf /export/data/hadoop-3.3.0 
  1. 修改配置文件
    以下配置现在node1上执行
  • 修改hadoop-env.sh
# 在文件最后添加下面两行 export HDFS_JOURNALNODE_USER=root export HDFS_ZKFC_USER=root 
  • 修改core-site.xml
<configuration> <!-- HA集群名称,该值要和hdfs-site.xml中的配置保持一致 --> <property> <name>fs.defaultFS</name> <value>hdfs://cluster1</value> </property> <!-- hadoop本地磁盘存放数据的公共目录 --> <property> <name>hadoop.tmp.dir</name> <value>/export/data/ha-hadoop</value> </property> <!-- ZooKeeper集群的地址和端口--> <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> </configuration> 
  • 修改hdfs-site.xml
<configuration> <!--指定hdfs的nameservice为cluster1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>cluster1</value> </property> <!-- cluster1下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.cluster1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.cluster1.nn1</name> <value>node1:8020</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.cluster1.nn1</name> <value>node1:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.cluster1.nn2</name> <value>node2:8020</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.cluster1.nn2</name> <value>node2:50070</value> </property> <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1:8485;node2:8485;node3:8485/cluster1</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/export/data/journaldata</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 指定该集群出故障时,哪个实现类负责执行故障切换 --> <property> <name>dfs.client.failover.proxy.provider.cluster1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制方法--> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration> 
  • 修改yarn-site.xml
<configuration> <!-- 开启RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分别指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node2</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> 

在这里插入图片描述

5.启动

  • 启动zk
    • zkServer.sh start
  • 启动journalnode 三台服务器都启动
    • hadoop-daemon.sh start journalnode
  • 初始化namenode 注意:node1上执行
    • hdfs namenode -format
    • 将数据文件拷贝到node2相同目录
      • scp -r ha-hadoop/ node2:/export/data/
  • 初始化zkfc 注意在node1上执行
    • hdfs zkfc -formatZK
  • 启动服务
    • start-all.sh

注意

搭建高可用后,之前的SNN会被QJM取代

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/116477.html

(0)
上一篇 2025-11-28 17:33
下一篇 2025-11-28 18:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信