Hadoop文件操作之HDFS,创建。删除目录,读写文件,追加写文件
package hadoop.hadoop_demo;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* <dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
</dependency>
*
*/
public class App {
public static void main(String[] args) throws Exception {
System.out.println("Hello World!");
String hdfs = "hdfs://192.168.1.111:9000";
// mkdir(hdfs,"gaojs");
// touchFile(hdfs,"gjs/1.log");
rmdir(hdfs, "zookeeper_server.pid");
appendFile(hdfs, "gjs/1.log");
// readFile(hdfs);
}
/**
* 追加文件,新版本才支持
* @param hdfs
* @param fullNasme
* @throws Exception
*/
private static void appendFile(String hdfs, String fullNasme)
throws Exception {
FileSystem fileSystem = getFileSystem();
OutputStream out = fileSystem.append(new Path(hdfs + "/" + fullNasme));
out.write(("I am gaojs, who are you" + System.currentTimeMillis() + "\r\n")
.getBytes("UTF-8"));
out.flush();
out.close();
}
/**
* 取得FileSystem
* @return
* @throws Exception
*/
public static final FileSystem getFileSystem() throws Exception {
String hdfs = "hdfs://192.168.1.111:9000";
Configuration conf = new Configuration();
conf.set("dfs.client.block.write.replace-datanode-on-failure.policy","NEVER");
conf.set("dfs.client.block.write.replace-datanode-on-failure.enable","true");
FileSystem fileSystem = FileSystem.get(URI.create(hdfs), conf);
System.out.println(fileSystem);
return fileSystem;
}
/**
* 读文件
* @param hdfs
* @throws Exception
*/
private static void readFile(String hdfs) throws Exception {
FileSystem fileSystem = getFileSystem();
InputStream in = fileSystem.open(new Path(hdfs + "/"
+ "zookeeper_server.pid"));
IOUtils.copy(in, System.out);
fileSystem.close();
}
/**
* 创建空文件
* @param hdfs
* @param fullNasme
* @throws Exception
*/
private static void touchFile(String hdfs, String fullNasme)
throws Exception {
FileSystem fileSystem = getFileSystem();
boolean res = fileSystem
.createNewFile(new Path(hdfs + "/" + fullNasme));
if (res) {
System.out.println("-------create File Success------" + fullNasme);
} else {
System.out.println("-------create File Fail------" + fullNasme);
}
fileSystem.close();
}
/**
* 删除文件或者目录
* @param hdfs
* @param fullNasme
* @throws Exception
*/
private static void rmdir(String hdfs, String fullNasme) throws Exception {
FileSystem fileSystem = getFileSystem();
boolean res = fileSystem.delete(new Path(hdfs + "/" + fullNasme));
if (res) {
System.out.println("------rmdir Success------" + fullNasme);
} else {
System.out.println("------rmdir Fail------" + fullNasme);
}
fileSystem.close();
}
/**
* 创建目录
* @param hdfs
* @param fullNasme
* @throws Exception
*/
private static void mkdir(String hdfs, String fullNasme) throws Exception {
FileSystem fileSystem = getFileSystem();
boolean res = fileSystem.mkdirs(new Path(hdfs + "/" + fullNasme));
if (res) {
System.out.println("-------mkdir Success------" + fullNasme);
} else {
System.out.println("-------mkdir Fail------" + fullNasme);
}
}
}
错误解决方案:
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_242718953_1, ugi=Administrator (auth:SIMPLE)]]
Exception in thread "main" java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[DatanodeInfoWithStorage[192.168.1.111:50010,DS-c7e4fa47-633d-4d8b-aa09-c50b1e6a411a,DISK]], original=[DatanodeInfoWithStorage[192.168.1.111:50010,DS-c7e4fa47-633d-4d8b-aa09-c50b1e6a411a,DISK]]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.findNewDatanode(DFSOutputStream.java:929)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:992)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1160)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:455)
解决方案:
conf.set("dfs.client.block.write.replace-datanode-on-failure.policy","NEVER");
conf.set("dfs.client.block.write.replace-datanode-on-failure.enable","true");
相关推荐
在Java程序中操作HDFS文件主要依赖于`org.apache.hadoop.fs.FileSystem`类,该类提供了许多方法用于执行文件系统操作,如创建文件、删除文件、读写文件等。 ##### 1. 创建文件系统实例 ```java Configuration conf ...
在Flume中,当配置了将数据流推送到HDFS时,需要确保Flume环境包含了正确的HDFS驱动,以便能够正确地读写HDFS上的文件。如果没有这些驱动,Flume在尝试将数据写入HDFS时可能会遇到错误。 描述中提到的问题是,当...
这些实验步骤旨在帮助学生掌握HDFS的常用操作,包括文件系统的交互、数据读写以及高级功能,如文件追加和目录管理。同时,通过使用Java API,学生将加深对Hadoop生态系统和文件系统API的理解,为后续的大数据处理和...
实验二:“熟悉常用的HDFS操作”旨在帮助学习者深入理解Hadoop分布式文件系统(HDFS)在大数据处理中的核心地位,以及如何通过Shell命令和Java API进行高效操作。HDFS在Hadoop架构中扮演着存储大数据的核心角色,为...
2. **文件追加**:HDFS不支持原生的文件追加操作,但可以通过重新打开文件并定位到末尾来实现。 3. **文件复制**:可以使用`copyToLocalFile()`或`copyFromLocalFile()`方法在HDFS与本地文件系统之间进行复制。 4....
(5)给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息 (6)提供一个HDFS内的文件的路径,对该文件进行创建和删除...
* hdfs dfs:用于管理HDFS文件系统的命令,例如查看文件列表、创建目录、删除文件等。 实验目的 本实验的目的旨在熟悉常用的HDFS操作命令,包括: * 理解HDFS在Hadoop体系结构中的角色 * 熟练使用HDFS操作常用的...
- **删除文件或目录**:使用`FileSystem.delete()`方法,可以删除单个文件或整个目录。 - **移动/重命名文件**:`FileSystem.rename()`方法用于移动或重命名文件或目录。 - **检查文件状态**:`FileSystem.exists...
HDFS Shell提供了与Linux命令类似的接口,如`hdfs dfs -mkdir`用于创建目录,`hdfs dfs -put`用于上传文件,`hdfs dfs -ls`用于查看目录内容,`hdfs dfs -get`用于下载文件,以及`hdfs dfs -rm`用于删除文件或目录。...
- 学习如何通过Java API来执行上述类似的操作,这包括但不限于文件的上传、下载、删除等。 **2. 实验平台** - **操作系统**:Linux - Linux系统是运行Hadoop集群的标准选择,因为它提供了良好的性能和稳定性。 -...
1. **Shell操作**:用户可以通过HDFS的命令行接口(Shell)执行各种操作,如创建、删除文件和目录,查看文件内容,移动或重命名文件等。 2. **Java API操作**:对于开发人员,HDFS提供了丰富的Java API,允许应用...
如果需要处理目录,可以使用`FileSystem`的`mkdirs()`创建目录,`listFiles()`获取目录下所有文件,以及`delete()`删除文件或目录。 在`TestFileSystem.java`这个文件中,可能会包含一个测试类,演示了如何使用这些...
5. HDFS操作:用户可以通过HDFS的命令行工具或者Hadoop的Java API与HDFS进行交互,如上传、下载、查看、删除文件等。此外,HDFS还支持流式数据访问,适合大规模批处理任务。 6. HDFS容错机制:HDFS通过心跳检测和...
- **递归创建目录**:使用 `-mkdir -p` 命令可以创建多级目录,如 `hadoop fs -mkdir -p /hopdir/myfile` 创建 `/hopdir/myfile` 目录。 - **查看目录**:使用 `-ls` 命令查看指定目录下的文件列表。例如,`hadoop...
- KFS在设计上也更适合大数据批量处理,但提供了更多的文件操作,包括读写和追加。这使得KFS在某些应用场景下比HDFS更具灵活性。 4. **Java实现与API** - HDFS是用Java实现的,因此其客户端API主要基于Java,同时...
2. **不适合频繁的读写操作**:由于HDFS主要用于批量数据处理而非在线事务处理,因此在需要频繁读写操作的应用场景下,HDFS的表现可能不尽如人意。 综上所述,HDFS作为一种专门为分布式存储和处理大规模数据而设计...
需要注意的是,HDFS默认不支持文件追加,所以通常需要先删除已有文件再创建。 5. **读写数据**:通过FSDataInputStream和FSDataOutputStream提供的read()和write()方法,可以读取或写入字节数据。对于大文件,通常...