【实战演练】数据存储与分析:将爬取的数据存储到Hadoop HDFS并进行大数据处理
发布时间: 2024-06-25 02:07:23 阅读量: 143 订阅数: 171
![python爬虫开发合集](https://img-blog.csdn.net/20180630125141762?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tpc3Nhemh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
# 2.1 HDFS架构和原理
Hadoop分布式文件系统(HDFS)是Hadoop生态系统中用于存储大数据的分布式文件系统。它采用主从架构,由一个NameNode和多个DataNode组成。
NameNode是HDFS的元数据服务器,负责管理文件系统中的文件和目录。它维护着文件系统中所有文件的元数据信息,包括文件名称、文件大小、文件块列表以及文件块所在DataNode的信息。
DataNode是HDFS的数据存储服务器,负责存储实际的数据块。每个DataNode存储着文件系统中的一部分数据块,并定期向NameNode汇报自己的存储状态。当客户端需要读取或写入文件时,会先向NameNode请求文件元数据信息,然后直接与存储该文件块的DataNode进行数据交互。
# 2. Hadoop HDFS数据存储实践
### 2.1 HDFS架构和原理
Hadoop分布式文件系统(HDFS)是一种分布式文件系统,专为存储和处理大数据集而设计。它采用主从架构,其中一个NameNode负责管理文件系统元数据,而多个DataNode负责存储实际数据。
#### HDFS架构
HDFS架构包括以下组件:
* **NameNode:**管理文件系统元数据,包括文件和目录的名称、位置和权限。
* **DataNode:**存储实际数据块,并响应来自NameNode和客户端的请求。
* **Client:**与NameNode交互以访问文件系统,并与DataNode交互以读写数据。
#### HDFS原理
HDFS使用以下原理来实现分布式存储和处理:
* **块存储:**文件被分成固定大小的块(通常为128MB),并存储在DataNode上。
* **数据冗余:**每个块被复制到多个DataNode上,以提高数据可靠性。
* **容错:**如果一个DataNode发生故障,NameNode会自动将数据块复制到其他DataNode上。
* **负载均衡:**NameNode负责将数据块均匀分布在DataNode上,以优化性能。
### 2.2 HDFS数据写入和读取
#### 数据写入
客户端向NameNode请求写入文件,NameNode会返回文件块的位置。客户端将数据块写入DataNode,并向NameNode报告写入完成。NameNode更新元数据以反映文件的新位置。
#### 数据读取
客户端向NameNode请求读取文件,NameNode会返回文件块的位置。客户端从DataNode读取数据块,并将其组装成完整的文件。
### 2.3 HDFS数据管理和维护
#### 数据管理
HDFS提供以下数据管理功能:
* **文件和目录管理:**创建、删除、重命名和移动文件和目录。
* **权限控制:**设置文件和目录的访问权限。
* **配额管理:**限制用户或组可以存储的数据量。
#### 数据维护
HDFS提供以下数据维护功能:
* **数据块报告:**DataNode定期向NameNode报告其存储的数据块。
* **块复制:**NameNode监控数据块的副本数,并根据需要复制块以保持冗余。
* **块回收:**当数据块不再需要时,NameNode会将其从DataNode中删除。
#### 代码示例
以下代码示例演示了如何使用HDFS API写入和读取数据:
```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
public class HdfsReadWrite {
public static void main(String[] args) throws Exception {
// 配置
Configuration conf = new Configuration();
// 创建文件系统
FileSystem fs = FileSystem.get(conf);
// 写入数据
Path path = new Path("/user/hadoop/test.txt");
FSDataOutputStream out = fs.create(path);
out.writeUTF("Hello, HDFS!");
out.close();
// 读取数据
FSDataInputStream in = fs.open(path);
String data = in.readUTF();
in.close();
// 输出数据
System.out.println(data);
}
}
```
#### 逻辑分析
此代码示例演示了如何使用HDFS API写入和读取数据。
* **写入数据:**
* 创建一个Configuration对象。
* 创建一个FileSystem对象。
* 创建一个Path对象,指定要写入的文件路径。
* 创建一个FSDataOutputStream对象,用于写入数据。
* 使用writeUTF()方法写入数据。
* 关闭FSDataOutputStream对象。
* **读取数据:**
* 使用FileSystem对象打开文件。
* 创建一个FSDataInputStream对象,用于读取数据。
* 使用readUTF()方法读取数据。
* 关闭FSDataInputStream对象。
# 3.1 Hadoop MapReduce编程模型
**简介**
Hadoop MapReduce是一种分布式编程模型,用于处理大规模数据集。它将数据处理任务分解为两个阶段:Map和Reduce。Map阶段将数据映射到中间键值对,而Reduce阶段将具有相同键的中间值聚合在一起。
**MapReduce工作流程**
MapReduce工作流程如下:
1. **输入数据分片:**输入数据被分成较小的块,称为分片。
2. **Map任务:**每个分片由一个Map任务处理。Map任务将分片中的数据映射到中间键值对。
3. **Shuffle和排序:**中间键值对被洗牌和排序,以将具有相同键的值分组在一起。
4. **Reduce任务:**每个键组由一个Reduce任务处理。Reduce任务将具有相同键的值聚合在一起,并产生最终输出。
**MapReduce API**
MapReduce API提供了以下类:
* `Mapper`:定义Map任务的逻辑。
* `Reducer`:定义Reduce任务的逻辑。
* `Job`:配置和提交MapReduce作业。
**MapR
0
0