ARTICLE DETAIL

资讯详情

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

Hadoop 分布式集群实战 1—— 集群搭建与在线扩容

Hadoop 分布式集群实战 1—— 集群搭建与在线扩容 1 简介Apache Hadoop 是开源分布式存储 分布式计算大数据框架核心由HDFS、YARN、MapReduce三大组件构成面向海量离线批处理场景适合 TB/PB 级 “一次写入、多次读取” 的数据处理。1.HDFS分布式文件系统NameNode 管理元数据DataNode 存放真实数据。NameNodeNN管理节点保存元数据目录树、文件名、权限、文件与 Block 映射不存储真实业务数据。单点版本存在单点故障HA 模式搭配 Standby NameNode、ZKFC、JournalNode 实现故障自动切换Apache Had…。DataNodeDN工作节点存放切分后的真实数据块 Block默认 128MB定期上报心跳与块信息执行读写、副本复制。Client 客户端先访问 NameNode 获取元数据直接和 DataNode 传输真实数据。SecondaryNameNode辅助做元数据合并、Checkpoint不能热切换顶替 NameNode。✅写入流程WriteClient 请求 NameNode 创建文件、分配 Block 存储位置Client 直连目标 DataNode 写入数据块DataNode 之间完成副本同步 Replication✅读取流程ReadClient 请求 NameNode查询文件各个 Block 存放在哪些 DataNodeClient 直接连接对应 DataNode 获取真实数据 Read2.YARN集群资源调度管理器统一分配 CPU、内存支持 Spark、Flink、MapReduce 多种计算引擎混跑。ResourceManagerRM全局主管理器整个集群唯一的资源总调度中心接收客户端任务提交、管理所有 NodeManager、分配资源、调度队列。普通版本存在单点故障HA 模式配置 Active / Standby RM 实现高可用。NodeManagerNM节点代理每台机器一个每个计算节点上运行负责本机资源管理监控本机 CPU、内存启动 / 销毁容器 Container和 ResourceManager 保持心跳。ApplicationMasterAM应用管理器每个任务Application单独生成一个 AM。向 RM 申请资源和 NM 通信启动执行容器管控本任务运行、容错。Container资源容器YARN 最小资源分配单元封装 CPU、内存资源真正运行计算任务。✅工作流程Client 向 ResourceManager 提交作业ResourceManager 分配容器启动 ApplicationMasterApplicationMaster 向 ResourceManager 申请运行任务所需资源ResourceManager 根据各 NodeManager 上报的节点状态分配资源NodeManager 使用容器启动 MapTask、ReduceTask 等任务任务运行期间持续上报任务状态NodeManager 持续上报节点状态作业全部任务执行完成ApplicationMaster 释放占用资源3.MapReduce离线批计算编程模型分为 Map 并行处理、Reduce 聚合结果两个阶段。Input 输入分片HDFS 上的文件按 Block 逻辑切分为输入分片一个分片对应一个 Map 任务。Map 阶段映射读取分片数据自定义逻辑处理输出key,value键值对输出数据先写入本地磁盘不是 HDFS经过分区、排序、归并。Shuffle 洗牌Map → Reduce 中间过程重中之重分区数据通过网络传输到对应 Reduce 节点完成分组排序保证相同 key 的数据交给同一个 Reduce。Reduce 阶段归约接收一组相同 key 的数据集自定义聚合逻辑求和、计数、去重等。Output 输出最终结果写入 HDFS。✅工作流程输入文件进行分片每个分片交由一个 map () 函数执行 Map 任务输出键值对对 Map 输出数据进行分区、排序、归并相同 key 的数据分发至同一个 reduce ()reduce () 函数聚合处理分组数据执行 Reduce 任务最终产生输出文件Hadoop VS MooseFS特性MooseFS(MFS)Hadoop(HDFS)接口FUSE完整 POSIX可直接 mount 挂载普通程序无需改造非标准 POSIXJava API/Shell 访问不能直接挂载核心定位通用分布式文件存储大数据配套存储和计算引擎深度绑定适用场景中小集群、小文件、共享存储、虚拟机镜像、媒体素材超大文件、离线日志分析、数据仓库、海量批计算高可用Community 版单 Master依赖 PacemakerSBD 实现 HA原生支持双 NameNode HA、Zookeeper 故障转移2 单机伪分布式部署官方文档https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Download新建专用运行用户部署 JDK 和 Hadoop 安装包、配置环境变量[rootserver1 ~]# useradd hadoop[rootserver1 ~]# passwd hadoop[rootserver1 ~]# mv hadoop-3.3.6.tar.gz jdk-8u181-linux-x64.tar.gz /home/hadoop/[rootserver1 ~]# su - hadoop[hadoopserver1 ~]$tarzxf hadoop-3.3.6.tar.gz[hadoopserver1 ~]$tarzxf jdk-8u181-linux-x64.tar.gz[hadoopserver1 ~]$ln-shadoop-3.3.6 hadoop[hadoopserver1 ~]$ln-sjdk1.8.0_181 jdk[hadoopserver1 ~]$vim.bash_profileworkers文件用来定义 DataNode 节点列表伪分布式为localhost[hadoopserver1 ~]$source.bash_profile[hadoopserver1 ~]$cdhadoop[hadoopserver1 hadoop]$cdetc/[hadoopserver1 etc]$cdhadoop/[hadoopserver1 hadoop]$catworkersHadoop 启动脚本必须知道 Java 路径否则无法运行[hadoopserver1 hadoop]$vimhadoop-env.shbin/hadoop是Hadoop 的主入口命令脚本整个 Hadoop 绝大多数功能都靠它调用[hadoopserver1 hadoop]$cd[hadoopserver1 ~]$cdhadoop[hadoopserver1 hadoop]$ bin/hadoop执行命令后显示bin/hadoop命令的完整用法帮助说明本地模式测试不启动 HDFS直接在单机本地跑 MapReduce验证 jar 包、Java 环境是否正常运行MapReduce官方示例[hadoopserver1 hadoop]$mkdirinput[hadoopserver1 hadoop]$cpetc/hadoop/*.xml input[hadoopserver1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jargrepinput outputdfs[a-z.]# 使用 Hadoop 自带的 grep MapReduce 示例程序读取 input 目录里的配置文件检索匹配 dfs[a-z.] 的字段统计每个匹配词汇出现次数最终结果自动生成到 output 目录[hadoopserver1 hadoop]$cdoutput/[hadoopserver1 output]$ls[hadoopserver1 output]$cat*配置默认文件系统地址hdfs://localhost:9000[hadoopserver1 output]$cd..[hadoopserver1 hadoop]$cdetc/hadoop/[hadoopserver1 hadoop]$pwd/home/hadoop/hadoop/etc/hadoop[hadoopserver1 hadoop]$vimcore-site.xml配置文件副本数 dfs.replication1单机只能1副本[hadoopserver1 hadoop]$vimhdfs-site.xml配置免密[hadoopserver1 hadoop]$ ssh-keygen[hadoopserver1 hadoop]$ ssh-copy-id localhost[hadoopserver1 hadoop]$sshlocalhost# 切记 ctrld 退出初始化HDFS元数据仅首次部署执行[hadoopserver1 hadoop]$cd../..[hadoopserver1 hadoop]$pwd/home/hadoop/hadoop[hadoopserver1 hadoop]$ bin/hdfs namenode-format一键启动 NameNode DataNode拉起HDFS分布式文件系统[hadoopserver1 hadoop]$ sbin/start-dfs.sh有警告只需远程连接一下 server1 即可[hadoopserver1 hadoop]$sshserver1[hadoopserver1 ~]$logout查看正在运行的 Java 进程[hadoopserver1 hadoop]$ jps查看本机 TCP 端口监听情况均正常[hadoopserver1 hadoop]$netstat-antlp9000tcp 127.0.0.1:9000 → PID 32023 NameNodeHDFS 默认通信端口fs.defaultFS 使用的端口客户端、DataNode 和 NameNode 交互9864 / 9866 → DataNode 内置监听端口9867 / 9868 → SecondaryNameNode 端口9870 → NameNode WebUI 端口浏览器访问http://server1:9870 查看 HDFS 管理页面访问前端网页创建目录/user在分布式 HDFS 上不是本地磁盘[hadoopserver1 hadoop]$pwd/home/hadoop/hadoop[hadoopserver1 hadoop]$ bin/hdfs dfs-mkdir/user在刚才建好的/user下继续创建/user/hadoop目录[hadoopserver1 hadoop]$ bin/hdfs dfs-mkdir/user/hadoop点击 user 即可看见创建目录/user/hadoop/input用来存放 MR 任务的输入数据源上传文件[hadoopserver1 hadoop]$ bin/hdfs dfs-mkdirinput[hadoopserver1 hadoop]$ bin/hdfs dfs-putetc/hadoop/*.xml input# 本地 etc/hadoop/ 下所有 .xml 配置文件上传到 HDFS 的 /user/hadoop/input 目录里[hadoopserver1 hadoop]$ bin/hdfs dfs-lsinput前端可以看见此目录调用 hadoop 自带示例 jar运行WordCount 单词统计 MapReduce 程序读取 HDFS/user/hadoop/input里所有文件分词统计每个单词出现次数结果输出到 HDFS/user/hadoop/output[hadoopserver1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output[hadoopserver1 hadoop]$ bin/hadoop fs-catoutput/*区分本地模式测试的input、output在Linux 本机磁盘hadoop安装目录下本地文件夹不需要启动 HDFSls本地目录就能看见伪分布式的input、output 在HDFS 分布式文件系统完整路径/user/hadoop/input、/user/hadoop/output只能用bin/hdfs dfs -ls查看在服务器本地直接 ls看不到这个 output 文件夹在前端网页可以查看关闭 HDFS 整个集群依次停止三个进程[hadoopserver1 hadoop]$ sbin/stop-dfs.sh[hadoopserver1 hadoop]$ jps2 多节点完全分布式部署官方文档https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Download新开虚拟机 server2 和 server3 添加解析并进行时间同步vim/etc/hosts三个节点需要有相同的用户uid 和 gid 都要相同注意不要随便修改用户的 uid 和 gid会出现权限失效、看不见文件、读写报错、程序找不到数据的情况三台机器均安装 nfs 用于共享数据yuminstall-ynfs-utils配置NFS共享目录把远端访问权限映射为 hadoop多节点挂载/home/hadoop共享目录时客户端操作文件归属人自动映射为服务端 hadoop 用户uid1000避免挂载后文件属主变成 nobody出现权限报错、Hadoop 读写失败[rootserver1 ~]# vim /etc/exports启动并开机自启NFS服务查看本机对外发布的NFS共享目录[rootserver1 ~]# systemctl enable --now nfs[rootserver1 ~]# showmount -e在 server2 查询 server1 上发布了哪些 NFS 共享目录[rootserver2 ~]# echo 123456 |passwd --stdin hadoop# 最好每个节点密码相同[rootserver2 ~]# showmount -e server1server3server2 和 server3 挂载共享文件mount192.168.40.141:/home/hadoop/ /home/hadoop/server1 远程连接各节点保证/etc/hosts解析正常ssh 端口互通所有节点 hadoop 用户密码有效可以正常登录指定整个集群默认文件系统为 server1 上端口 9000 的 HDFS[hadoopserver1 ~]$cdhadoop/etc/hadoop/[hadoopserver1 hadoop]$vimcore-site.xml存 2 份副本[hadoopserver1 hadoop]$vimhdfs-site.xml定义集群中所有 DataNode数据节点主机名启动脚本会远程在这些机器拉起 DataNode 进程[hadoopserver1 hadoop]$vimworkers初始化 HDFS 文件系统生成 NameNode 元数据仅首次搭建执行[hadoopserver1 hadoop]$cd../..[hadoopserver1 hadoop]$ bin/hdfs namenode-format执行脚本一键启动 HDFS 集群NameNode 所有 workers 里配置的 DataNode[hadoopserver1 hadoop]$ sbin/start-dfs.sh在前端可看到两个存活的节点依旧使用官方示例测试[hadoopserver1 hadoop]$ bin/hdfs dfs-mkdir/user[hadoopserver1 hadoop]$ bin/hdfs dfs-mkdir/user/hadoop[hadoopserver1 hadoop]$ bin/hdfs dfs-mkdirinput[hadoopserver1 hadoop]$ bin/hdfs dfs-putetc/hadoop/*.xml input文件的数据块Block 0一共有2 个副本分别保存在 server2、server3 两台数据节点上配置 MapReduce 运行调度框架为 YARN并指定任务运行所需类库路径[hadoopserver1 hadoop]$vimetc/hadoop/mapred-site.xml开启 MapReduce 所需的 shuffle 服务配置 NodeManager 可传递至任务容器的环境变量白名单[hadoopserver1 hadoop]$vimetc/hadoop/yarn-site.xml一键启动 YARN 集群ResourceManager 各节点 NodeManager[hadoopserver1 hadoop]$ sbin/start-yarn.shserver2 和 server3 上也会开启 NodeManager访问http://192.168.40.141:8088/ResourceManager 前端监控界面查看任务、节点资源3 在线扩容新开虚拟机 server4各个节点同步解析并进行时间同步[rootserver4 ~]# useradd hadoop# 还是要保证 uid 和 gid 与其他节点相同[rootserver4 ~]# yum install -y nfs-utils[rootserver4 ~]# mount 192.168.40.141:/home/hadoop/ /home/hadoop/所有节点之间相互免密[rootserver4 ~]# su - hadoop[hadoopserver4 ~]$cdhadoop[hadoopserver4 hadoop]$vimetc/hadoop/workers后台独立启动当前节点的 DataNode 数据存储进程和 NodeManager 资源管理进程[hadoopserver4 hadoop]$ bin/hdfs--daemonstart datanode[hadoopserver4 hadoop]$ bin/yarn--daemonstart nodemanagerHDFS 文件副本数量改为3[hadoopserver4 hadoop]$vimetc/hadoop/hdfs-site.xmlserver5 以此类推
返回列表