尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Hadoop大数据平台搭建实战:从集群规划到日志分析完整指南

Hadoop大数据平台搭建实战:从集群规划到日志分析完整指南 简介一份面向大数据专业毕业生及Hadoop初学者的毕业论文参考围绕企业海量日志分析场景完整展示基于Hadoop的数据分析系统设计思路。论文以某企业每年约2TB日志数据为背景针对Oracle数据库查询变慢、易死机的问题提出采用HDFS与MapReduce构建分布式分析平台覆盖需求分析、Hadoop简介、单一部署、批量部署及日志分析等章节。部署部分详述CentOS环境搭建、SSH免密登录、JDK安装、Hadoop配置与优化并介绍Hive、HBase及Ganglia的安装使用还对比了Cobbler与Ambari两种批量部署工具内容具体、可操作性强。论文不仅给出系统设计方案也总结了Hadoop集群在可靠性、扩展性、容错性等方面的优势以及单点失效、认证不足等劣势帮助读者在做技术选型时更全面地权衡。资源共1个PDF文件包体大小5.76MB已有643人学习下载适合作为毕业设计选题、论文撰写或Hadoop入门实践的重要参考资料。1. 从Oracle到Hadoop一次真实的企业日志迁移一家企业门户每年滚动产生约2T的访问日志最初全部灌进Oracle做统计分析。随着表数据量增长到几百GB一次分组统计要跑十几分钟偶尔还把数据库连接池打满整个业务系统跟着卡死。加索引、调SGA都是缓兵之计日志这种追加型数据天然不适合放在行式存储里反复全表扫描。最后落地的方案是用四台普通PC装CentOS 6.5部署Hadoop 2.2.0集群日志按天写入HDFS查询走Hive和MapReduceOracle彻底退出ETL链路。这份资料是一整套Hadoop数据分析系统设计过程覆盖了需求分析、集群规划、单一部署、批量部署再到日志分析的全部环节。对正在准备Hadoop毕业设计、课程设计或者想在企业里小规模搭建日志分析平台的人来说最有价值的不是某个安装命令而是整个部署顺序与参数取舍什么时候手工装、什么时候上批量工具、Hive的Metastore为什么要迁到MySQL、集群跑起来之后怎么确认它是健康的。2. 集群规划与基础环境配置IP、SSH与JDK的坑2.1 节点规划与网络参数设计集群由四个节点组成一台master、三台slave。master承担NameNode、ResourceManager和SecondaryNameNodeslave运行DataNode与NodeManager。规划阶段就要把每台机器的IP、主机名、网关固定下来后续所有配置都以这个表为准。机器名IP地址网关角色master.dayoo.com192.168.93.210192.168.93.254NameNode / ResourceManager / SecondaryNameNodehadoop001.dayoo.com192.168.93.211192.168.93.254DataNode / NodeManagerhadoop002.dayoo.com192.168.93.212192.168.93.254DataNode / NodeManagerhadoop003.dayoo.com192.168.93.213192.168.93.254DataNode / NodeManagerIP规划时注意两点一是所有节点必须在同一网段且能互通Hadoop不会帮你处理跨网段的RPC透传二是主机名尽量不要带下划线后面HDFS和YARN的配置解析遇到特殊字符容易出问题。这份资料里网关统一指向192.168.93.254连接外网下载依赖包时Gateway必须可用否则yum源和wget都会卡住。2.2 网络配置与hosts解析先配置master的静态IP与主机名其余三台对应修改IP即可。[rootmaster ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0 TYPEEthernet ONBOOTyes BOOTPROTOstatic IPADDR192.168.93.210 NETMASK255.255.255.0 GATEWAY192.168.93.254 DNS1192.168.92.2这里BOOTPROTOstatic是必须的DHCP分配的IP一旦变化NameNode地址解析就会失效。DNS1配置成内网DNS如果DNS不可用建议把解析事项全部交给hosts文件避免集群内部通信依赖外网DNS。接着统一hosts四台机器内容完全一致[rootmaster ~]# vi /etc/hosts 192.168.93.210 master.dayoo.com 192.168.93.211 hadoop001.dayoo.com 192.168.93.212 hadoop002.dayoo.com 192.168.93.213 hadoop003.dayoo.com同步到三台slave[rootmaster ~]# scp /etc/hosts hduserhadoop001.dayoo.com:/etc/hosts [rootmaster ~]# scp /etc/hosts hduserhadoop002.dayoo.com:/etc/hosts [rootmaster ~]# scp /etc/hosts hduserhadoop003.dayoo.com:/etc/hosts提示很多DataNode连不上NameNode的报错根源是slave上把master解析成了另一台机器。配置完成后用ping master.dayoo.com -c 1逐台验证再用ssh hadoop001.dayoo.com走一遍全链路确认解析和路由都没问题再进入下一步。2.3 创建统一运行账户与SSH免密钥登录Hadoop不允许用root直接启动原因是集群安全模型对权限校验很严格。这里统一创建hduser账户[rootmaster ~]# useradd hduser [rootmaster ~]# passwd hduser [roothadoop001 ~]# useradd hduser [roothadoop001 ~]# passwd hduser # hadoop002、hadoop003同样操作SSH免密登录的原理是基于非对称密钥master生成一对rsa密钥把公钥追加到各节点hduser的~/.ssh/authorized_keys之后再ssh就不再提示输入密码。Hadoop的start-dfs.sh脚本需要远程ssh到slave拉起DataNode进程没有免密就只能每台机器手动启动所以这一步不能跳过。[hdusermaster ~]$ ssh-keygen -t rsa -P [hdusermaster ~]$ cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys [hdusermaster ~]$ chmod 600 ~/.ssh/authorized_keys [hdusermaster ~]$ ssh hadoop001.dayoo.com mkdir -p .ssh [hdusermaster ~]$ cat ~/.ssh/id_rsa.pub | ssh hduserhadoop001.dayoo.com cat .ssh/authorized_keys [hdusermaster ~]$ ssh hadoop002.dayoo.com mkdir -p .ssh [hdusermaster ~]$ cat ~/.ssh/id_rsa.pub | ssh hduserhadoop002.dayoo.com cat .ssh/authorized_keys [hdusermaster ~]$ ssh hadoop003.dayoo.com mkdir -p .ssh [hdusermaster ~]$ cat ~/.ssh/id_rsa.pub | ssh hduserhadoop003.dayoo.com cat .ssh/authorized_keys-P 表示私钥口令为空否则后续ssh登录还会二次交互。公钥分发后逐一执行ssh hadoop001.dayoo.com不需要输入密码才算通过。常见失败原因有三个.ssh目录权限不是700、authorized_keys权限不是600、或者/home/hduser的属主不是hduser这三项分别排查即可。2.4 JDK安装与环境变量Hadoop的所有守护进程都是JVM进程JDK版本与位数必须和Hadoop匹配。资料中使用的是JDK 1.7.0_45安装方法[rootmaster ~]# mkdir -p /usr/java [rootmaster ~]# tar zxvf jdk-7u45-linux-x64.tar.gz -C /usr/java/ [rootmaster ~]# vi /etc/profile JAVA_HOME/usr/java/jdk1.7.0_45 JRE_HOME/usr/java/jdk1.7.0_45/jre PATH$PATH:$JAVA_HOME/bin:$JRE_HOME/bin CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export JAVA_HOME JRE_HOME PATH CLASSPATH [rootmaster ~]# source /etc/profile [rootmaster ~]# java -versionCLASSPATH里的dt.jar和tools.jar是JDK自带的工具类库Hadoop的脚本会引用$JAVA_HOME/bin/java所以JAVA_HOME必须指向实际解压目录。三台slave也要重复同样操作。只执行source /etc/profile只在当前会话生效重开终端或重启后失效所以/etc/profile必须写入另外注意hadoop-env.sh和yarn-env.sh里也需要单独指定JAVA_HOME后面配置Hadoop时会用到。3. Hadoop核心配置与集群启动core-site、hdfs-site与YARN参数3.1 安装包选择32位与64位的取舍Hadoop 2.2.0时代官方编译的本地库libhadoop存在32位和64位差异。如果操作系统是64位的CentOS却用了32位安装包启动时会报找不到native库的警告虽然MapReduce任务基本能跑但本地库的压缩和校验功能会退化。资料里把安装过程分成32位与64位两个版本分别处理就是这个原因。[hdusermaster ~]$ mkdir -p /home/hduser/hadoop [hdusermaster ~]$ tar zxvf hadoop-2.2.0.tar.gz -C /home/hduser/今天从镜像站下载时直接选hadoop-2.2.0.tar.gz即可64位系统优先选x86_64版本32位系统选i586版本。安装前用uname -m确认系统架构避免装完再返工。3.2 目录规划与slaves角色文件HDFS运行需要三类目录NameNode的元数据目录、DataNode的数据块目录、以及临时目录。[hdusermaster ~]$ mkdir -p /home/hduser/dfs/name [hdusermaster ~]$ mkdir -p /home/hduser/dfs/data [hdusermaster ~]$ mkdir -p /home/hduser/temp [hdusermaster ~]$ vi /home/hduser/hadoop-2.2.0/etc/hadoop/slaves hadoop001.dayoo.com hadoop002.dayoo.com hadoop003.dayoo.comdfs/name只存在于master上保存命名空间的镜像和编辑日志dfs/data是三台slave存数据块的位置temp是Hadoop的临时目录MapReduce的中间结果和HDFS的写入缓冲都会用到。slaves文件的内容决定start-dfs.sh脚本会ssh到哪些节点启动DataNode所以必须写全主机名而不是IP与hosts保持一致。3.3 core-site.xml与hdfs-site.xml核心参数core-site.xml配置的是整个集群的公共属性其中fs.defaultFS是客户端访问HDFS的入口所有节点必须相同。configuration property namefs.defaultFS/name valuehdfs://master.dayoo.com:9000/value /property property nameio.file.buffer.size/name value131072/value /property property namehadoop.tmp.dir/name valuefile:/home/hduser/temp/value /property property namehadoop.proxyuser.hduser.hosts/name value*/value /property property namehadoop.proxyuser.hduser.groups/name value*/value /property /configurationhdfs-site.xml负责HDFS自身的属性包括元数据和数据块的落盘位置configuration property namedfs.namenode.name.dir/name valuefile:/home/hduser/dfs/name/value /property property namedfs.datanode.data.dir/name valuefile:/home/hduser/dfs/data/value /property property namedfs.replication/name value3/value /property property namedfs.namenode.secondary.http-address/name valuemaster.dayoo.com:50090/value /property /configuration核心参数含义整理如下参数默认值作用与建议fs.defaultFSfile:///HDFS访问入口客户端和DataNode都靠它定位NameNodeio.file.buffer.size4096文件读写缓冲区131072即128KB对顺序读写更友好hadoop.tmp.dir/tmp/hadoop-${user}默认元数据与临时文件根目录必须改到非临时分区dfs.namenode.name.dir由hadoop.tmp.dir派生NameNode元数据目录不要放在系统盘根分区dfs.datanode.data.dir由hadoop.tmp.dir派生数据块存储目录可以配置多个目录分散磁盘IOdfs.replication3副本数不超过DataNode数量才有意义hadoop.proxyuser.hduser.hosts与hadoop.proxyuser.hduser.groups是代理用户配置。HiveServer2或后续调度工具需要以hduser身份代理提交任务时这两个属性不配置会报AuthorizationException。这里直接放行*实验环境足够生产环境建议收敛到指定主机和用户组。3.4 YARN与mapred-site.xmlHadoop 2.x把资源管理和计算框架拆开YARN负责资源调度MapReduce跑在YARN之上。缺少shuffle配置时Map任务跑完但Reduce拿不到数据任务卡在100%不动。[hdusermaster hadoop-2.2.0]$ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml [hdusermaster hadoop-2.2.0]$ vi etc/hadoop/yarn-site.xmlconfiguration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuemaster.dayoo.com/value /property /configurationmapred-site.xml里需要指定计算框架configuration property namemapreduce.framework.name/name valueyarn/value /property /configurationyarn.nodemanager.aux-services是NodeManager的辅助服务列表mapreduce_shuffle是MapReduce在YARN上运行的必配项漏掉之后Container启动阶段直接报错。如果物理机内存只有4GB还要在yarn-site.xml里显式设置yarn.nodemanager.resource.memory-mb和yarn.nodemanager.resource.cpu-vcores否则NodeManager按默认的8GB内存去申请资源内存不足会频繁触发Container被杀。3.5 格式化NameNode与启动顺序配置完成后的第一个动作是格式化NameNode只在master执行一次[hdusermaster hadoop-2.2.0]$ bin/hdfs namenode -format [hdusermaster hadoop-2.2.0]$ sbin/start-dfs.sh [hdusermaster hadoop-2.2.0]$ sbin/start-yarn.sh格式化会在dfs.namenode.name.dir目录写入namespaceIDDataNode首次启动时从NameNode获取clusterID并持久化到本地。这里最容易踩的坑是重复格式化一旦format两次DataNode的clusterID还是旧的而NameNode已经生成新的于是所有DataNode都连不上NameNode。遇到这种问题不要一遍遍重试format正确做法是清空所有节点的dfs/name和dfs/data目录后重新格式化并确保是全新一致的状态。启动后执行jps验证进程。master上应该看到NameNode、SecondaryNameNode、ResourceManager三个进程三台slave上分别看到DataNode和NodeManager。缺少任何一个进程先看对应节点$HADOOP_HOME/logs/目录下的日志不要一上来就怀疑集群配置。4. Hive、HBase与Ganglia生态组件的选型与接入4.1 Hive的Metastore从Derby到MySQLHive的核心能力是把SQL翻译成MapReduce作业它自己并不存数据只维护一份描述表结构、分区位置、字段类型的元数据。默认情况下这份元数据存在内置的Derby数据库里Derby只支持单会话访问两个人同时操作Hive就报锁冲突所以集群环境必须迁到MySQL。CREATE DATABASE hive_metastore DEFAULT CHARACTER SET utf8; GRANT ALL ON hive_metastore.* TO hive% IDENTIFIED BY hive123; FLUSH PRIVILEGES;hive-site.xml里需要配置连接信息configuration property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://master.dayoo.com:3306/hive_metastore/value /property property namejavax.jdo.option.ConnectionDriverName/name valuecom.mysql.jdbc.Driver/value /property property namejavax.jdo.option.ConnectionUserName/name valuehive/value /property property namejavax.jdo.option.ConnectionPassword/name valuehive123/value /property /configurationMySQL驱动是Hive与MySQL通信的桥梁把mysql-connector-java的jar包复制到$HIVE_HOME/lib目录否则初始化元数据时会报ClassNotFound。初始化命令是bin/schematool -initSchema -dbType mysql这一步成功后再启动Hive。4.2 用Hive分析访问日志先把日志上传到HDFS再建一张外部表指向日志目录。外部表的优势是删除表不会删掉底层文件日志分析场景尤其是这样。[hdusermaster ~]$ $HADOOP_HOME/bin/hdfs dfs -mkdir -p /data/weblog [hdusermaster ~]$ $HADOOP_HOME/bin/hdfs dfs -put access_20240901.log /data/weblog/CREATE EXTERNAL TABLE ods_weblog_raw (line STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY \n LOCATION /data/weblog; SELECT regexp_extract(line, \\([A-Z]) (\\S), 2) AS path, COUNT(*) AS cnt FROM ods_weblog_raw GROUP BY regexp_extract(line, \\([A-Z]) (\\S), 2) ORDER BY cnt DESC LIMIT 20;单列表加正则解析是最省事的做法。regexp_extract的三个参数分别是源字符串、正则、捕获组序号第2个捕获组取到的是请求路径。想查哪些IP触发了500错误把WHERE条件加上regexp_extract(line, (\\d{3}) \\d$, 1) 500状态码是整行末尾以空格分隔的三位数字用\\d{3}匹配。Hive的SQL最终都会转换成MapReduce作业数据量大时在YARN的8088端口能看到对应的Application。4.3 HBase面向列的实时查询索引Hive适合批量扫描但单条日志的明细查询如果也走全表扫描延迟不可接受。HBase是一个面向列的分布式数据库适合承载日志的实时索引查询。[hdusermaster ~]$ hbase shell hbase(main):001:0 create weblog_index, {NAME d, VERSIONS 1, COMPRESSION SNAPPY} hbase(main):002:0 put weblog_index, 20240912_192.168.93.210_001, d:path, /index.html hbase(main):003:0 put weblog_index, 20240912_192.168.93.210_001, d:status, 200 hbase(main):004:0 scan weblog_index, {STARTROW 20240912_, STOPROW 20240913_, LIMIT 10}RowKey设计直接决定查询性能和写入分布。20240912_192.168.93.210_001这种前缀带日期的写法按时间范围scan很直观但持续写入会集中在以当前日期为前缀的Region上造成热点。写入量大时更稳的做法是在前缀加散列字段或把时间戳倒序付出一点scan复杂度的代价换取Region写入均衡。4.4 Ganglia非侵入式的集群监控Ganglia分三层组件gmond部署在每台节点采集CPU、内存、磁盘与网络指标gmetad部署在master聚合所有gmond上报的数据并写入RRD文件web面板负责展示历史曲线。[rootmaster ~]# yum install -y ganglia ganglia-gmetad ganglia-gmond [rootslave ~]# yum install -y ganglia-gmond [rootmaster ~]# vi /etc/ganglia/gmond.conf cluster { name hadoop-log } udp_send_channel { host master.dayoo.com port 8649 } udp_recv_channel { port 8649 }gmond默认走组播实验网络不支持组播时改成单播udp_send_channel的host指向master。每台slave只装gmondmaster同时运行gmond、gmetad和web服务。监控对数据分析系统的意义在于能提前发现磁盘空间不足和节点负载倾斜这两类问题在Hadoop集群里会直接表现为MapReduce任务大面积变慢。5. Cobbler与Ambari批量部署不是可选而是必经之路5.1 CobblerPXE加kickstart的自动化安装手工部署到第三台slave时就会意识到重复装系统、配网络、传公钥这套动作太耗时了。Cobbler是对PXE、DHCP、TFTP和kickstart的封装通过一条命令就能让裸机自动完成操作系统安装。[rootmaster ~]# yum install -y cobbler dhcp tftp-server [rootmaster ~]# cobbler check [rootmaster ~]# cobbler distro add \ --nameCentOS-6.5-x86_64 \ --kernel/var/www/cobbler/ks_mirror/CentOS-6.5-x86_64/images/pxeboot/vmlinuz \ --initrd/var/www/cobbler/ks_mirror/CentOS-6.5-x86_64/images/pxeboot/initrd.img [rootmaster ~]# cobbler profile add \ --namecentos65-hadoop-node \ --distroCentOS-6.5-x86_64 \ --kickstart/var/lib/cobbler/kickstarts/hadoop-node.ks [rootmaster ~]# cobbler system add \ --namehadoop004 \ --profilecentos65-hadoop-node \ --mac00:0C:29:11:22:33 \ --ip-address192.168.93.214 \ --netmask255.255.255.0 \ --gateway192.168.93.254Cobbler的三层模型要理解清楚distro定义系统镜像本身profile把distro和kickstart应答文件绑定system再把profile绑定到具体服务器的MAC与IP。hadoop-node.ks里可以提前写好分区方案、root密码、hduser账号甚至JDK安装脚本新机器接通电源进入PXE启动后整个过程不需要人工介入。5.2 Ambari用Blueprint声明式创建集群Ambari解决的是Hadoop组件层面的批量部署。上述Cobbler的kickstart脚本只能初始化操作系统并不清楚NameNode、DataNode、Hive这些组件各自该装在哪台机器、配置文件有什么区别。Ambari通过Server管理所有节点的Agent用Blueprint声明集群结构把角色分配、配置下发和启动流程全部集中起来。[rootmaster ~]# ambari-server setup [rootmaster ~]# ambari-server start [rootslave ~]# ambari-agent startBlueprint是一份JSON声明文件描述组件分布{ Blueprints: {blueprint_name: hadoop-log}, configurations: [], host_groups: [ {name: master-host, cardinality: 1, components: [{name: NAMENODE}, {name: RESOURCEMANAGER}, {name: HIVE_SERVER}, {name: HBASE_MASTER}]}, {name: slave-hosts, cardinality: 3, components: [{name: DATANODE}, {name: NODEMANAGER}, {name: HBASE_REGIONSERVER}]} ] }把Blueprint和主机映射提交给Ambari REST APIcurl -u admin:admin -H X-Requested-By: hadoop -X POST \ http://master.dayoo.com:8080/api/v1/blueprints/hadoop-log \ --data blueprint.json curl -u admin:admin -H X-Requested-By: hadoop -X POST \ http://master.dayoo.com:8080/api/v1/clusters/log-cluster \ --data hostmapping.jsonhostmapping.json里把master-host映射到master.dayoo.comslave-hosts映射到三台hadoop主机。Ambari收到请求后自动完成所有组件的安装、配置和启动整个过程可以在Web UI上观察。值得提醒的是Ambari管理过的集群配置文件会被它接管之后再用命令手工改配置Ambari重启服务时会覆盖回去。如果计划用Ambari从初始化集群起就统一走它的界面操作。5.3 手工部署与批量部署的边界部署方式适用场景主要代价手工部署学习原理、验证新版本、3到5台小集群重复操作多配置容易漂移Cobbler裸机批量装系统节点多且硬件一致只解决OS层组件层仍需手工或配合其他工具Ambari多组件、多节点、需要持续扩缩容引入中心服务依赖版本升级要跟随API变更资料里的顺序是先在单台机器上手工部署一遍再上Cobbler和Ambari这个路径本身就很合理。跳步直接上Ambari虽然能快速得到集群但排障时连core-site.xml在哪个目录、NameNode日志打到哪都找不到出了问题反而更被动。手工部署和批量部署不是二选一先手工理解机制再批量复制到规模是成本最低的学习路径。6. 日志分析实战验证集群的三种手段6.1 用自带示例打通全链路集群搭好后先用Hadoop自带的wordcount示例验证HDFS、YARN和MapReduce三条链路是否通畅[hdusermaster hadoop-2.2.0]$ bin/hdfs dfs -mkdir -p /tmp/wordcount/in [hdusermaster hadoop-2.2.0]$ bin/hdfs dfs -put /etc/hosts /tmp/wordcount/in [hdusermaster hadoop-2.2.0]$ bin/yarn jar \ share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar \ wordcount /tmp/wordcount/in /tmp/wordcount/out [hdusermaster hadoop-2.2.0]$ bin/hdfs dfs -cat /tmp/wordcount/out/part-r-00000wordcount自带jar完整走完Map、Shuffle、Reduce三个阶段任何一个环节配置错误都会在这里暴露。注意输出目录/tmp/wordcount/out必须不存在否则作业直接报错如果jar的版本号与安装包不一致用find hadoop-* -name *examples*.jar定位一下实际路径。6.2 集群指标怎么看HDFS的健康状态用hdfs dfsadmin -report查看输出里包含每台DataNode的容量、已用空间和心跳状态出现In Service之外的状态就说明节点有问题。YARN侧用yarn node -list -all看NodeManager是否全部注册。Web界面方面NameNode的50070端口展示整个文件系统的总容量和危险副本数ResourceManager的8088端口能看到每个作业的Map与Reduce进度日志分析任务跑到哪个阶段一目了然。6.3 作业失败时先看这里MapReduce作业失败时先到YARN的日志中心拉取完整诊断[hdusermaster hadoop-2.2.0]$ bin/yarn logs -applicationId application_1726000000000_0001这个命令会把该Application所有Container的stdout、stderr和syslog合并输出定位是代码问题还是资源问题最直接。没有保留AggregatedLog的旧作业去$HADOOP_HOME/logs/userlogs/目录下按application_id/container_id翻原始日志。日常运维还有一个检查重点df -h看NameNode元数据目录和dfs/name所在分区的剩余空间元数据目录写满时整个集群会自动进入安全模式拒绝写操作比DataNode磁盘满更隐蔽也更致命。本文还有配套的精品资源点击获取
返回列表