搭建 Hadoop 分布式存储高性能集群
Posted 笨小孩@GF 知行合一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建 Hadoop 分布式存储高性能集群相关的知识,希望对你有一定的参考价值。
Hadoop 概述
Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop 的框架最核心的设计就是:HDFS 和 MapReduce。HDFS 分布式文件系统为海量的数据提供了存储,则 MapReduce 为海量的数据提供了计算。
网方网站:http://hadoop.apache.org/
Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构。
官方网站下载:
-
Hadoop 需要 Java 7 to Java 8
-
Minimum required Java version increased from Java 7 to Java 8
All Hadoop JARs are now compiled targeting a runtime version of Java 8. Users still using Java 7 or below must upgrade to Java 8.
hadoop 基于 java 开发
Hadoop 包括两大核心,分布式存储系统和分布式计算系统
分布式存储
- 互动:为什么数据需要存储在分布式的系统中,难道单一的计算机存储不了吗?难道现在的几个 TB的硬盘装不下这些数据吗?
- 事实上,确实装不下。比如,很多的电信通话记录就存储在很多台服务器的很多硬盘中。那么,要处理这么多数据,必须从一台一台服务器分别读取数据和写入数据,太麻烦了!
- 我们希望有一种文件系统,可以管辖很多服务器用于存储数据。通过这个文件系统存储数据时,感觉不到是存储到不同的服务器上的。当读取数据时,感觉不到是从不同的服务器上读取。
- Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。
- HDFS是Apache Hadoop Core项目的一部分。
- HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。
- 分布式文件系统管理的是一个服务器集群。在这个集群中,数据存储在集群的节点(即集群中的服务器)中,但是该文件系统把服务器的差异屏蔽了。那么,我们就可以像使用普通的文件系统一样使用,但是数据却分散在不同的服务器中。
- 命名空间(namespace):在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件,为了组织众多的文件,把文件可以放到不同的文件夹中,文件夹可以一级一级的包含。我们把这种组织形式称为命名空间(namespace)。
- 命名空间管理着整个服务器集群中的所有文件。命名空间的职责与存储真实数据的职责是不一样的。
- 负责命名空间职责的节点称为主节点(master node 或 name node)
- 负责存储真实数据职责的节点称为从节点(slave node 或 data node)
- 主/从节点:主节点负责管理文件系统的文件结构,从节点负责存储真实的数据,称为主从式结构(master-slaves)。用户操作时,也应该先和主节点打交道,查询数据在哪些从节点上存储,然后再从从节点读取。
- 在主节点,为了加快用户访问的速度,会把整个命名空间信息都放在内存中,当存储的文件越多时,那么主节点就需要越多的内存空间。
- block:在从节点存储数据时,有的原始数据文件可能很大,有的可能很小,大小不一的文件不容易管理,那么可以抽象出一个独立的存储文件单位,称为块(block)。
- 容灾: 数据存放在集群中,可能因为网络原因或者服务器硬件原因造成访问失败,最好采用副本(replication [ˌreplɪ'keɪʃn]
-
hadoop 运行架构:
- 名词解释
(1)Hadoop:Apache 开源的分布式框架。
(2)HDSF:Hadoop 的分布式文件系统。
(3)NameNode:Hadoop HDFS 元数据主节点服务器,负责保存 DataNode 文件存储元数据信息,这个服务器是单点的。 Namenode 记录着每个文件中各个块所在的数据节点的位置信息
(4)DataNode:Hadoop 数据节点,负责存储数据。
(5)JobTracker:Hadoop 的 Map/Reduce 调度器,负责与 TaskTracker 通信分配计算任务并跟踪任务进度,这个服务器也是单点的。 Tracker [ˈtrækə(r)] 跟踪器
(6)TaskTracker:Hadoop 调度程序,负责 Map,Reduce 任务的启动和执行。 [tɑ:sk] 作业任务
- Hadoop 的组件依赖关系图
- SecondaryNameNode 就是来帮助解决上述问题的,它的职责是合并 NameNode 的 edit logs 到fsimage 文件中。SecondaryNameNode 为 HDFS 中提供一个检查点。它只是 NameNode 的一个助手节点。它不是要取代掉 NameNode 也不是 NameNode 的备份。
- 在以上的主从式结构中,由于主节点含有整个文件系统的目录结构信息,因为非常重要。另外,由于主节点运行时会把命名空间信息都放到内存中,因此存储的文件越多,主节点的内存就需要的越多。
分布式计算:
对数据进行处理时,我们会把数据读取到内存中进行处理。如果我们对海量数据进行处理,比如数据大小是 100GB,我们要统计文件中一共有多少个单词。要想把数据都加载到内存中几乎是不可能的,称为移动数据。
那么是否可以把程序代码放到存放数据的服务器上哪?因为程序代码与原始数据相比,一般很小,几乎可以忽略的,所以省下了原始数据传输的时间了。现在,数据是存放在分布式文件系统中,100GB 的数据可能存放在很多的服务器上,那么就可以把程序代码分发到这些服务器上,在这些服务器上同时执行,也就是并行计算,也是分布式计算。这就大大缩短了程序的执行时间。我们把程序代码移动到数据节点的机器上执行的计算方式称为移动计算。
分布式计算需要的是最终的结果,程序代码在很多机器上并行执行后会产生很多的结果,因此需要有一段代码对这些中间结果进行汇总。Hadoop 中的分布式计算一般是由两阶段完成的。第一阶段负责读取各数据节点中的原始数据,进行初步处理,对各个节点中的数据求单词数。然后把处理结果传输到第二个阶段,对中间结果进行汇总,产生最终结果,求出 100GB 文件总共有多少个单词,如图所示:
- 在 hadoop 中,分布式计算部分称为 MapReduce。
- MapReduce 是一种编程模型,用于大规模数据集(大于 1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",和它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个 Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的 Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
- 主节点称为作业节点(jobtracker),
- 从节点称为任务节点(tasktracker)。
- 在任务节点中,运行第一阶段的代码称为 map 任务(map task),运行第二阶段的代码称为reduce 任务(reduce task)。task [tɑ:sk] 任务 tracker [ˈtrækə(r)] 跟踪器
-
开始部署 hadoop
- 实验环境 : CentOS 7.6 firewall、iptables以及 SElinux 均为关闭状态
- IP 主机名 角色
- 192.168.2.20 hadoop1 NameNode
- 192.168.2.21 hadoop2 DataNode1
- 192.168.2.22 hadoop3 DataNode1
- 环境准备
三台机器上配置 hosts 文件,如下: - 192.168.2.20 hadoop1
192.168.2.21 hadoop2
192.168.2.22 hadoop3 - 分发到另外2台服务器
- 创建运行 hadoop 用户账号和 Hadoop 目录。 尽量不用 root 帐号运行
- useradd -u 8866 hadoop;echo hadoop:123456 |chpasswd
- mkdir -p /usr/local/hadoop/dfs/{name,data}
- mkdir -p /usr/local/hadoop/tmp
chown -R hadoop. /usr/local/hadoop/ - 在 Hadoop 服务器上创建的 hadoop 用户 ID 保持一致,创建时,尽量把 UID 调大
注:创建用户 hadoop 时,不能使用参数-s /sbin/nologin ,因为稍后我们要 su - hadoop 切换用户
- 配置 ssh 无密码登录 hadoop 服务器,方便后期复制文件和启动服务。因为 namenode 启动时,会连接到 datanode 上启动对应的服务。
-
配置 Hadoop 环境,安装 Java 环境 JDK:三台机器上都要配置
- 下载 Jdk 工具:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- JDK 下载页面
- 如果之前系统有安装 jdk 需要卸载
- yum -y remove java jdk
- 安装 jdk
- yum -y install jdk-8u291-linux-x64.rpm
- jdk 的安装目录在/usr/java
- 将 jdk 部署到其它两台机器上:
- scp ./jdk-8u291-linux-x64.rpm root@192.168.2.21:/tmp/
scp ./jdk-8u291-linux-x64.rpm root@192.168.2.22:/tmp/
- 确认防火墙 SElinux 为关闭状态
- 在 192.168.2.20 上 安装 Hadoop 并配置成 namenode 主节点:
- 配置 Hadoop:需要修改 7 个配置文件
- 文件位置:/usr/local/hadoop/hadoop-3.3.1/etc/hadoop
文件名称:hadoop-env.sh、yarn-evn.sh、core-site.xml、hdfs-site.xml、mapredsite.xml、yarn-site.xml、workers - 配置文件 hadoop-env.sh,指定 hadoop 的 java 运行环境
- 该文件是 hadoop 运行基本环境的配置,需要修改的为 java 虚拟机的位置
- 切换到 hadoop 用户
- 配置文件 yarn-env.sh,保存 yarn 框架的运行环境
该文件是 yarn 框架运行环境的配置
yarn :Hadoop 的新 MapReduce 框架。Yarn 是 Hadoop 自 0.23.0 版本后新的 mapreduce 框架(Yarn) 原理 。 - 不需要修改,查看优先规则:
- 配置文件 core-site.xml,指定访问 hadoop web 界面访问路径
这个是 hadoop 的核心配置文件,这里需要配置的就这两个属性 - fs.default.name 配置了hadoop 的 HDFS 系统的命名,位置为主机的 9000 端口;
hadoop.tmp.dir 配置了 hadoop 的 tmp 目录的根位置。 - 这里使用了一个文件系统中没有的位置,所以要先用 mkdir 命令新建一下。
注: 在<configuration>和</configuration>中间插入以一下红色和蓝色标记内容,需要修改的内容为:<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>65536</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
- property [ˈprɒpəti] 财产
- 注:io.file.buffer.size 的默认值 4096 。这是读写 sequence file 的 buffer size, 可减少 I/O 次数。
- 在大型的 Hadoop cluster,建议可设定为 65536
- 配置文件 hdfs-site.xml
这个是 hdfs 的配置文件,dfs.http.address 配置了 hdfs 的 http 的访问位置;
dfs.replication 配置了文件块的副本数,一般不大于从机的个数。 - 修改 configuration 内容如下:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
- 注:
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value> # 通过 web 界面来查看 HDFS 状态
</property>
<property>
<name>dfs.replication</name>
<value>2</value> #每个 Block 有 2 个备份。
</property>
- 配置文件 mapred-site.xml
这个是 mapreduce 任务的配置
修改 configuration 内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:19888</value>
</property>
</configuration>
- 可以在相应机器的 19888 端口上打开历史服务器的 WEB UI 界面。可以查看已经运行完的作业情况。
- 注:由于 hadoop2.x 使用了 yarn 框架,所以要实现分布式部署,必须在mapreduce.framework.name 属性下配置为 yarn。
同时指定:Hadoop 的历史服务器 historyserver
Hadoop 自带了一个历史服务器,可以通过历史服务器查看已经运行完的 Mapreduce 作业记录,比如用了多少个 Map、用了多少个 Reduce、作业提交时间、作业启动时间、作业完成时间等信息。 - 默认情况下,Hadoop 历史服务器是没有启动的,我们可以通过下面的命令来启动 Hadoop 历史服务器
- /usr/local/hadoop/hadoop-3.3.1/sbin/mr-jobhistory-daemon.sh start historyserver
- stop 停止服务
- 配置节点 yarn-site.xml
该文件为 yarn 框架的配置,主要是一些任务的启动位置 - 修改 configuration 内容如下:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>/usr/local/hadoop/hadoop-3.3.1/etc/hadoop:/usr/local/hadoop/hadoop-3.3.1/share/hadoop/common/lib/*:/usr/local/hadoop/hadoop-3.3.1//share/hadoop/common/*:/usr/local/hadoop/hadoop-3.3.1/
share/hadoop/hdfs:/usr/local/hadoop/hadoop-3.3.1/share/hadoop/hdfs/lib/*:/usr/local/hadoop/hadoop-3.3.1/share/hadoop/hdfs/*:/usr/local/hadoop/hadoop-3.3.1/share/hadoop/mapreduce/*:/usr/local/
hadoop/hadoop-3.3.1/share/hadoop/yarn:/usr/local/hadoop/hadoop-3.3.1/share/hadoop/yarn/lib/*:/usr/local/hadoop/hadoop-3.3.1/share/hadoop/yarn/*
</value>
</property>
</configuration>
- 在 workers 配置文件中指定 datanode 节点的主机名,方便后期 namenode 节点调用
- 生成基于 hadoop 用户的不输入密码登录:因为后期使用 hadoop 用户启动 datanode 节点使用需要直接登录到对应的服务器上启动 datanode 相关服务
- 把 hadoop 安装软件,复制到其他 datanode 节点:
- 注:namenode 和 datanode 配置的区别是:datanode 上不需要运行 yarn 集群资源管理服务。
所以 datanode 不需要修改 yarn-site.xml 配置文件。 - scp -rp /usr/local/hadoop/hadoop-3.3.1/ root@192.168.2.21:/usr/local/hadoop/
- scp -rp /usr/local/hadoop/hadoop-3.3.1/ root@192.168.2.22:/usr/local/hadoop/
- 分别在 datanode 节点上
- chown -R hadoop. /usr/local/hadoop
-
安装并初始化 Hadoop 集群
-
在 hadoop1 上启动 hadoop
切换到 hadoop 用户并格式化文件系统
hadoop namenode 的初始化,只需要第一次的时候初始化,之后就不需要了。 因为你 namenode上的文件系统是 HDFS 的,所以要格式化。 -
/usr/local/hadoop/hadoop-3.3.1/bin/hdfs namenode -format
- 查看格式化后,生成的文件:
- 启动 hdfs: /usr/local/hadoop/hadoop-3.3.1/sbin/start-dfs.sh,即启动 HDFS 分布式存储
- 这里有个警告:需要将hadoop安装目录下的lib/native引入到环境变量中 或者
-
解决方法:
在etc/hadoop/log4j.properties的文件最后添加 log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR,去除警告信息
- 查看进程,此时 namenoade 有进程:namenode 和 secondarynamenode 进程
ps -axu | grep -E "namenode|secondarynamenode"
- 在另外2台服务器上看 ps -axu | grep datanode
- 启动分布式计算
- /usr/local/hadoop/hadoop-3.3.1/sbin/start-yarn.sh
- 查看进程:
查看 hadoop1 上的 ResourceManager 进程
注:ResourceManager 是 Yarn 集群主控节点,负责协调和管理整个集群(所有NodeManager)的资源。 - ps -axu | grep resourcemanager
- 其他 2 台服务器上的 进程 NodeManager
- ps -axu | grep nodemanager
- 注:start-dfs.sh 和 start-yarn.sh 这两个脚本可用 start-all.sh 代替。
- 停止服务 stop-all.sh
- 启动 jobhistory 服务,查看 mapreduce 运行状态
- 在主节点上启动存储服务和资源管理主服务。使用命令:
/usr/local/hadoop/hadoop-3.3.1/sbin/hadoop-daemon.sh start datanode 启动从存储服务
/usr/local/hadoop/hadoop-3.3.1/sbin/yarn-daemon.sh start nodemanager #启动资源管理从服务
- 集群状态监控
查看 HDFS 分布式文件系统状态 - hdfs dfsadmin -report
- 通过 web 界面来查看 HDFS 状态和查看文件块组成部分:
命令行查看: - hdfs fsck / -files -blocks
- 通过 Web 查看 hadoop 集群状态
- http://192.168.2.20:8088/cluster/nodes
- 查看 JobHistory 的内容:
- http://192.168.2.20:19888/jobhistory
-
通过 Hadoop 执行计算任务
- 将 hadoop 加入环境变量
- /etc/profile.d/hadoop.sh
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.3.1
export JAVA_LIBRAY_PATH=/usr/local/hadoop/hadoop-3.3.1/lib/native
export LD_LIBRARY_PATH=$JAVA_LIBRARY_PATH
export PATH==$JAVA_HOME/bin:$HADOOP_HOME:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_LIBRAY_PATH:$PATH
-
测试:
- 运行 Hadoop 计算任务,Word Count 字数统计
- 新建2个 txt 文件
- 将这两个文件放入 hadoop 的 HDFS 中
- hadoop fs -ls / #查看 hdfs 目录情况
- hadoop fs -mkdir -p /input #在 hdpf 的根目录下,创建 input 目录
- hadoop fs -put /home/hadoop/*.txt /input #把 *.txt文件放到 hdfs 的 input 目录下
- hadoop fs -cat /input/1.txt #查看命令
- 执行 wordCount 单词统计汇总并查看结果
- hadoop jar /usr/local/hadoop/hadoop-3.3.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output
- 查看运行之后产生的文件
hadoop fs -ls /output
- 查看运行结果
hadoop fs -cat /output/part-r-00000 #可以看到数据都已经被统计出来了。
- 查看日志
以上是关于搭建 Hadoop 分布式存储高性能集群的主要内容,如果未能解决你的问题,请参考以下文章