Hadoop HDFS架构设计与读写流程解析

需积分: 9 1 下载量 22 浏览量 更新于2024-09-11 1 收藏 166KB DOCX 举报
"HDFS构架设计和读写流程" Hadoop Distributed FileSystem(HDFS)是一种分布式文件系统,专为处理大规模数据集而设计。它旨在将超大型数据集分散存储在集群中的普通商用计算机上,同时确保高可靠性和高吞吐量。HDFS的核心设计理念包括对超大文件的支持、流式数据访问、容错机制、简单的一致性模型以及计算向数据的移动。 设计前提和目标: 1. 大文件支持:HDFS设计时考虑了GB级别的文件,能扩展到数以千计的节点,支持数千万文件。 2. 流式访问:适合批处理而非交互式应用,强调高吞吐量而非低延迟。 3. 容错能力:通过冗余备份提供高可用性。 4. 一致性模型:采用一次写入多次读取(WORM)策略,文件一旦写入,不频繁变动。 5. 计算与数据亲和性:允许应用程序计算靠近数据的位置,提高效率。 6. 平台兼容性:适应多种硬件和软件环境。 不适合的场景: 1. 大量小文件:小文件会导致NameNode内存负担过重。 2. 低延迟访问:HDFS优化了大数据传输,而非快速响应。 3. 多用户写入和任意修改:HDFS支持单一写入者,不适合多用户同时修改同一文件。 HDFS架构设计: HDFS由NameNode、SecondaryNameNode和DataNode三个主要组件构成。NameNode作为主节点负责元数据管理,SecondaryNameNode辅助NameNode进行定期备份,DataNode则是实际存储数据的从节点。 数据块: HDFS文件被分割成固定大小的数据块,默认为64MB。这个大小是为了平衡寻址时间和传输时间,提高效率。数据块会以多个副本(默认3个)分布在不同DataNode上,以实现容错。这样设计的好处包括: - 支持超大文件,无需担心单个节点容量不足。 - 简化文件系统的复杂性,便于管理和扩展。 读写流程: 1. 写入:客户端将文件分成数据块,然后将每个块发送到DataNode,同时将元数据发送给NameNode。NameNode记录文件块的位置信息。 2. 读取:当读取文件时,客户端向NameNode查询文件块位置,然后直接从相应的DataNode读取数据。 总结来说,HDFS通过其独特的架构和设计原则,成功地解决了大数据存储和处理的问题,成为了大数据分析领域的基础工具。然而,对于特定的应用场景,如需要低延迟访问或处理大量小文件,HDFS可能不是最佳选择。

以下是一个flume的conf文件,请帮我逐行解释一下代码:“#定义三大组件的名称 a.sources = r a.sinks = k1 k2 k3 a.channels = c1 c2 c3 #将数据流复制给所有channel a.sources.r.selector.type = replicating  # 配置Source组件 a.sources.r.type = exec a.sources.r.command = cat /home/bit/novel/novel.csv # kafka a.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink a.sinks.k1.kafka.topic = data a.sinks.k1.kafka.bootstrap.servers = localhost:9092 a.sinks.k1.kafka.flumeBatchSize = 20 a.sinks.k1.kafka.producer.acks = 1 a.sinks.k1.kafka.producer.linger.ms = 1 a.sinks.k1.kafka.producer.compression.type = snappy a.channels.c1.type = memory a.channels.c1.capacity = 100000 a.channels.c1.transactionCapacity = 100 # mysql a.sinks.k2.type =com.us.flume.MysqlSink a.sinks.k2.hostname=localhost a.sinks.k2.port=3306 a.sinks.k2.databaseName=novel a.sinks.k2.tableName=table1 a.sinks.k2.user=bit a.sinks.k2.password=123456 a.channels.c2.type = memory a.channels.c2.capacity = 100000 a.channels.c2.transactionCapactiy = 2000 # hdfs a.sinks.k3.type = hdfs a.sinks.k3.hdfs.path = hdfs://localhost:9000/user/bit/novel #积攒多少个Event才flush到HDFS一次 a.sinks.k3.hdfs.batchSize = 100 #设置文件类型,可支持压缩 a.sinks.k3.hdfs.fileType = DataStream #多久生成一个新的文件 a.sinks.k3.hdfs.rollInterval = 5 a.channels.c3.type = memory a.channels.c3.capacity =100000 a.channels.c3.transactionCapacity = 100 # Bind the source and sink to the channel a.sources.r.channels = c1 c2 c3 a.sinks.k1.channel = c1 a.sinks.k2.channel = c2 a.sinks.k3.channel = c3”

2023-05-24 上传

#定义三大组件的名称 a.sources = r a.sinks = k1 k2 k3 a.channels = c1 c2 c3 #将数据流复制给所有channel a.sources.r.selector.type = replicating  # 配置Source组件 a.sources.r.type = exec #exec表示数据源来自运行给定的Unix命令后生成的数据 a.sources.r.command = cat /home/bit/ys/hngyzd.csv # kafka a.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink a.sinks.k1.kafka.topic = data a.sinks.k1.kafka.bootstrap.servers = localhost:9092 a.sinks.k1.kafka.flumeBatchSize = 20 a.sinks.k1.kafka.producer.acks = 1 a.sinks.k1.kafka.producer.linger.ms = 1 a.sinks.k1.kafka.producer.compression.type = snappy a.channels.c1.type = memory a.channels.c1.capacity = 100000 a.channels.c1.transactionCapacity = 100 # mysql a.sinks.k2.type =com.us.flume.MysqlSink a.sinks.k2.hostname=localhost a.sinks.k2.port=3306 a.sinks.k2.databaseName=ys a.sinks.k2.tableName=table1 a.sinks.k2.user=bit a.sinks.k2.password=123456 a.channels.c2.type = memory a.channels.c2.capacity = 100000 a.channels.c2.transactionCapactiy = 2000 # hdfs a.sinks.k3.type = hdfs a.sinks.k3.hdfs.path = hdfs://localhost:9000/user/bit/ys #积攒多少个Event才flush到HDFS一次 a.sinks.k3.hdfs.batchSize = 100 #设置文件类型,可支持压缩 a.sinks.k3.hdfs.fileType = DataStream #多久生成一个新的文件 a.sinks.k3.hdfs.rollInterval = 5 a.channels.c3.type = memory a.channels.c3.capacity =100000 a.channels.c3.transactionCapacity = 100 # Bind the source and sink to the channel a.sources.r.channels = c1 c2 c3 a.sinks.k1.channel = c1 a.sinks.k2.channel = c2 a.sinks.k3.channel = c3

2023-05-23 上传