HDFSjava API实验

package com.gw;

import java.io.IOException;
import java.io.InputStream;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FsStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.io.IOUtils;

/**
 * @author wangweifeng
 * @dercription: 实现往HDFS中新建文件夹、删除文件夹、创建文件、删除文件 获取HDFS集群上所有节点名称信息
 *               、文件重命名、读取HDFS文件中的内容、 上传本地文件到HDFS中、下载HDFS中的文件本地文件系统、列出目录下所有文件
 *               (如果是目录则显示,层次显示目录内的文件)
 */

public class HdfsUtil {
    
    // 初始化配置参数
    static Configuration conf = new Configuration();
    static {
        String path = "/home/Hadoop/hadoop/etc/hadoop/";
        conf.addResource(new Path(path + "core-site.xml"));
        conf.addResource(new Path(path + "hdfs-site.xml"));
        conf.addResource(new Path(path + "mapred-site.xml"));
    }
    //获取FileSystem
    public static FileSystem getFs() throws IOException {
        FileSystem fs = FileSystem.get(conf);
        return fs;
    }

// 实现往HDFS中新建文件夹
    public static void mkDir(String path) throws IOException {
        FileSystem fs = getFs();
        Path srcPath = new Path(path);
        boolean isok = fs.mkdirs(srcPath);
        if (isok) {
            System.out.println("create dir Ok!");
        } else {
            System.out.println("create dir failure!");
        }
        fs.close();
    }

// 删除HDFS中的文件夹或是文件
    public static void delete(String path) throws IOException {
        FileSystem fs = getFs();
        Path srcPath = new Path(path);
        boolean isok = fs.delete(srcPath, true);
        if (isok) {
            System.out.println("delete ok!");
        } else {
            System.out.println("delete failure!");
        }
        fs.close();
    }

// 在HDFS中创建文件并写入内容
    public static void createFile(String path, byte[] contents)
            throws IOException {
        FileSystem fs = getFs();
        Path dstPath = new Path(path); // 目标路径

// 打开一个输出流
        FSDataOutputStream outputStream = fs.create(dstPath);
        outputStream.write(contents);
        outputStream.close();
        fs.close();
        System.out.println("file is created sucess!");

}

// 在HDFS中创建文件并写入内容
    public static void createFile(String path, String contents)
            throws IOException {
        createFile(path, contents.getBytes("UTF-8"));
    }

// 对HDFS中的文件重命名
    public static void reNameFile(String oldName, String newName)
            throws IOException {
        FileSystem fs = getFs();
        Path oldNamePath = new Path(oldName);
        Path newNamePath = new Path(newName);
        boolean isok = fs.rename(oldNamePath, newNamePath);
        if (isok) {
            System.out.println("rename ok!");
        } else {
            System.out.println("rename failure");
        }
        fs.close();
    }

// 读取HDFS中的文件内容并打印到标准输出
    public static void readFilePrint(String path) throws IOException {
        FileSystem fs = getFs();
        Path srcPath = new Path(path);
        // 打开一个输入流
        InputStream in = fs.open(srcPath);
        try {
            fs.open(srcPath);
            IOUtils.copyBytes(in, System.out, 4096, false); // 复制到标准输出流
        } finally {
            IOUtils.closeStream(in);
        }
    }

// 读取文件内容
    public static byte[] readFile(String path) throws IOException {
        FileSystem fs = getFs();
        if (isExist(path)) {
            Path srcPath = new Path(path);
            FSDataInputStream is = fs.open(srcPath);
            FileStatus stat = fs.getFileStatus(srcPath);
            byte[] buffer = new byte[(int) stat.getLen()];
            is.readFully(0, buffer);
            is.close();
            fs.close();
            return buffer;
        } else {
            throw new IOException("the file is not found .");
        }
    }

// 上传
    public static void upLoadFromLoacl(String HDFS_Path, String Loacl_Path)
            throws IOException {
        FileSystem fs = getFs();
        Path srcPath = new Path(Loacl_Path);
        Path desPath = new Path(HDFS_Path);
        fs.copyFromLocalFile(srcPath, desPath);

// 打印文件路径
        System.out.println("Upload to " + conf.get("fs.default.name"));
        System.out.println("------------list files------------" + "\n");

FileStatus[] fileStatus = fs.listStatus(desPath);
        for (FileStatus status : fileStatus) {
            System.out.println(status.getPath());
        }
        fs.close();
    }

// 下载
    public static void downLoadToLoacl(String HDFS_Path, String Loacl_Path)
            throws IOException {
        FileSystem fs = getFs();
        Path srcPath = new Path(HDFS_Path);
        Path desPath = new Path(Loacl_Path);
        fs.copyToLocalFile(srcPath, desPath);
        fs.close();
        System.out.println("download to sucess! ");
    }

// 判断文件或文件夹是否存在,如果存在则返回true,否在返回false
    public static boolean isExist(String path) throws IOException {
        FileSystem fs = getFs();
        Path srcPath = new Path(path);
        boolean isExist = false;
        if (fs.isDirectory(srcPath)) {
            isExist = true;
        } else if (fs.isFile(srcPath)) {
            isExist = true;
        }
        return isExist;
    }

// 获取集群中所有数据节点的状态
    public static void getDateNodeInfo() throws IOException {
        FileSystem fs = getFs();
        DistributedFileSystem hdfs = (DistributedFileSystem) fs;

DatanodeInfo[] dataNodeInfo = hdfs.getDataNodeStats();
        for (int i = 0; i < dataNodeInfo.length; i++) {
            System.out.println("DataNode_" + i + "_Name:"
                    + dataNodeInfo[i].getHostName() + "DataNode_" + i + "Ip:"
                    + dataNodeInfo[i].getInfoAddr());
        }
    }

public static void main(String[] args) throws IOException {
        System.out.println("........开始测试HDFS......");

// 1、创建一个文件夹命名为HDTest2,并在该文件夹中创建一个文件夹test以便测试删除
        //mkDir("/HDTest2");
        //mkDir("/HDTest2/test");
        
        // 2、删除/HDTest2/test
        //delete("/HDTest2/test");

// 3、在HDFS中创建一个文件,并写入"helloworld"
        //createFile("/HDTest2/helloworld.txt", "helloworld of HDFS!");

// 4、将/HDTest2/helloworld.txt 命名为/HDTest2/helloworld.ini
        //reNameFile("/HDTest2/helloworld.txt", "/HDTest2/helloworld.ini");

// 5、将文件内容打印出来
     //readFilePrint("/HDTest2/helloworld.ini");

// 6、将文件内容读出来,并创建 /HDTest2/test.txt文件
        //createFile("/HDTest2/test.txt", readFile("/HDTest2/helloworld.ini"));

// 7、将本机桌面my.cnf文件上传到/HDTest2
        //upLoadFromLoacl("/HDTest2/", "/home/Hadoop/Desktop/my.cnf");

// 8、将/HDTest2/test.txt下载到桌面
        //downLoadToLoacl("/HDTest2/test.txt", "/home/Hadoop/Desktop");

// 9、打印DataNode的信息
        //getDateNodeInfo();

}
        
}

时间: 2024-10-31 19:44:24

HDFSjava API实验的相关文章

Hadoop之HDFS读写原理

一.HDFS基本概念 HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而对于低延时数据访问.大量小文件.同时写和任意的文件修改,则并不是十分适合. 目前HDFS支持的使用接口除了Java的还有,Thrift.C.FUSE.WebDAV.HTTP等.HDFS是以block-sized chunk组织其文件内容的,默认的block大小为64MB,对于不足64MB的文件,其会占用一个bloc

实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/sys

实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

/* getpid.c */ #include <unistd.h> #include <stdio.h> int main() { pid_t pid; pid = getpid(); printf("pid = %d \n",pid); return 0; } 上面是使用函数库API 运行结果: 下面是嵌入汇编代码: /* getpid_asm.c */ #include <unistd.h> #include <stdio.h> i

Docker集群实验环境布署--swarm【6 配置上层Nginx代理,让任意Docker client访问得到高可用的管理API】

10.40.42.10上,也就是对应的VRRP中的10.40.42.1和2上,配置nginx tcp代理 # cat 4000_manager.venic.com_10.40.100.141-142_4000.conf upstream manager.venic.com { server 10.40.100.141:4000; server 10.40.100.142:4000; } server { listen 4000; proxy_pass manager.venic.com; } 重

webservice实验一

实验目的:安装jdk1.6_21以后的版本,利用JAX-WS API自己发布webservice并调用,以及用wsimport生成webservice客户端代码调用一个免费的web服务(如webxml.com.cn上的获取手机归属地的服务). 一.webservice原理了解 webservice是一种通用的跨语言跨平台的数据交互方式,之所以能够做到这一点,是因为它的底层实现机制是依赖于HTTP协议以及XML格式这些开发的标准.webservice使用SOAP(simple object acc

【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

译者地址:[翻]Android Design Support Library 的 代码实验--几行代码,让你的 APP 变得花俏 原文:Codelab for Android Design Support Library used in I/O Rewind Bangkok session--Make your app fancy with few lines of code 原文项目 demo: Lab-Android-DesignLibrary 双语对照地址: [翻-双语]Android D

#SORA#flask实验

唉,最近熬夜看动漫,早上还测了个蛋疼的数学测验,我也是醉了,今天得早点睡. 实验目的:在flask应用中使用多个http头并借助PUT,POST提交数据 源代码: __author__ = 'hochikong' from flask import Flask,request from flask.ext.restful import Resource,Api,reqparse app = Flask(__name__) api = Api(app) todos = {'task':'get t

在ASP.net Core2.0 API中使用SQL服务器

web api的教程非常少,使用 core2.0的更少,微软提供了一个aspnet core2的教程,也提供了EF core中访问SQL服务器的教程,参考这些教程可以做出使用sql server的aspnet core 2.0 api程序. 参考链接如下: 1.aspnet core 2.0 web api教程 https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api 该教程使用了字符串数组做数据源,未访问实际的数据

3.Spring Boot中使用Swagger2构建强大的RESTful API文档

原文:http://www.jianshu.com/p/8033ef83a8ed 由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端. 这样一来,我们的RESTful API就有可能要面对多个开发人员或多个开发团队:IOS开发.Android开发或是Web开发