Hadoop数据移动技术全解析
立即解锁
发布时间: 2025-08-25 00:55:09 阅读量: 5 订阅数: 6 

# Hadoop 数据移动技术全解析
## 1. DistCp 工具介绍
DistCp 是一款强大的工具,可用于在 Hadoop 文件系统之间移动数据。它具有增量复制等特性,能够近乎持续地同步两个系统上的目录。而且,它还支持在不同版本的 Hadoop 之间复制数据,因此在多个 Hadoop 集群间同步数据时非常受欢迎。
### 1.1 执行 DistCp 命令
运行 DistCp 命令时,建议在 screen 会话中执行,或者至少使用 nohup 将输出重定向到本地文件。
### 1.2 DistCp 的局限性及解决办法
DistCp 支持多个源目录,但只支持单个目标目录。这意味着无法使用单个 DistCp 作业在集群之间进行单向同步(除非只需要同步单个目录)。在这种情况下,可以采取以下两种方法:
- 运行多个 DistCp 作业。
- 运行单个作业并同步到暂存目录,然后使用 `fs -mv` 将暂存文件移动到最终目标。
## 2. 使用 Java 加载文件
### 2.1 问题提出
希望在 Java 应用程序中实现向 HDFS 写入数据的功能。
### 2.2 解决方案
使用 Hadoop Java API 访问 HDFS 中的数据。
### 2.3 详细讨论
HDFS Java API 与 Java 的 I/O 模型完美集成,可使用常规的 `InputStreams` 和 `OutputStreams` 进行 I/O 操作。为了执行文件系统级别的操作,如创建、打开和删除文件,Hadoop 提供了一个抽象类 `FileSystem`,它会为 Hadoop 中可使用的特定文件系统进行扩展和实现。
以下是使用 Java 实现将标准输入的数据写入 HDFS 文件的代码示例:
```java
Path output = new Path("output.txt");
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
FSDataOutputStream out = fs.create(output, false);
try {
IOUtils.copyBytes(System.in, out, getConf(), false);
} finally {
out.close();
}
```
可以通过以下命令测试代码的实际运行效果:
```bash
$ echo "the cat" | hip hip.ch5.CopyStreamToHdfs --output test.txt
$ hadoop fs -cat test.txt
the cat
```
### 2.4 代码解析
在代码中,`FileSystem fs = FileSystem.get(conf);` 用于获取 `FileSystem` 的句柄,但 Hadoop 如何知道返回哪个具体的文件系统呢?关键在于传递给 `get` 方法的 `conf` 对象。`FileSystem` 类会检查 `fs.defaultFS` 属性的值,该属性包含一个标识应使用的文件系统的 URI。默认情况下,它被配置为本地文件系统(`file:///`),这就是为什么在没有任何配置的情况下直接运行 Hadoop 时,使用的是本地文件系统而不是 HDFS。
在伪分布式设置中,首先要做的是在 `core-site.xml` 中配置 HDFS 文件系统:
```xml
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:8020</value>
</property>
```
Hadoop 会从 URL 中提取方案(如上述示例中的 `hdfs`),并进行查找以发现具体的文件系统。文件系统的发现方式有两种:
- 内置文件系统会自动被发现,Hadoop 会调用其 `getScheme` 方法来确定方案。例如,HDFS 的实现类是 `org.apache.hadoop.hdfs.DistributedFileSystem`,`getScheme` 方法返回 `hdfs`。
- 非内置的文件系统可以通过在 `core-site.xml` 中更新 `fs.$scheme.impl` 来识别,其中 `$scheme` 应替换为 URI 中标识的方案。
### 2.5 FileSystem 类常用方法
`FileSystem` 类有许多用于操作文件系统的方法,以下是一些常用方法:
| 方法 | 描述 |
| ---- | ---- |
| `static FileSystem get(Configuration conf)` | 获取具体的 `FileSystem` 实例 |
| `static LocalFileSystem getLocal(Configuration conf)` | 获取本地文件系统实例 |
| `static FSDataOutputStream create(FileSystem fs, Path file)` | 创建新文件并返回可写入的 `OutputStream` |
| `FSDataInputStream open(Path f, int bufferSize)` | 打开文件并返回 `InputStream` |
| `boolean delete(Path f, boolean recursive)` | 删除文件或目录 |
| `boolean mkdirs(Path f)` | 创建目录 |
| `void copyFromLocalFile(Path src, Path dst)` | 从本地文件系统复制文件到 HDFS |
| `void copyToLocalFile(Path src, Path dst)` | 从 HDFS 复制文件到本地文件系统 |
| `FileStatus getFileStatus(Path f)` | 获取文件状态 |
| `void close()` | 关闭文件系统 |
## 3. URI 方案及相关 Hadoop 文件系统实现
| 方案 | 详细信息 |
| ---- | ---- |
| `hdfs` | 提供对 Hadoop 自身 HDFS 的原生访问,但不支持向后和向前兼容性 |
| `file` | 用于读写本地文件系统 |
| `hftp` 和 `hsftp` | 是 HDFS 上的旧版只读视图,强调 API 兼容性以支持任何版本的 Hadoop。`hsftp` 使用 HTTPS 传输以增强安全性 |
| `webhdfs` | 可与 WebHDFS(如果客户端可以访问 Hadoop 集群)和 HttpFS 网关(用于从防火墙后面访问 HDFS)一起使用。它支持对 HDFS 的读写接口,还可用于在不同版本的 Hadoop 之间读写数据 |
| `ftp` | 使用 FTP 作为存储实现 |
| `s3` 和 `s3n` | 提供对 Amazon S3 文件系统的访问。`s3n` 提供对 S3 的原生访问,而 `s3` 以基于块的方式存储数据,以绕过 S3 的最大文件大小限制 |
## 4. 持续将日志和二进制文件移动到 HDFS
日志数据在各种应用中广泛存在,Hadoop 使得处理生产系统产生的大量日志数据成为可能。从网络设备、操作系统到 Web 服务器和应用程序,各种系统都会产生日志数据。这些日志文件有助于深入了解系统和应用程序的运行情况以及使用方式。
### 4.1 Flume 工具介绍
0
0
复制全文
相关推荐










