`
bit1129
  • 浏览: 1069579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Hadoop十三】HDFS Java API基本操作

 
阅读更多

 

package com.examples.hadoop;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;

public class HDFSOp {
    private static FileSystem getFileSystem() {
        try {
            URI uri = new URI("hdfs://hadoop.master:9000/");
            Configuration c = new Configuration();
            c.setBoolean("dfs.support.append", true);
            c.set("dfs.replication", "1");
            FileSystem fileSystem = FileSystem.get(uri, c);
            return fileSystem;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static boolean exists(FileSystem hdfs, Path file) throws Exception {
        return hdfs.exists(file);
    }

    private static boolean delete(FileSystem hdfs, Path file) throws Exception {
        return hdfs.delete(file, true);
    }

    private static void append(FileSystem hdfs, Path file) throws Exception {
        OutputStream os = hdfs.append(file);
        String str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        os.write(str.getBytes());
        os.close();
    }

    private static void uploadFromLocal(FileSystem hdfs, Path src, Path dst) throws Exception {
        hdfs.copyFromLocalFile(src, dst);
    }

    private static FileStatus[] listFiles(FileSystem hdfs, Path dir) throws Exception {
        return hdfs.listStatus(dir);
    }

    private static String getData(FileSystem hdfs, Path file) throws Exception {
        FSDataInputStream is = hdfs.open(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line).append(System.lineSeparator());
        }
        return sb.toString();
    }

    public static void main(String[] args) throws Exception {
        FileSystem hdfs = getFileSystem();
        Path src = new Path("file:///D:/people.txt");
        Path dst = new Path("/user/hadoop/excercise");
        Path dstFile = new Path("/user/hadoop/excercise/people.txt");

        //判空,删除
        if (exists(hdfs, dstFile)) {
            System.out.println("File exists, remove it!!");
            delete(hdfs, dstFile);
        }

        //上传
        uploadFromLocal(hdfs, src, dst);

        //追加内容
        append(hdfs, dstFile);

        //列出目录下的所有文件
        FileStatus[] files = listFiles(hdfs, dst);
        for (FileStatus file : files) {
            System.out.println(file.getPath());
        }

        //文件内容下载
        String data = getData(hdfs, dstFile);
        System.out.println(data);


    }

}

 

需要注意的问题:

1. HDFS文件系统权限的问题

如果执行程序的用户没有操作的目录的权限,会报如下异常:AccessControlException,Permission Denied异常,

解决办法是

hdfs dfs -chmod 777 /user/hadoop/excercise

 

2. 关于HDFS append操作

HDFS一开始并不支持append操作,在2.x版本添加了对append操作的支持,但是为了使这个操作成功,需要一些设置,

 

//支持hdfs append操作
c.setBoolean("dfs.support.append", true);
//因为测试使用的单机环境,必须将dfs.replication设置为1,否则append操作报错。另外只在hdfs-site.xml中设置这个属性还不够
c.set("dfs.replication", "1");

 

hdfs-site.xml的配置:

    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

    <property>
        <name>dfs.support.append</name>
        <value>true</value>
    </property>

 

dfs.replication给定的属性必须小于等于HDFS中DataNode的数目,即如果是单机模式,这个值只能设置为1,设置的值大于1,那么append操作会报错:

 

java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java操作Hadoop源码之HDFS Java API操作-上传文件

    在Java编程环境中,Hadoop分布式文件系统(HDFS)提供了丰富的Java API,使得开发者能够方便地与HDFS进行交互,包括文件的上传、下载、读写等操作。本篇文章将详细探讨如何使用HDFS Java API来实现文件上传的功能。 ...

    java操作Hadoop源码之HDFS Java API操作-创建目录

    以上就是使用Java API操作Hadoop HDFS创建目录的完整过程。在实际应用中,你可能需要处理异常,优化错误处理,并根据具体需求进行更复杂的操作,比如读写文件、检查文件是否存在等。通过熟练掌握HDFS的Java API,你...

    02--HDFS Java API操作.docx

    HDFS Java API 是 Hadoop 中的一部分,提供了一个 Java 编程接口来访问和操作 HDFS 中的文件和目录。该 API 提供了多种方法来操作文件和目录,包括创建、删除、读取和写入文件,列出目录中的文件和子目录等。 二、...

    ecplise远程连接hadoop--hdfs java api操作文件.pdf

    在Eclipse中远程连接到Hadoop集群,并通过HDFS的Java API操作文件是一套涉及多个步骤的技术流程,这套流程主要涉及到分布式计算和文件系统操作的知识。首先,我们来梳理一下整个过程中的关键知识点。 第一步:启动...

    hdfs-java-api

    * org.apache.hadoop.fs.FileSystem:该类提供了文件系统的基本操作,包括文件的读取、写入、复制、删除等。 * org.apache.hadoop.fs.Path:该类表示 HDFS 中的一个文件路径。 * org.apache.hadoop.conf....

    elcipse java hadoop操作hdfs的api

    1. **HDFS API**:HDFS API是Hadoop的核心组件之一,提供了对分布式文件系统的基本操作,如打开、创建、读取、写入、移动和删除文件或目录。主要类包括`FSDFSClient`、`FileSystem`、`Path`等。 2. **FileSystem...

    大数据技术基础实验报告-调用Java API实现HDFS操作.doc

    通过这些API,我们可以实现数据的上传、下载、查找、删除等基本操作,以及更复杂的文件系统操作。 在实际编程中,我们通常会创建一个Java类,导入Hadoop的相关库,然后使用FileSystem类和Path类等来执行HDFS操作。...

    实验二、HDFS shell操作及HDFS Java API编程

    适合刚接触hadoop的学生或小白,内容包括HDFS shell操作及HDFS Java API编程 有图片有代码

    hadoop-hdfs-2.7.3-API文档-中英对照版.zip

    标签:apache、hdfs、hadoop、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    hadoop-hdfs-2.6.5-API文档-中文版.zip

    标签:apache、hdfs、hadoop、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...

    Hadoop+HBase+Java API

    标题 "Hadoop+HBase+Java API" 涉及到三个主要的开源技术:Hadoop、HBase以及Java API,这些都是大数据处理和存储领域的关键组件。以下是对这些技术及其结合使用的详细介绍: **Hadoop** 是一个分布式计算框架,由...

    hadoop-hdfs-2.7.3-API文档-中文版.zip

    标签:apache、hdfs、hadoop、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...

    HDFS实例基本操作

    2. 使用HDFS API:对于Java应用程序,可以使用Hadoop的FSDataOutputStream类,通过创建一个FileSystem实例,然后调用`create()`方法来上传文件。 三、HDFS的文件下载 1. 命令行工具:使用`hadoop fs -get`命令将...

    HDFS在JAVA API的操作

    HDFS在JAVA API中的操作,以及在ecplise中的配置详情。

    hadoop-hdfs-client-2.9.1-API文档-中英对照版.zip

    标签:apache、hadoop、hdfs、client、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    hdfs_design.rar_HDFS-OPERATE_hadoop_hadoop java_hdfs

    这些基本操作是日常管理和维护HDFS的基础。 在Hadoop__java标签中,意味着这份资料深入讲解了使用Java API与HDFS交互的方法。HDFS提供了丰富的Java接口,允许开发人员在应用程序中直接操作HDFS。例如,`FileSystem`...

    实验项目 实战 HDFS 实验报告

    HDFS Shell命令则用于交互式操作,如创建目录、上传/下载文件、查看文件内容等,这些命令包括ls、mkdir、put、get、rm等,通过它们可以熟练掌握HDFS的基本操作。 四、HDFS项目开发环境 在Hadoop集群的主节点上搭建...

    hadoop-hdfs-2.6.5-API文档-中英对照版.zip

    标签:apache、hdfs、hadoop、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    java操作hadoop_hdfs_api的用法,mapreduce基本用法、编码规范,自定义数据

    java操作hadoop_hdfs_api的用法,mapreduce基本用法、编码规范,自定义数据类_hadoop-study

Global site tag (gtag.js) - Google Analytics