tencent cloud

Feedback

Accessing CHDFS Through Java Code

Last updated: 2022-03-30 09:30:26

    Overview

    This document describes how to access CHDFS through Java code. After deploying the JAR package of CHDFS, in addition to manipulating CHDFS by using command lines, big data components, and other methods, you can also access CHDFS through Java code.

    Prerequisites

    The relevant JAR package of CHDFS has been deployed. For more information on the deployment, please see Mounting CHDFS Instance.
    The server that runs the Java program is in a VPC allowed to be accessed by the permission group of the mount point.

    Directions

    1. Create a Maven project and add the following dependencies to pom.xml in Maven (please set the version of the hadoop-common package based on your actual Hadoop environment).
    <dependencies>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.8.5</version>
    <scope>provided</scope>
    </dependency>
    </dependencies>
    2. Run the Hadoop code for modification as detailed below. For the configuration items and their descriptions, please see Mounting CHDFS Instance. Only certain common file system operation APIs are listed below. For other APIs, please see Hadoop FileSystem APIs.
    package com.qcloud.chdfs.demo;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileChecksum;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    import java.io.IOException;
    import java.net.URI;
    import java.nio.ByteBuffer;
    
    public class Demo {
    private static FileSystem initFS() throws IOException {
    Configuration conf = new Configuration();
    // For the CHDFS configuration items, please visit https://www.tencentcloud.com/document/product/1105/36368?from_cn_redirect=1
    // The following configuration items are required
    
    conf.set("fs.ofs.impl", "com.qcloud.chdfs.fs.CHDFSHadoopFileSystemAdapter");
    conf.set("fs.AbstractFileSystem.ofs.impl", "com.qcloud.chdfs.fs.CHDFSDelegateFSAdapter");
    conf.set("fs.ofs.tmp.cache.dir", "/data/chdfs_tmp_cache");
    conf.set("fs.ofs.user.appid", "1250000000");
    // For other optional configuration items, please visit https://www.tencentcloud.com/document/product/1105/36368?from_cn_redirect=1
    
    String chdfsUrl = "ofs://f4maaabbb-ccdd.chdfs.ap-guangzhou.myqcloud.com/";
    return FileSystem.get(URI.create(chdfsUrl), conf);
    }
    
    private static void mkdir(FileSystem fs, Path filePath) throws IOException {
    fs.mkdirs(filePath);
    }
    
    private static void createFile(FileSystem fs, Path filePath) throws IOException {
    // Create a file (if it already exists, it will be overwritten)
    // if the parent dir does not exist, fs will create it!
    FSDataOutputStream out = fs.create(filePath, true);
    try {
    // Write a file
    String content = "test write file";
    out.write(content.getBytes());
    } finally {
    IOUtils.closeQuietly(out);
    }
    }
    
    private static void readFile(FileSystem fs, Path filePath) throws IOException {
    FSDataInputStream in = fs.open(filePath);
    try {
    byte[] buf = new byte[4096];
    int readLen = -1;
    do {
    readLen = in.read(buf);
    } while (readLen >= 0);
    } finally {
    IOUtils.closeQuietly(in);
    }
    }
    
    
    private static void queryFileOrDirStatus(FileSystem fs, Path path) throws IOException {
    FileStatus fileStatus = fs.getFileStatus(path);
    if (fileStatus.isDirectory()) {
    System.out.printf("path %s is dir\\n", path);
    return;
    }
    
    long fileLen = fileStatus.getLen();
    long accessTime = fileStatus.getAccessTime();
    long modifyTime = fileStatus.getModificationTime();
    String owner = fileStatus.getOwner();
    String group = fileStatus.getGroup();
    
    
    System.out.printf("path %s is file, fileLen: %d, accessTime: %d, modifyTime: %d, owner: %s, group: %s\\n",
    path, fileLen, accessTime, modifyTime, owner, group);
    }
    
    
    // The default verification type is `COMPOSITE-CRC32C`
    private static void getFileCheckSum(FileSystem fs, Path path) throws IOException {
    FileChecksum checksum = fs.getFileChecksum(path);
    System.out.printf("path %s, checkSumType: %s, checkSumCrcVal: %d\\n",
    path, checksum.getAlgorithmName(), ByteBuffer.wrap(checksum.getBytes()).getInt());
    }
    
    
    private static void copyFileFromLocal(FileSystem fs, Path chdfsPath, Path localPath) throws IOException {
    fs.copyFromLocalFile(localPath, chdfsPath);
    }
    
    
    private static void copyFileToLocal(FileSystem fs, Path chdfsPath, Path localPath) throws IOException {
    fs.copyToLocalFile(chdfsPath, localPath);
    }
    
    
    private static void renamePath(FileSystem fs, Path oldPath, Path newPath) throws IOException {
    fs.rename(oldPath, newPath);
    }
    
    
    private static void listDirPath(FileSystem fs, Path dirPath) throws IOException {
    FileStatus[] dirMemberArray = fs.listStatus(dirPath);
    
    
    for (FileStatus dirMember : dirMemberArray) {
    System.out.printf("dirMember path %s, fileLen: %d\\n", dirMember.getPath(), dirMember.getLen());
    }
    }
    
    
    // The recursive deletion flag is used to delete directories
    // If recursion is `false` and `dir` is not empty, the operation will fail
    private static void deleteFileOrDir(FileSystem fs, Path path, boolean recursive) throws IOException {
    fs.delete(path, recursive);
    }
    
    
    private static void closeFileSystem(FileSystem fs) throws IOException {
    fs.close();
    }
    
    
    public static void main(String[] args) throws IOException {
    // Initialize a file
    FileSystem fs = initFS();
    
    
    // Create a file
    Path chdfsFilePath = new Path("/folder/exampleobject.txt");
    createFile(fs, chdfsFilePath);
    
    
    // Read a file
    readFile(fs, chdfsFilePath);
    
    
    // Query a file or directory
    queryFileOrDirStatus(fs, chdfsFilePath);
    
    
    // Get a file checksum
    getFileCheckSum(fs, chdfsFilePath);
    
    
    // Copy a file from the local system
    Path localFilePath = new Path("file:///home/hadoop/ofs_demo/data/exampleobject.txt");
    copyFileFromLocal(fs, chdfsFilePath, localFilePath);
    
    
    // Get a file to the local system
    Path localDownFilePath = new Path("file:///home/hadoop/ofs_demo/data/exampleobject.txt");
    copyFileToLocal(fs, chdfsFilePath, localDownFilePath);
    
    
    // Rename
    Path newPath = new Path("/doc/example.txt");
    renamePath(fs, chdfsFilePath, newPath);
    
    
    // Delete a file
    deleteFileOrDir(fs, newPath, false);
    
    
    // Create a directory
    Path dirPath = new Path("/folder");
    mkdir(fs, dirPath);
    
    
    // Create a file in a directory
    Path subFilePath = new Path("/folder/exampleobject.txt");
    createFile(fs, subFilePath);
    
    
    // List directories
    listDirPath(fs, dirPath);
    
    
    // Deletes a directory
    deleteFileOrDir(fs, dirPath, true);
    
    
    // Close a file system
    closeFileSystem(fs);
    }
    }
    3. Compile and run.
    Note:
    Before running the code, please be sure to correctly set classpath, which must contain the paths of the Hadoop common package and the CHDFS package.
    For an EMR environment, if you follow the steps as detailed in Mounting CHDFS Instance, the Hadoop common package is generally in the /usr/local/service/hadoop/share/hadoop/common/ directory, and the CHDFS package is generally in the /usr/local/service/hadoop/share/hadoop/common/lib/ directory.
    Contact Us

    Contact our sales team or business advisors to help your business.

    Technical Support

    Open a ticket if you're looking for further assistance. Our Ticket is 7x24 avaliable.

    7x24 Phone Support