hadoop安装配置,报错与解决,理论,待整理
Index of /dist/hadoop/common/hadoop-3.1.3 (apache.org)
1. 安装与配置
1 |
|
Hadoop Distributed File System (HDFS) 是一个设计用于大规模数据存储和处理的分布式文件系统。以下是 HDFS 的存储原理的关键点:
1. 架构概述
HDFS 采用主从架构,由一个 NameNode 和多个 DataNode 组成:
- NameNode:负责管理文件系统的元数据,例如文件名、目录结构、权限和每个文件的块位置。它是 HDFS 的中央控制节点。
- DataNode:负责实际存储数据块。每个 DataNode 在本地文件系统上管理存储的块,并周期性地向 NameNode 报告其存储的块信息。
2. 数据存储
HDFS 将文件拆分成多个块(默认块大小为 128MB),每个块被存储在不同的 DataNode 上:
- 块(Block):文件被分割成大小相等的数据块。块大小可以在 HDFS 配置中设置(通常为 128MB 或 256MB)。
- 副本(Replication):每个数据块会被复制到多个 DataNode 上(默认副本数为 3)。这种数据冗余提供了容错性和高可用性。
3. 写入数据
当客户端向 HDFS 写入文件时:
- 客户端向 NameNode 请求写操作。
- NameNode 创建文件条目,并返回可用的 DataNode 列表给客户端。
- 客户端将数据分成块,并将每个块写入到第一个 DataNode。
- 第一个 DataNode 将块复制到第二个 DataNode,第二个 DataNode 再复制到第三个 DataNode,依此类推,直到达到副本因子。
- 每个 DataNode 在成功存储块后,向 NameNode 发送报告。
4. 读取数据
当客户端从 HDFS 读取文件时:
- 客户端向 NameNode 请求读取操作。
- NameNode 返回文件块的位置(DataNode 列表)。
- 客户端直接从 DataNode 读取数据块。
5. 容错机制
HDFS 具有强大的容错机制:
- 数据冗余:通过块复制来提供容错性。即使一个 DataNode 失效,其他 DataNode 上的副本仍然可用。
- 心跳机制:DataNode 周期性地向 NameNode 发送心跳信号和块报告。NameNode 通过心跳信号监控 DataNode 的状态。
- 数据恢复:如果某个 DataNode 失效,NameNode 会检测到并启动块恢复操作,将缺失的块复制到其他健康的 DataNode 上。
6. 数据完整性
HDFS 通过使用校验和来保证数据的完整性:
- 每个数据块在写入时会生成校验和,保存在元数据中。
- 读取时,DataNode 会验证数据块的校验和,以确保数据未被损坏。
7. 扩展性
HDFS 可以轻松扩展:
- 通过增加更多的 DataNode 可以增加存储容量和处理能力。
- NameNode 可以通过高可用性配置(如主备 NameNode)来避免单点故障。
8. 安全性
HDFS 支持多种安全性机制:
- 通过 Kerberos 认证进行身份验证。
- 支持文件和目录的访问控制列表(ACL)和权限设置。
9. 架构图示
2. 报错与解决
Couldn‘t preview the file.
HDFS报错:Couldn‘t preview the file._hdfs文件预览_鸡哥爱技术的博客-CSDN博客
1.在hdfs-site.xml配置如下依赖
1 |
|
2.修改windows下的C:\Windows\System32\drivers\etc\hosts 文件与linux下的etc/hosts下的hadoop 映射地址保持一致
1 |
|
3. 理论
1、hadoop的核心组件
- Hadoop分布式文件系统(HDFS): HDFS是Hadoop的主要存储组件,它是一个分布式文件系统,用于存储大规模数据。数据被分成块并复制到多个节点,以提高容错性和可用性。
- Hadoop YARN(Yet Another Resource Negotiator): Hadoop YARN是Hadoop的资源管理器,负责集群上的资源分配和作业调度。它允许不同的应用程序共享集群资源,并有效地运行MapReduce等计算框架。
- MapReduce: MapReduce是Hadoop的计算模型,用于处理和分析大规模数据集。它包括两个主要步骤:Map阶段(数据分片和处理)和Reduce阶段(数据聚合和结果生成)。开发人员可以编写MapReduce作业来处理数据。
- Hadoop Common: Hadoop Common包含了Hadoop框架的共享工具和库,包括文件系统操作、网络通信、安全认证和其他核心功能。它是所有Hadoop组件所依赖的基础。
- Hadoop HBase: HBase是Hadoop生态系统中的分布式NoSQL数据库,专注于大数据的实时读写操作。它适用于需要快速随机访问和高度可伸缩性的应用。
- Hadoop Hive: Hive是一个数据仓库工具,它提供了一种SQL样式的查询语言(HiveQL)来查询和分析存储在HDFS中的数据。它使非技术用户能够进行数据分析。
- Hadoop Pig: Pig是一个用于大规模数据分析的高级脚本语言平台。它允许用户编写数据转换和分析脚本,这些脚本编译成MapReduce作业运行在Hadoop集群上。
- Hadoop ZooKeeper: ZooKeeper是Hadoop的分布式协调服务,用于协调和管理Hadoop集群中的各种组件和任务。它提供了分布式锁、配置管理和命名服务等功能。
2、namenode和datanode的心跳机制
在Hadoop HDFS(分布式文件系统)中,Namenode和Datanode之间的心跳机制是用于维护集群健康状态和检测故障的关键组件。以下是Namendoe和Datanode之间的心跳机制的工作方式:
- Namenode:
- Namenode是HDFS的主要管理节点,负责维护文件系统的命名空间和元数据信息。
- Namenode周期性地期望从每个Datanode接收心跳信号,以确认Datanodes的健康状况。
- Datanode:
- Datanodes是HDFS中存储实际数据块的节点,它们周期性地向Namenode发送心跳信号,并报告它们所存储的数据块信息。
- 此外,Datanodes还向Namenode发送块报告,其中包含它们所存储的块的列表。
心跳机制的工作方式如下:
- 每个Datanode都会定期(通常是每3秒)向Namenode发送一个心跳信号。
- 这个心跳信号包括了Datanode的基本信息以及它所存储的块的汇报。
- Namenode接收到心跳信号后,会确认Datanode的状态,并检查是否收到了期望的块报告。如果某个Datanode在一定时间内没有发送心跳信号,Namenode会认为该Datanode已经故障,将其标记为不可用。
- 如果Datanode检测到自己发送的心跳信号没有得到正确的响应,它会尝试重新连接或采取其他故障恢复措施。
这个心跳机制的目的是保持集群的健康状态,及时检测故障的Datanodes,并确保数据的可靠性。当Namenode发现某个Datanode故障时,它会更新数据块的复制位置信息,以确保数据块的复制因子(通常是3)仍然得到满足,从而确保数据的可用性。这是HDFS高可用性和容错性的关键机制之一。
3、safemode(hdfs dfsadmin -safemode get enter leave)
- 进入SafeMode:
- 当Namenode启动或在某些情况下重新启动时,它将进入SafeMode。
- 还可以手动触发进入SafeMode,以进行维护操作或检查数据完整性。
- 退出SafeMode:
- 当Namenode检查到足够数量的数据块已经被复制(满足数据复制因子)时,或者当Namenode完成数据完整性检查后,它将退出SafeMode。
- SafeMode还可以手动离开,这通常在完成维护操作后执行。
- 查看SafeMode状态:
- 使用
hdfs dfsadmin -safemode get
命令可以查看当前HDFS集群的SafeMode状态。 - 如果输出显示Namenode正在SafeMode中,那么HDFS的某些功能可能会受到限制。
- 使用
SafeMode的主要目的是确保数据的可靠性和一致性。在SafeMode下,Namenode会等待足够数量的数据块被复制,以防止数据丢失。同时,它还允许进行数据完整性检查,以查找可能存在的数据损坏或丢失情况。
手动进入和退出SafeMode通常是由Hadoop管理员执行的,以执行维护任务或确保数据一致性。进入SafeMode后,文件系统中的某些操作将受到限制,这是为了防止进一步的数据写入,直到数据复制因子满足要求或数据完整性检查完成。
注意:SafeMode在HDFS的早期版本中更为重要,因为它有助于确保数据的可靠性。随着Hadoop的演进,某些版本中已经减少了SafeMode的限制,以提高系统的可用性。不同版本的Hadoop可能会在SafeMode方面有一些差异。
4、hadooop启动流程
- 启动HDFS:
- 首先,启动HDFS。HDFS包括Namenode和Datanode两个主要组件。
- Namenode是HDFS的主要管理节点,负责维护文件系统的命名空间和元数据信息。管理员通常手动启动Namenode。
- Datanodes是存储数据块的节点,它们会自动启动并向Namenode注册。
- 启动YARN:
- YARN(Yet Another Resource Negotiator)是Hadoop的资源管理系统,负责集群资源的分配和作业调度。
- ResourceManager(RM)是YARN的主要组件,通常由管理员手动启动。ResourceManager负责接受作业提交请求,为作业分配资源,并监控资源的使用。
- NodeManager(NM)是在每个集群节点上运行的YARN组件,用于管理该节点上的资源。
- 启动其他Hadoop生态系统组件:
- 根据需要,启动其他Hadoop生态系统组件,例如HBase、Hive、Pig等。
- 提交MapReduce作业:
- 用户可以通过MapReduce或其他计算框架提交作业。作业通常包括Map任务和Reduce任务。
- ResourceManager将分配适当数量的容器(包含Map或Reduce任务)给作业,以便执行。
- 任务执行:
- TaskTracker进程在NodeManager上运行,负责执行Map和Reduce任务。
- 每个任务会读取数据块,执行计算,然后将结果写回HDFS。
- 监控和管理:
- Hadoop集群会持续监控各个组件的健康状态,包括Namenode、Datanode、ResourceManager、NodeManager等。
- 如果某个组件发生故障,集群管理系统将采取适当的措施来处理,例如,重新启动故障的Namenode。
- 完成作业:
- 一旦作业完成,结果将存储在HDFS中,供用户查询和分析。
这是Hadoop的一般启动流程的概览。整个流程可以根据集群配置和需求进行调整。管理员通常负责启动和管理Hadoop集群中的各个组件,以确保高可用性和性能。用户则可以使用Hadoop生态系统中的工具和API来提交和管理作业。
5、hadoop启动后的服务(单击|集群|高可用集群)
- 单节点(Single Node):
- 在单节点Hadoop部署中,整个Hadoop集群运行在单个物理或虚拟机上。这种部署通常用于开发和测试环境。
- 单节点部署包括一个Namenode,一个Datanode,一个ResourceManager,一个NodeManager以及其他Hadoop组件。
- 服务包括HDFS、YARN(MapReduce)、以及可能的其他组件,例如Hive、Pig等。
- 普通集群(Standard Cluster):
- 普通Hadoop集群通常由多个物理或虚拟机节点组成,用于处理大规模数据集。
- 普通集群包括多个Datanodes,一个Namenode,一个ResourceManager,多个NodeManagers以及其他Hadoop组件。
- 服务包括HDFS、YARN、以及可能的其他组件,例如Hive、HBase、Pig、Sqoop等。
- 高可用集群(High Availability Cluster):
- 高可用Hadoop集群旨在确保系统的高可用性,通常包括多个主要组件的冗余部署。
- 在高可用集群中,有两个Namenodes:一个活动Namenode和一个备用Namenode。这确保了即使一个Namenode发生故障,系统仍然可用。
- ResourceManager也可以配置为高可用,以防止单点故障。
- 服务包括HDFS、YARN、以及其他Hadoop生态系统组件,如Hive、HBase、Pig等。
无论部署类型,Hadoop集群的核心服务通常包括以下内容:
- HDFS(Hadoop分布式文件系统):用于存储大规模数据集的分布式文件系统,包括Namenode和Datanode。
- YARN(Yet Another Resource Negotiator):用于资源管理和作业调度的框架,包括ResourceManager和NodeManager。
- MapReduce:用于数据处理和分析的计算框架。
- Namenode:管理HDFS文件系统的元数据信息。
- Datanode:存储数据块的节点。
- ResourceManager:管理资源分配和作业调度。
- NodeManager:在每个节点上运行,负责管理节点上的资源。
- 其他Hadoop生态系统组件:根据需要,可以部署和启动其他Hadoop生态系统组件,如Hive、HBase、Pig、Sqoop、Spark等,以执行各种数据处理和分析任务。
总的来说,Hadoop集群的服务取决于部署的规模和需求,但核心服务通常包括HDFS和YARN,同时可能还包括其他Hadoop生态系统组件。高可用集群会引入冗余以提高系统的可用性。
6、客户端读取hdfs文件内容的流程
创建Hadoop配置: 客户端首先需要创建一个Hadoop配置对象,通常称为
Configuration
。配置对象包括HDFS的配置信息,例如Namenode的地址、用户身份验证等。获取HDFS文件系统: 客户端使用配置对象获取到HDFS文件系统的引用。这通过
FileSystem
类实现,通常会使用FileSystem.get(configuration)
方法。打开HDFS文件: 客户端使用文件系统引用打开要读取的HDFS文件,可以使用
open
方法指定文件路径。这将返回一个FSDataInputStream
对象,用于读取文件内容。读取文件内容: 使用
FSDataInputStream
对象可以逐行或逐块读取HDFS文件内容。客户端可以使用类似Java的输入流方式来读取数据。1
2
3
4
5
6
7
8javaCopy codeFSDataInputStream inputStream = fileSystem.open(new Path("/path/to/your/file"));
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
// 处理文件内容
}
reader.close();
inputStream.close();关闭文件: 客户端读取文件后,需要关闭文件以释放资源,关闭
FSDataInputStream
对象。关闭文件系统: 最后,客户端需要关闭HDFS文件系统以释放资源。
整个流程是一个标准的读取文件的过程,客户端与HDFS之间通过Hadoop的Java API进行交互。注意,如果需要处理大规模数据集,通常使用分布式计算框架(如MapReduce、Spark)可以更高效地读取和处理数据。
7、客户端向hdfs写内容的流程
创建Hadoop配置: 客户端首先需要创建一个Hadoop配置对象,通常称为
Configuration
。配置对象包括HDFS的配置信息,例如Namenode的地址、用户身份验证等。获取HDFS文件系统: 客户端使用配置对象获取到HDFS文件系统的引用。这通过
FileSystem
类实现,通常会使用FileSystem.get(configuration)
方法。打开HDFS文件: 客户端使用文件系统引用创建或打开要写入内容的HDFS文件,可以使用
create
方法指定文件路径。这将返回一个FSDataOutputStream
对象,用于写入文件内容。1
FSDataOutputStream outputStream = fileSystem.create(new Path("/path/to/your/file"));
写入文件内容: 使用
FSDataOutputStream
对象可以写入数据到HDFS文件。客户端可以使用类似Java的输出流方式来写入数据。1
2byte[] data = "This is the content you want to write to the file".getBytes();
outputStream.write(data);关闭文件: 客户端在完成写入操作后,需要关闭文件以确保数据被刷新到HDFS。
1
outputStream.close();
关闭文件系统: 最后,客户端需要关闭HDFS文件系统以释放资源。
整个流程是一个标准的写入文件的过程,客户端通过Hadoop的Java API与HDFS进行交互。如果需要处理大规模数据集,通常使用分布式计算框架(如MapReduce、Spark)可以更高效地写入和处理数据。如果需要确保数据的完整性,HDFS会自动复制数据块,并提供容错性和高可用性。