ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hadoop核心解析:从伪分布式搭建到HA高可用实战

Hadoop核心解析:从伪分布式搭建到HA高可用实战 最近带了一个大数据方向的训练营第一堂答疑课下来我收到最多的问题出奇一致“老师Hadoop到底是什么”十个人里有八个会抢答分布式存储加分布式计算。我再追问一句“那为什么你搭伪分布式的时候NameNode就是起不来”基本就没人接得上了。定义是背出来的理解才是自己的。热搜词里有伪分布式搭建、HA、Zookeeper整合、distcp参数、Docker镜像这些说明大部分人正卡在不同的学习阶段。这篇我不打算给你复述一遍教科书概念而是从一个实际用过、踩过坑的从业者角度把Hadoop拆开来聊清楚它解决什么问题、生态里每个组件是怎么回事、从装环境到上生产会遇到哪些事、面试被问到底该怎么答。适合刚接触大数据想建立整体认知的新人也适合正在搭环境或者准备面试的朋友收藏着慢慢看。1. Hadoop的本质它在分布式世界里到底解决了什么问题1.1 单机时代的存储与算力天花板很多教程上来就讲HDFS、MapReduce、YARN结果初学者学完一堆名词还是不明白为什么要搞这么复杂。我建议反过来先想一个问题假设你是一家公司的数据分析师手里有一份10TB的日志文件要统计里面每个用户的访问次数你手上只有一台普通服务器1TB磁盘、16G内存、8核CPU怎么办拆开来看你至少会撞上三堵墙存储墙磁盘只有1TB10TB的数据根本放不下。算力墙就算你有办法把数据存到外置硬盘上一台机器的CPU和内存也扛不住全量扫描跑一次统计得好几天。可靠性墙机器总会坏。硬盘坏道、内存报错、机房断电任何一次故障都可能让你几个星期的心血全没。答案自然指向一个方向用很多台普通机器组成集群把数据和计算分摊到每一台上。这就是分布式的核心动机。但“分布式”三个字说起来容易做起来有一堆麻烦事文件怎么切每台机器存哪一段一台机器挂了数据从哪找任务分给谁执行谁来管理这么多机器Hadoop本质上就是围绕这四件事设计出来的一套解决方案它不是某个单一软件而是一个解决分布式存储和分布式计算问题的完整技术体系。1.2 两大支柱HDFS管存储MapReduce/YARN管计算Hadoop体系里最先出现的两个核心是HDFS和MapReduce分别对应存储和计算两件事。HDFSHadoop Distributed File System负责把一个大文件拆成若干个固定大小的块存到不同机器上。默认一个块是128MB老版本是64MB每个块默认存三份副本分散在不同节点上。这样做的好处一是单块数据小方便并行读取二是有冗余坏几台机器数据不丢三是数据分布在整个集群计算任务可以“就地取材”。MapReduce负责计算核心思想是一句话分而治之。把一个大任务拆成多个Map任务并行处理再通过Reduce阶段把中间结果汇总。举个例子统计10TB日志里的用户访问次数Map阶段每个节点只处理自己本地的那部分数据输出“用户-访问次数”的局部结果Reduce阶段把所有节点输出的同一位用户次数加起来就得到最终结果。后来大家发现MapReduce这个框架里既管计算逻辑又管资源分配耦合太死于是Hadoop 2.x把资源管理单独抽出来就成了YARNYet Another Resource Negotiator。YARN负责给各种计算任务分配CPU、内存等资源MapReduce从“框架”降级为YARN之上的一个“计算模型”。所以你现在看到的Hadoop 2.x/3.x其实就是三件套HDFS管存储、YARN管资源调度、MapReduce以及其他计算引擎负责真正干活。1.3 用仓库物流来类比整套机制我上课时经常用仓库来打比方学生接受度很高。你想象Hadoop集群是一个超大型仓库里面有很多货架HDFS相当于这套仓库的储物管理系统。大件货物大文件被拆成统一规格的箱子Block每箱复刻三份放在不同货架区。仓库里有一个总账房NameNode记录每个箱子放在哪个货架每个货架区有个管理员DataNode负责实际存取。MapReduce相当于仓库的搬运流程。总调度说“你们各区先把本区的箱子拆开挑出有用的东西”这是Map各区把挑出来的半成品送到统一的地方合并成最终清单这是Reduce。YARN相当于仓库的调度室决定哪个搬运队去哪个货架区给多少搬运工、多少搬运工具。这个比方虽然不精确但足够帮你建立第一层认知Hadoop不是玄学就是一套“多机协作的存储加计算系统”。2. 从开发者的视角拆解Hadoop生态全家桶2.1 HDFS把文件系统搬上集群HDFS是Hadoop最底层、最稳定的模块搞懂它基本等于搞懂分布式存储的一半。它的核心角色就两个NameNode整个文件系统的总管维护目录树和每个Block的元数据。注意它不存真实数据只存“什么文件在哪个Block、Block在哪台机器上”这类索引信息。DataNode真正存Block的地方。启动时会向NameNode汇报自己手里的Block列表平时定期发心跳。写一个文件的流程很简单客户端先问NameNode要“往哪些DataNode写”NameNode挑一批满足副本策略的节点返回客户端把数据切成多个Block按顺序推给第一个DataNode第一个DataNode再流水线式地传给第二个、第三个写完所有Block后客户端通知NameNode元数据变更完成。读文件更简单客户端问NameNode要某个文件包含哪些Block、在哪些节点上然后选择离自己最近的节点直接读。这里有一个新手最容易忽略的关键点副本怎么放是有讲究的。默认策略是第一个副本放在客户端所在节点如果客户端不在集群内则随机挑一个第二个副本放在与第一个副本同机架但不同节点上第三个副本放在不同机架上。这样既保证机架内速度快又保证整个机架断电时数据还有另一份。这就是所谓的“机架感知”Rack Awareness。入门阶段还需要留意HDFS的小文件问题。每个文件、每个Block都会在NameNode内存里占一条元数据记录大概150字节起5000万个Block就是几GB内存。海量小文件会让NameNode内存暴涨扫描时大量随机I/O性能远不如读几个大文件。所以实际项目中都要做小文件合并或者用HBase、中间层来缓冲。2.2 YARN资源调度才是集群的大脑Hadoop 1.x时代的MapReduce存在一个尴尬问题JobTracker既要负责任务调度又要管理资源节点一多就成了瓶颈而且集群只能跑MapReduce别的计算框架比如Spark根本用不了这套集群资源。YARN就是为了解决这个“一锅烩”问题而生的。YARN里有四个角色值得记住ResourceManagerRM全局唯一的总管接收作业请求调度资源管理集群的状态。NodeManagerNM每台机器一个负责启动和管理本机上的Container容器向RM汇报资源使用情况。ApplicationMasterAM每个作业一个负责向RM申请资源、与NM协商启动Container、监控作业进度。相当于每个作业的项目经理。Container资源分配的单位把一块CPU、一块内存打包封装任务在里面运行。一个任务从提交到运行经历的过程是客户端提交作业给RMRM找一个空闲节点启动AMAM再向RM申请一批Container然后在各NM上启动执行器并行跑Map和Reduce。整个过程像公司新接了一个项目总部先派一个项目经理AM项目经理再向人事部要点人Container最后把活分给各个小组NM上的任务干完。YARN还支持三种调度器FIFO先进先出简单但容易一个作业占满资源、Capacity按队列分配容量适合多租户隔离、Fair按公平策略动态分配跑批任务时几个作业可以同时分到资源。生产上一般选Capacity多队列把不同业务线、不同优先级作业隔离开避免一个跑夜维的大任务把其他人全部占死。2.3 生态组件别背名字按“解决什么问题”记忆Hadoop严格意义上只是一个底座大数据圈子里真正被大多数人天天打交道的反而是它之上的那一堆组件。很多初学者看到Hive、HBase、Zookeeper、Spark、Flink就头大其实每个组件都对应一个很具体的问题场景组件解决什么问题典型使用场景HDFS分布式文件存储统一存放各种原始数据和中间结果MapReduce海量数据批处理离线日志分析、全量报表计算YARN集群资源统一管理跑MapReduce、Spark、Flink等作业Hive用SQL操作HDFS数据封装MapReduce数据分析师写类SQL做离线数仓HBaseHDFS上的实时随机读写数据库用户画像、订单明细实时查询Zookeeper分布式协调、分布式锁、选主HDFS HA选主、HBase RegionServer管理Spark / Flink更快、更灵活的计算引擎迭代计算、实时流处理、机器学习这些组件不是平行的HDFS和YARN是地基Hive、HBase是这上面的业务能力Zookeeper是协调信使Spark和Flink是新计算引擎。注意一点Spark和Flink并不替代Hadoop它们跑在YARN上、数据存在HDFS里替代的是MapReduce那套“只能写很多Java类、跑起来又慢”的笨重计算模型。所以“有了Spark还要Hadoop吗”这个问题的答案是大概率还要HDFS仍然是数据仓库的底层底座。3. 环境搭建从伪分布式到集群我踩过的那些坑3.1 为什么入门先搭伪分布式很多人一上来就想搞一个三节点集群练手结果被网络配置、SSH免密、端口冲突折腾一周还没跑通第一个WordCount。我的建议很明确想学Hadoop第一站一定是伪分布式不是单机模式也不是真实集群。Hadoop有三种部署形态区别在于进程隔离方式本地模式所有组件跑在同一个JVM进程里不做跨进程通信适合快速跑语法验证但和真实运行机制差太远。伪分布式在一台机器上用多个独立JVM进程模拟集群。NameNode、DataNode、ResourceManager、NodeManager各跑各的完整走一遍分布式通信流程是体验Hadoop机制成本最低的方式。完全分布式多台机器各跑独立进程才是生产形态。热搜词里“hadoop伪分布式搭建”和“hadoop安装与配置”常年霸榜说明大家都卡在这一步。伪分布式既能让你完整看到启动日志、Web界面、HDFS数据分布又不用准备多台机器一台8G内存的虚拟机就够跑。3.2 核心配置与必踩的坑伪分布式搭建的大致流程是装JDK、解压Hadoop二进制包、配环境变量、配SSH免密、修改四个核心配置文件、格式化NameNode、启动服务。每一步都有它存在的理由但有几个点特别容易踩坑。先看四个核心配置core-site.xml指定默认文件系统为HDFS核心配置是fs.defaultFS比如hdfs://localhost:9000。hdfs-site.xml指定副本数和NameNode的元数据目录学习环境配dfs.replication1就够了配3也只会存一份因为只有一个DataNode。mapred-site.xml指定MapReduce跑在YARN上配置mapreduce.framework.nameyarn。yarn-site.xml配置ResourceManager和NodeManager的地址及资源参数。这几个文件改完初学者最常见的报错有这三类第一类JAVA_HOME not set。Hadoop启动脚本通过hadoop-env.sh找JDK如果你只配了系统环境变量部分版本的启动脚本仍找不到。解决办法是在hadoop-env.sh里显式写死export JAVA_HOME/usr/java/jdk1.8.0_xxx一劳永逸。第二类NameNode启动失败或者格式化完起不来。伪分布式下最常见的原因是你反复执行了hdfs namenode -format。格式化会初始化一个clusterID而DataNode的clusterID是第一次启动时从NameNode那边同步的如果你格式化后重新启动DataNode带着旧ID去注册就会报Incompatible clusterIDs。处理办法是格式化前清空dfs.namenode.name.dir和dfs.datanode.data.dir目录再重新格式化。第三类端口被占或进程莫名挂掉。本地起伪分布式9000端口、9870HDFS Web UI3.x版本很容易被其他服务占掉先lsof -i:9000查一下占用进程一直退出则先看logs/目录下的日志文件不要只盯着屏幕输出。SSH免密很多人会忽略。Hadoop启动进程时会通过SSH拉起本机的DataNode和NodeManager没有免密配置会提示你输入密码导致启动失败。执行这几条命令就够了ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ssh localhost最后一条如果直接进入shell而不是提示输密码就说明免密成了。3.3 Docker镜像让学习门槛降到最低“hadoop的docker镜像”能上热搜说明越来越多人在用容器化方式学Hadoop。这确实是省时省力的路子不用自己一步步调JDK、改配置拉一个打包好的镜像就能在容器里体验完整集群。常用的做法是找一个带Hadoop的镜像比如sequenceiq/hadoop-docker这类社区镜像或者自己写Dockerfile基于CentOS/Ubuntu装好Hadoop打成镜像真正想摸清配置文件的时候再手动配。用容器还有个巨大的好处环境随时可重置。docker pull sequenceiq/hadoop-docker:2.7.0 docker run -it sequenceiq/hadoop-docker:2.7.0 /etc/bootstrap.sh -bash两条命令就能进到一个已经搭好Hadoop的容器里跑WordCount、看HDFS目录、练distcp都没问题。唯一要注意的是容器重启后数据全丢如果要保留测试数据就挂一个数据卷。用Docker做课程设计、面试前快速回顾效率远高于从零搭虚拟机。等对Hadoop全流程都熟了再回去手动搭裸机集群那时候你对每个配置文件的理解就是另一层境界。4. 生产环境绕不开的高可用设计HA与Zookeeper4.1 单点故障到底多可怕伪分布式跑通之后很多人会觉得Hadoop不过如此直到第一次遇到NameNode宕机才明白什么叫“一夜回到解放前”。NameNode是整个HDFS的元数据总账本它挂了整个集群的所有数据读不了也写不了。在Hadoop 1.x时代这就是灾难因为NameNode是单点恢复要手动切、要重启、甚至可能丢失最近的元数据变更。“hadoop ha”和“hadoop和zookeeper整合实战”长期是热点词因为它确实是生产部署的必需项任何挂了会让全集群瘫痪的单点进程都必须做成高可用。4.2 基于Zookeeper的HA架构拆解HDFS HA的设计思路不复杂配置两个NameNode一个Active一个Standby两者保持元数据同步Zookeeper负责感知Active是否还活着并触发故障转移。具体组件包括两个NameNodeActive提供读写服务Standby实时同步元数据随时准备接管。JournalNode集群通常三个承担Active和Standby之间的日志同步通道。Active把每次元数据修改写进JournalNode的共享日志Standby持续读取并应用日志保证内存里的元数据始终追上Active。ZKFCZookeeperFailoverController每个NameNode节点一个负责向Zookeeper创建临时节点、监控NameNode健康状态、在Active挂掉后自动把Standby切换为Active。这里重点聊一下Zookeeper在里面到底起了什么作用。很多人学Zookeeper时很懵不知道它能干嘛。在HA场景它干两件事选主和防脑裂。选主靠的是临时节点和序号机制多个ZKFC同时竞争创建一个锁节点谁抢到谁对应的NameNode就是Active防脑裂靠的是fencing机制如果网络抖动导致两个NameNode同时以为自己是Active这就是脑裂ZKFC会把旧的Active强制杀掉或隔离确保任何时刻只有一个NameNode能提供写服务。整合实战时有个关键配置文件要特别注意hdfs-site.xml里除了HA相关配置还要指定共享日志目录property namedfs.nameservices/name valuemycluster/value /property property namedfs.ha.namenodes.mycluster/name valuenn1,nn2/value /property property namedfs.namenode.shared.edits.dir/name valueqjournal://node1:8485;node2:8485;node3:8485/mycluster/value /property property namedfs.ha.automatic-failover.enabled/name valuetrue/value /property配完之后记得启动Zookeeper集群再在NameNode节点上执行hdfs zkfc -formatZK初始化Zookeeper状态然后依次启动JournalNode、两个NameNode和ZKFC。这一步很多人容易漏。4.3 ResourceManager HA与常见误区很多团队NameNode的高可用做得有模有样却把ResourceManager晾在一边。YARN的ResourceManager同样是单点它挂了整个集群的作业提交和调度全部停摆任务跑一半就僵在那里。ResourceManager HA的机制和NameNode HA类似Active RM把应用状态写到ZookeeperStandby RM监听并准备接管同时依赖Zookeeper做选主和防脑裂。yarn-site.xml里配一组yarn.resourcemanager.ha.enabled和yarn.resourcemanager.zk-address配置就算妥了。一个常见的误区是以为NameNode做了HA集群的所有节点就都“高可用”了。实际上HA只解决了单点进程的快速切换解决不了容量问题也解决不了磁盘故障问题。如果有1亿个小文件NameNode单机内存再大也会被撑爆——这就是为什么大集群还要上NameNode Federation联邦把元数据分成多组NameNode分管。初学者不必深究Federation但脑子里需要建立这根弦HA是运维冗余不是性能扩容。5. 数据迁移与日常运维distcp 你会用吗5.1 distcp是什么“hadoop distcp 参数说明”出现在热搜榜说明很多人工作里真的会用到它但官方文档那些参数看得人一头雾水。distcp全称是Distributed Copy它不是一个普通的文件拷贝工具而是基于MapReduce实现的大规模数据分发复制工具。你可能会问直接用hadoop fs -cp不就行了吗区别很大。fs -cp只在NameNode层面操作元数据实际数据不跨节点移动而且单个-cp命令如果涉及几万个文件执行起来极慢还容易超时。distcp则是把复制任务拆成无数个Map任务每个Map任务均匀分担一部分文件拷贝能同时利用整个集群所有节点的带宽。跨集群迁移、机房数据搬迁、集群扩容后的数据补齐都用它。5.2 常用参数和实战用法distcp最常见的场景是两个集群之间同步数据命令长这样hadoop distcp \ -m 20 \ -bandwidth 200 \ -update \ -delete \ -p \ hdfs://clusterA:9000/user/hive/warehouse/ods.db/order_log \ hdfs://clusterB:9000/user/hive/warehouse/ods.db/order_log这里每个参数都有实际业务含义。-m指定最多用多少个Map任务并行拷贝决定了拷贝速度和源集群负载-bandwidth限制每个Map任务的拷贝带宽单位是MB/s生产上不限制的话很可能把业务紧张的集群带宽打爆-update表示只复制源端有而目标端没有或者校验不一致的文件-delete会把目标端多出来的文件删掉让两端完全一致这两个经常搭配用在做增量同步-p保留文件的时间戳、权限等属性服务器统计类场景很在意这个。再看一个动态增量同步的场景第一次全量同步之后你只希望把源端修改过的文件再拷过去可以用-diff配合快照。这是个高阶用法但逻辑很简单——源端和目标端各做一次快照-diff直接比出差异文件名列表交给distcp执行。实际运维中还有几个不能踩的雷不要在业务高峰期跑不加-bandwidth的大批量distcp一个几十TB的迁移任务可以把你千兆网络跑满Kafka、HBase这类实时业务会明显抖动。同步带大量小文件的目录时提前把Map任务调小。默认一个Map处理的文件数有限小文件巨多时-m开太大任务调度开销反而比拷贝还贵。检查源目录是否有人正在写文件。distcp处理正在写入的文件会得到不一致的副本上线前先确认源端没有新增写入或者用-update连续跑几遍保证最终一致。5.3 运维里另外两件高频事除了distcp日常维护Hadoop集群最常做的是两件事检查块健康和均衡磁盘。块健康检查用hdfs fsckhdfs fsck /user/hive/warehouse -files -blocks -locations这个命令会报告哪些Block副本数不足、哪些文件损坏是判断“为什么某个目录读不出来”最直接的诊断工具。注意fsck只查元数据和块的映射完整性不做数据完整性校验想验证数据块是否损坏得更彻底可以加上-openforwrite或者看DataNode日志里的校验和错误。磁盘不均衡用hdfs balancer。跑批集群里各节点因为业务不同磁盘使用率经常会出现60%对30%的悬殊这时就需要让集群自己搬一搬数据hdfs balancer -threshold 10 -D dfs.datanode.balance.bandwidthPerSec10485760-threshold 10表示把各节点使用率差距调整到10%以内后面那个参数把每节点的均衡带宽限制在10MB/s避免均衡过程影响正常业务。新手经常会犯的错是在集群磁盘快满时才跑balancer那时候数据搬不动还占带宽正确的习惯是隔一段时间就跑一次把问题消灭在萌芽状态。6. 面试和学习关于Hadoop你真正需要掌握的东西6.1 高频面试题背后的原理“hadoop面试题”是搜索量最大的词之一。我去面试别人时最常问的问题其实就那么几个来回换着问HDFS写流程读流程考察你对数据流向的理解是否清晰。写流程要能讲明白客户端、NameNode、DataNode三方的协作关系以及副本的流水线复制读流程则要提到“就近读取”和“校验和验证”。副本放置策略问这个题的潜台词是看你能不能理解“机架感知”为什么重要——它本质上是用空间换可靠性和带宽。NameNode宕机怎么办这是HA相关的延伸答不上来的人说明没有生产经验。一个文件为什么写了一半就不动了实际排查路径是看DataNode是否满盘、网络是否抖动、副本数是否满足、是否有慢节点每一步都用得上fsck和日志分析。数据倾斜怎么处理这是MapReduce性能的经典痛点答不上来基本告别离线数仓岗位。6.2 为什么说“背题没用”有一次我面试一个简历写着“精通Hadoop”的候选人问他你搭过集群吗他说搭过。那集群里三副本数据为什么有时候会变成两副本他答不上来。不是他背得不够多而是他根本没亲手遇到过一次DataNode磁盘写满、一次网络分区、一次节点下线。真正的面试官想听的不是标准答案而是你遇到问题时的排查思路。比如“NameNode元数据丢了怎么恢复”理想答案不是“用fsimage加edits恢复”而是能说出“我在生产上做过平时把fsimage定期备份到其他集群丢失后用hdfs nametnode -recover加-rollback处理但关键是要提前开启trash和定期快照”。这种细节只有亲手踩过坑才说得出来。6.3 一条适合大部分人的学习路线结合热搜词里课程设计等多个痛点我建议想系统学Hadoop的人按这个节奏走第一周用Docker镜像跑通一个Hadoop环境执行最简单的WordCount理解Map和Reduce各自输出的内容长什么样。第二周手动配一个伪分布式改成自定义端口、改副本数、改Block大小观察这些参数对文件分布、运行速度的实际影响。这一周是建立“配置和数据行为”之间因果关系的黄金时间。第三周用三台虚拟机搭一个真实集群配NN HA和RM HA部署Zookeeper手动杀掉Active NameNode验证故障转移。做完这一步你对HA的理解会超过80%的简历党。第四周选一个小型数据源比如一份CSV日志写出完整的数据分析方案数据上传HDFS、建Hive外表、写SQL做统计、结果导出。这就是一个课程设计的完美骨架。以后按需补HBase、Spark、Flink。你会发现有了Hadoop的基础学上层计算引擎是顺水推舟的事因为YARN上的资源模型、HDFS上的数据组织你都门儿清了。课程设计选题上日志点击流分析、电商订单统计、结合Zookeeper的HA集群部署、基于distcp的双集群数据同步这四个方向既好讲又有实操深度每年都有学生靠这几个题拿优秀。6.4 一点个人心得这几年我带过不少新人发现一个有共性的规律凡是能独立把伪分布式搭起来、遇到报错会翻日志、能冷静把clusterID问题解决的后面学任何大数据组件都很快反过来只刷课不敲命令的面试一问细节就露馅。Hadoop这个技术体系已经过了靠新鲜感吸引人的阶段它沉淀下来的存储与分布式思想、故障恢复机制、资源调度模型至今仍然是理解整个大数据技术栈的最佳入口。面试官问“什么是Hadoop”真想要的不是定义而是你亲手跑过之后的那种笃定感。如果你正在这条路上别急着背更多名词先去把那个报错修好吧。
返回列表