ARTICLE DETAIL

资讯详情

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

Hadoop入门实战:环境搭建、集群部署与Hive分析

Hadoop入门实战:环境搭建、集群部署与Hive分析 做大数据这一行不管你是刚毕业准备入行还是从后端转过来第一座绕不开的山就是Hadoop。我见过太多人一上来就啃源码、看原理结果卡在环境搭建上整整一周连HDFS都起不来。其实Hadoop入门没那么玄乎核心就三件事把环境装明白、把原理想明白、把排查套路练明白。这篇文章就按我这些年带新人、自己踩坑的经验给你一条最稳的上手路线全部是可落地的实操内容。先说清楚这篇文章适合谁。如果你是完全没接触过分布式系统的小白按着步骤走一个周末能把单机伪分布式跑起来如果你已经有Linux基础、写过Java代码那这篇文章能帮你快速建立起Hadoop的整体操作框架少走我当年绕过的弯路。我不讲大而全的理论只讲真正用得上的东西。1. 动手前的三个关键决策1.1 版本选型千万别在新版本上纠结太久Hadoop的版本问题劝退过很多人。打开Apache官网一看3.3.x、3.4.x一堆还有CDH、HDP这些发行版新手直接懵圈。我给个最简单的建议学入门就用Apache社区版版本选3.3.x别碰3.4以上的太新版本也别回头用2.x。为什么这么选因为3.3.x是目前资料最丰富、踩坑记录最多的稳定版本。网上能搜到的教程、报错解决方案绝大多数都是基于3.x写的。2.x和3.x在端口、配置项、命令细节上都有区别你拿着老教程配新版本很容易卡在一些莫名其妙的地方。至于CDH这种商业发行版等你真正进公司、遇到生产环境再说自学阶段没必要跟它较劲。版本定下来之后下载地址也有讲究。Apache官网的下载页会跳转到镜像站国内用户直接选清华或者阿里的镜像源速度能快几十倍。下载时认准带-bin后缀的tar.gz包比如hadoop-3.3.6.tar.gz这是编译好的二进制包拿回来解压就能用。千万别下载源码包那玩意儿还得自己用Maven编译纯属给自己找罪受。1.2 环境准备JDK版本、SSH免密、目录规划Hadoop是Java写的所以JDK是硬前提。这里有个经典坑JDK版本和Hadoop版本必须匹配。3.3.x默认支持JDK 8如果你系统上装的是JDK 11甚至17运行时会报各种奇怪的错。我的经验是入门阶段老老实实装JDK 8等后面用到Spark、Flink这些框架时再考虑换版本。安装JDK时注意用tar.gz包解压安装然后配好JAVA_HOME环境变量不要用Linux包管理器自带的OpenJDK那个版本更新不可控容易出幺蛾子。然后是SSH免密登录。这个必须配因为Hadoop启动时主节点要通过SSH连到各个从节点去拉进程。虽然是单机伪分布式它也会通过SSH连本机不配免密的话你每次启动都要输入密码烦死。配置命令很简单ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ssh localhost能直接登录不需要密码这一步就算完成了。这里有个容易忽略的点~/.ssh目录的权限必须是700authorized_keys文件权限必须是600权限太宽反而会被拒绝这是SSH的安全机制。最后是目录规划。我强烈建议建一个专门的目录来放Hadoop的数据不要用默认的/tmp。因为/tmp在Linux里是临时目录系统重启可能清空数据到时候你辛苦跑的HDFS数据全没了别问我是怎么知道的。推荐建/data/hadoop作为HDFS数据目录日志单独放/data/hadoop/logs这样排查问题的时候找日志也好找。1.3 硬件配置评估别在虚拟机里硬撑很多人学习时喜欢用虚拟机这个思路没问题但要注意资源配置。Hadoop伪分布式跑起来Namenode、Datanode、ResourceManager、NodeManager这些进程加起来内存占用轻易就能到2GB以上。VMware或者VirtualBox里我建议给至少4GB内存、2核CPU。你如果只分1GB内存给虚拟机光把进程跑起来就极限了再跑个MapReduce作业直接就卡死了。另外提醒一句电脑如果本身内存只有8GB跑虚拟机确实吃力。这种情况下我反而建议用Docker来跑Hadoop镜像。网上有现成的Hadoop Docker镜像docker pull下来就能用。这种方式对宿主机性能要求相对友好而且环境干干净净玩坏了直接删容器重启一个就是特别适合反复折腾。不过要注意Docker方式适合体验和学习如果将来要搞集群还是得回到实体机或者云服务器上练。2. 伪分布式搭建全流程配置文件的逐项拆解2.1 四个核心配置文件的秘密Hadoop的配置集中在$HADOOP_HOME/etc/hadoop目录下核心就四个文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml。新手一看到这堆XML就头疼其实每个文件管的事情特别清晰。core-site.xml是全局入口配置。最重要的就是fs.defaultFS这个属性它指定了HDFS的地址和端口。默认值是本地文件系统你要把它改成HDFS的地址推不推荐9000端口这个端口在3.x里叫fs.defaultFS默认端口但不同版本有差异。我这里给你一个实测稳的方案property namefs.defaultFS/name valuehdfs://localhost:9000/value /propertyhdfs-site.xml管的是HDFS自身的参数。伪分布式模式下因为只有一个节点DataNode和NameNode在同一台机器上所以副本数必须设为1否则你会看到数据块始终处于复制中日志里全是告警property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/data/hadoop/namenode/value /property property namedfs.datanode.data.dir/name value/data/hadoop/datanode/value /propertyname.dir和data.dir这两个路径设置很多教程会忽略但我觉得必须加上。前面说过不要用/tmp存数据。这两个目录会存放NameNode的元数据和DataNode的实际数据块都是要命的东西一定要放到稳定的磁盘路径下。yarn-site.xml管的是资源调度。伪分布式不需要太复杂但有个关键参数是yarn.nodemanager.vmem-check-enabled默认是true意思是虚拟内存超限就杀死任务。伪分布式跑WordCount经常报这个错。我的习惯是直接设成falseproperty nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.vmem-check-enabled/name valuefalse/value /propertymapred-site.xml这个要注意目录下默认不存在需要把mapred-site.xml.template复制一份出来改。它管的是MapReduce运行框架用Yarn来跑property namemapreduce.framework.name/name valueyarn/value /property2.2 环境变量与首次启动配置文件弄完还要配环境变量。编辑~/.bashrc把Hadoop的bin目录加进去export HADOOP_HOME/usr/local/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoopsource ~/.bashrc之后运行hadoop version能正常输出版本号环境就算通了。这里有一条经验每次修改配置文件后不需要重启机器但需要重启相关服务。新手经常改完配置直接跑发现没生效还以为是配置写错了其实就是没重启。首次启动HDFS前必须先格式化NameNodehdfs namenode -format这一步会初始化文件系统的元数据。格式化过程中会输出一堆日志不要看到WARN就慌。你需要确认的是这一行successfully formatted这样就成功了。启动顺序不能乱。先起HDFS再起YARNstart-dfs.sh start-yarn.sh启动完用jps命令验证。能同时看到NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager五个进程说明核心服务都起来了。如果少了哪个不要急直接去看对应日志。2.3 用Web界面和简单命令验证Hadoop自带Web界面比用命令行直观多了。NameNode的管理界面默认在http://localhost:98703.x是这个端口2.x是50070版本不同差别很大。打开后能看到HDFS的存储容量、存活节点数、数据块数量一目了然。命令行验证也是必备技能。以下几个命令初学者必须亲手敲一遍# 创建目录 hdfs dfs -mkdir /test # 上传文件 hdfs dfs -put /etc/hosts /test/ # 查看文件列表 hdfs dfs -ls /test # 查看文件内容 hdfs dfs -cat /test/hosts # 下载文件到本地 hdfs dfs -get /test/hosts /tmp/我见过有人问这跟Linux本地命令有什么区别区别大了。这些操作全走的是HDFS协议数据是发给NameNode和DataNode处理的架构完全不同。你能稳定执行这些命令HDFS基础算是过了。3. 伪分布式到真集群一次讲透集群部署与Hive实战3.1 集群节点规划与准备工作伪分布式跑通之后很多人就急着搭集群。但我建议先把单机玩熟至少知道每个进程是干什么的再上集群否则出问题连Log都没法定位。真集群部署硬件规划是第一件大事。生产环境的主节点内存一定要给足NameNode作为整个HDFS的“大脑”它要维护整个文件系统的元数据内存给的太小文件一多就会成为瓶颈。DataNode节点吃的是磁盘和IO。YARN的NodeManager要跑计算任务CPU和内存不能太寒酸。建议最低3台机器起步一台主节点跑NameNode和ResourceManager两台从节点跑DataNode和NodeManager这就是经典的Master/Slave结构。集群部署的第一步是基础环境统一。三台机器要保证JDK版本一致、Hadoop版本一致、SSH免密全部打通。从主节点到每个从节点包括从节点之间都要能免密登录这一步不能偷懒。配置完全一样主节点负责分发# 在主节点上将Hadoop安装包分发到所有节点 scp -r /usr/local/hadoop rootnode1:/usr/local/ scp -r /usr/local/hadoop rootnode2:/usr/local/3.2 配置文件参数修正与集群启动集群和伪分布式配置文件里最核心的区别在于主机名。伪分布式里写的是localhost集群里必须写成真实的主机名或者IP地址。core-site.xml里的fs.defaultFS改成hdfs://master:9000yarn-site.xml里所有配置都要对应改。还有关键一步从节点的机器上要配置workers文件把每台主机名一行一行写进去。格式化这一步很多人会踩大坑。集群搭建完成后需要在主节点执行hdfs namenode -format然后在所有从节点启动DataNode。我当初犯过的错误是格式化NameNode之后把主节点的namenode目录整个打包分发给了从节点结果集群启动了数据调度全乱。这里的正确做法是主节点格式化一次从节点删除之前残留的datanode目录然后启动即可不要自己去拷贝元数据除非你在做NameNode的元数据恢复。集群启动后验证思路和伪分布式一样但检查点更多。jps要在每台机器上执行看各自应有的进程。然后在主节点执行hdfs dfsadmin -report能正常列出各个DataNode的存储信息集群就通了。3.3 集群部署策略HA高可用方案要点如果你不是纯学习而是准备在生产环境用那非得搞HA高可用不可不然NameNode一旦挂掉整个HDFS就瘫痪了。HA的实现方案业界统一做法是“ZooKeeper JournalNode”。ZooKeeper负责分布式协调主要用来感知NameNode的存活状态JournalNode负责主备NameNode之间的元数据同步主节点把EditLog实时写到JournalNode集群备用节点从JournalNode拉取日志保证热备状态。为什么要引入ZooKeeper核心是要解决“脑裂”问题。脑裂指的是Active和Standby两个NameNode同时以为自己是主节点各自接收客户端请求、修改元数据导致整个集群的数据状态错乱。ZooKeeper通过ActiveStandbyElector机制来保证同一时间只有一个Active节点这个机制值得做的事儿你必须彻底理解面试题翻来覆去就考这个。HA的部署步骤网上参考资料很多我这里只提醒三个最容易被忽略的细节。第一JournalNode数量建议配奇数个大多数架构设计都采用3个这是为了在ZooKeeper仲裁时能形成多数派不会出现票数持平。第二dfs.nameservices、dfs.ha.namenodes.ns等一堆以ns结尾的配置项必须全集群统一少写一个单词整个HA就初始化不起来。第三两个NameNode之间要配置自动切换的脚本dfs.ha.automatic-failover.enabled必须设为true否则故障后不会自动切换HA就白做了。3.4 用Hive跑通第一个离线分析集群稳定之后下一步就是往“上面”加生态组件。Hive是很多人第一个接触的数据仓库工具它是把SQL翻译成MapReduce去跑用起来确实是“真香”不用写Java代码写SQL就行。部署Hive前要先装MySQL或MariaDB因为Hive的元数据默认存在Derby里Derby只支持单会话跑个多人协作查数就会锁冲突。生产环境必须把元数据切到MySQL。在hive-site.xml里配置javax.jdo.option.ConnectionURL、ConnectionDriverName、ConnectionUserName、ConnectionPassword这些参数对应数据库连接的四要素配置完成后用schematool -initSchema -dbType mysql初始化元数据然后就能用了。网约车数据分析是Hive入门的绝佳练习项目网上能找到很多现成的数据集。例如按时间段统计订单量、按区域统计热门上下车点、按驾驶员统计流水排名。练习的思路是先用create external table建外部表关联到HDFS上的原始数据目录然后用Hive SQL做清洗和聚合分析最后把结果导出到指定目录配合数据大屏工具做可视化。一条线走下来你才算是真正把Hadoop生态串起来了。我常和同事说Hadoop原理看十遍不如亲手跑一遍Hive分析后者对理解分布式数据处理的帮助是立竿见影的。4. 常见报错排查与面试高频考点4.1 新手最容易踩的坑我帮你踩过了Hadoop环境搭建过程中报错在所难免。踩坑不要紧关键是知道去哪儿看日志。Hadoop的日志默认在$HADOOP_HOME/logs目录比如hadoop-hadoop-namenode-master.log这种命名规则一看就知道是哪个节点、哪个进程的日志。排查时先用tail -100看末尾日志比打开整个大文件扫效率高多了。最常见的坑我整理了一个速查表遇到先对照自查80%的问题都能解决NameNode启动失败优先检查core-site.xml里fs.defaultFS的主机名和IP是否匹配再查hdfs-site.xml里的dfs.namenode.name.dir目录是否存在且有权限。用来回执行hdfs namenode -format前必须确认原来残留的数据目录已清空否则报目录已存在。DataNode起不来优先查磁盘空间是否写满再用hdfs dfsadmin -report看节点是否注册成功。很多时候DataNode无法启动是因为在格式化之前DataNode和NameNode的clusterID不一致文中提过旧数据目录删干净再重启。跑MapReduce任务卡在ACCEPTED多半是YARN的资源不足或者yarn.nodemanager.vmem-check-enabled导致内存被误杀。先看任务队列再调大NodeManager的内存参数。端口被占用8088被RM占据9870被NameNode占据。启动前用lsof -i:8088查端口不行就改端口不要硬碰。格式化之后Web界面进不去多半是防火墙没关或者HDFS服务根本没启动全。jps看一眼就明白了。4.2 大数据面试八股文原理必须懂很多同学学完Hadoop基本操作会了但面试一问原理就卡壳。我总结几个必考的点你不管项目经验多少这些原理必须随时能脱稿讲清楚HDFS的读写流程。写文件时客户端先请求NameNodeNameNode返回可用的DataNode列表然后客户端分块默认128MB一个块把数据写入第一个DataNode再通过管道方式逐级复制到后续DataNode最后一个节点确认写完客户端收到成功消息。读文件时客户端先问NameNode拿元数据得到块位置列表然后就近读取。面试时你能把这个流程从头到尾讲顺基本就过关了。MapReduce的执行流程。核心是Shuffle阶段。Map端输出后先溢写到本地磁盘做分区、排序、合并Reduce端启动复制线程拉取对应分区数据做归并排序最后给Reduce函数消费。面试官爱问“数据倾斜怎么处理”本质上就是某个Key的数据量特别大导致某个Reduce任务特别慢。常见解法是加随机前缀打散Key、增大Reduce并行度或者走两阶段聚合。HA的脑裂机制我已经在上面提到了ZooKeeper怎么选主、JournalNode怎么同步、怎么避免双Active这些都是大数据开发的经典八股背明白原理对着项目说效果比死记硬背好很多。4.3 学习路线建议别无止境地追新最后聊一下路线。大数据岗位的招聘要求年年变但底层逻辑没变过Hadoop生态仍然是行业的底层基础设施大数据开发工程师日常还是离不开HDFS、YARN、Hive。我见过有人学习时上来就死磕Spark源码调优结果连HDFS的副本机制都说不清楚那种学习方式其实很危险。我的建议很直接Hadoop学到能熟练部署、能跑通集群、能写Hive分析、能讲明白底层原理就达到了入门标准可以往下走。接下来优先学Spark它能让你把同样的计算逻辑跑出数量级的性能差距这在生产环境的效率差异很大再往后是Flink流式计算现在已经是标配元数据、指标、实时大屏都要靠它。数据仓库建模和SQL优化是永远加分的项目对职业发展的帮助不亚于学一个新框架。也许你会看到很多培训机构天天推新概念、新框架别慌很多都是旧瓶装新酒。把Hadoop的底层原理吃透往后学Spark、Flink只是API层面的迁移核心的分布式通信、存储、调度模型是相通的。技术栈会变底子不会过时。
返回列表