0 引子:
提出两个问题,是对上面 ma-大数据mapreduce思想和数据切割 的深入提问以及hdfs的引入:
1、对每一次的MapReduce作业来说,JobTracker可能会启动个数不同的mapper,且可能调度它们运行于不同的TaskTracker上,那么,这些个mapper如何获取要处理的数据(split),以及如何高效获取所需的数据? 2、如果存储了数据的设备发生了故障,MapReduce是否还能继续运行?如果能,如何进行?
1 hadoop的mapreduce和hdfs关系:
MapReduce并非依赖于分布式文件系统,只不过运行在非分布式文件系统的MapReduce的诸多高级特性将无用武之地.
2 hdfs设计理念:
和传统文件系统相同处:
文件数据存储于“数据块(block)”中、通过“元数据”将文件名与数据块建立映射关系、文件系统基于目录实现树状组织结构、通过元数据保存文件权限及时间戳等。
和传统文件不同处:
1 HDFS是用户空间的文件系统, 2 传统文件系统的“块大小(block size)”通过为1KB、2KB或4KB等,而HDFS的块大小为64MB,且在生产环境中使用时,此块大小通常还会被调整为128MB、256MB甚至是512MB等。 因为HDFS专为存储大文件而设计,较大的块可以减少磁盘的寻道次数,进而提升I/O性能 3 HDFS将所有文件的元数据存储于名称节点(NameNode)的内存中,对于有着海量小文件的应用场景则会给名称节点的内存空间带去巨大压力并使得其很可能成为系统性能瓶颈。 4 HDFS为MapReduce的计算框架而设计,存储下来数据主要用于后续的处理分析,其访问模型为“一次写入、多次读取”;因此,数据在HDFS中存储完成后,仅能在文件尾部附加新数据,而不能对文件进行修改。 5 HDFS专为了高效地传输大文件进行了优化,其为了完成此目标,在“低延迟”特性上做出了很大让步,因此,其不适用于较小访问延迟的应用
3 hdfs节点:
namenode(名称节点):
名称节点负责管理HDFS的名称空间,即以树状结构组织的目录及文件的元数据信息,
这些信息持久存储于名称节点本地磁盘上并保存为名称“空间镜像(namespace image)”和“编辑日志(edit log)”两个文件。
并不存储数据块,仅需要知道每个文件对应数据块的存储位置(存储在数据节点的位置)
但是名称节点并不会持久存储数据块所与其存储位置的对应信息,
这个对应信息是HDFS集群启动时由名称节点根据各数据节点发来的信息进行重建而来,这个重建过程叫做hdfs的安全模式。
datanode(数据节点):
根据名称节点或客户的要求完成存储或读取数据块,并周期性地将其保存的数据块相关信息报告给名称节点
关于存储节点的分配:
默认情况下,HDFS会在集群中为每个数据块存储三个副本以确保数据的可靠性、可用性及性能表现。
在一个大规模集群中,这三个副本一般会保存至不同机架中的数据节点上以应付两种常见的故障:
单数据节点故障和导致某机架上的所有主机离线的网络故障。另外,如前面MapReduce运行模型中所述,
为数据块保存多个副本也有利于MapReduce在作业执行过程中透明地处理节点故障等,
并为MapReduce中作业协同处理以提升性能提供了现实支撑。名称节点会根据数据节点的周期性报告来检查每个数据块的副本数是否符合要求,
低于配置个数要求的将会对其进行补足,而多出的将会被丢弃。
4 hdfs特点:
5 解答问题:
job的多个task(eg: map task或者mapper) 如何知道要处理的 split的数据:
回答:这其实就是客户端如何读取hdfs文件的流程:
HDFS提供了POSIX网络的访问接口,所有的数据操作对客户端程序都是透明的,
以先存后取的流程介绍如下:
当需要存储文件并写数据到hdfs时,客户端程序首先会向名称节点发起名称空间更新请求, 名称节点检查用户的访问权限及文件是否已经存在,如果没有问题,名称空间会挑选一个合适的数据节点分配一个空闲数据块给客户端程序, 此时名称节点内存中会增加维护这段数据在datanode节点的blockid和存储在datanode的节点信息 客户端程序直接将要存储的数据发往对应的数据节点,在完成存储后,数据节点将根据名称节点的指示将数据块复制多个副本至其它节点。 当客户端程序需要访问HDFS中的数据时(即mapper要处理对应split时),它首先基于TCP/IP协议与名称节点(namenode)监听的TCP端口建立连接, 接着通过客户端协议(Client Protocol)发起读取文件的请求,而后名称节点根据用户请求返回相关文件的块标识符(blockid)及存储了此数据块的数据节点。 接下来客户端向对应的数据节点监听的端口发起请求并取回所需要数据块。
6 hdfs 读写数据具体介绍:
6.1 写数据:
对上述流程文字描述如下:
(1) 向HDFS集群中保存数据之前,HDFS客户端需要事先知悉目标文件系统使用的“块大小”以及“复制因子(Replication Factor,即每一个块需要保存的副本数目)”。在提交数据至HDFS之前,HDFS客户端需要将要保存的文件按块大小进行分割,并将其逐个向名称节点发起块存储请求,此时,根据复制因子,客户端会要求名称节点给出与复制因子相同个数的空闲块,这里假设为3个; (2) 名称节点需要从找出至少3个具有可用空闲块的数据节点(同复制因子),并将这3个节点的地址以距客户端的距离由近及远的次序响应给客户端; (3) 客户端仅向最近的数据节点(假设为DN1)发起数据存储请求;当此最近的数据节点存储完成后,其会将数据块复制到剩余的数据节点中的一个(假设为DN2),传输完成后,由DN2负责将数据块再同步至最后一个数据节点(假设为DN3);这个也称为“复制管道(replication pipeline); (4) 当三个数据节点均存储完成后,它们会将“存储完成(DONE)”的信息分别通知给名称节点;而后,名称节点会通知客户端存储完成; (5) 客户端以此种方式存储剩余的所有数据块,并在全部数据块存储完成后通知名称节点关闭此文件,名称节点接着会将此文件的元数据信息存储至持久存储中;
6.2 读操作:
相关推荐
总的来说,这份“Hadoop Processing - MA 开发笔记”对于想要深入理解和使用Hadoop处理大数据的开发者来说,是一份宝贵的参考资料。它不仅提供了理论知识,还有实际操作的案例,可以帮助读者更好地掌握Hadoop在实际...
- **Hadoop**:Hadoop是一个开源的大数据处理框架,它主要由HDFS(分布式文件系统)和MapReduce(分布式计算模型)组成。Linux作为底层操作系统,为Hadoop提供了强大的支持。 - **Spark**:Apache Spark是另一个流行...
Hadoop是大数据处理的基石,它提供了分布式存储(HDFS)和并行计算(MapReduce)的能力。在"BigData-Notes-master"中,可能会详细介绍Hadoop的架构、工作原理以及相关的配置和优化技巧。 三、Spark大数据处理 Spark...
"DWMS大数据"是一个关于大数据处理和管理的项目,很可能是一个数据仓库管理系统(Data Warehouse Management System)的简称,专门设计用于处理大规模的数据集。在这个项目中,JavaScript可能被用来构建用户界面、...
【sqoop将MySQL数据导入Hbase2.1.6】是一项常见的大数据操作,用于整合不同数据存储系统。在这个过程中,我们需要使用Apache Sqoop工具,它是一个用于在Hadoop和传统数据库间进行数据迁移的工具。在本文中,我们将...
在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,使得用户可以使用SQL语句来处理存储在Hadoop分布式文件系统(HDFS)上的大数据。...
【标题】:“基于Hadoop的分布式搜索代码” ...通过学习和理解这个项目,开发者可以深入掌握Hadoop在搜索系统中的应用,进一步提升处理大数据的能力,同时也能对分布式系统的设计和优化有更深刻的认识。
CDH是Cloudera提供的一个大数据平台,它包含了Hadoop生态系统中的多个组件,如HDFS、YARN、Hive、HBase等。Flink则是一个流行的开源流处理和批处理框架,以其低延迟、高吞吐量和状态管理能力而闻名。 描述中提到"亲...
2. **广泛的数据源支持**:除了支持HDFS,Spark还可以从其他数据源读取数据,如S3、Cassandra等,为用户提供更多的选择。 3. **统一的数据处理接口**:Spark提供了一种统一的方式来处理批处理和流数据,简化了应用...
3. **数据存储与管理**:涵盖分布式文件系统HDFS,以及NoSQL数据库,如HBase和Cassandra。 4. **数据采集**:包括网络爬虫技术,如Python的Scrapy框架,以及API接口的使用。 5. **数据清洗与预处理**:涉及数据...
5. **Hadoop**: Hadoop是一个开源的大数据处理框架,基于分布式文件系统HDFS和MapReduce计算模型。Hadoop使得大规模数据处理变得可能,通过将任务分解到多台廉价硬件上并行处理,实现高效率和高容错性。 6. **HBase...