初步接触HDFS

        初步接触HDFS,搭建了一个Hadoop2.6 HA,实现了一些基本的操作:通过JAVA客户端往HDFS写文件,和从HDFS读取文件。直接贴代码,记录一下。

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
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 org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.apache.hadoop.io.IOUtils;
public class HDFSTest {
public static void main(String args[]) throws IOException{
        FileSystem fs = contentHDFS();
        Path path = new Path("/root/test/test1.txt");
        String str = "哈哈哈哈";
        
        printNodes(fs);//打印集群节点
        createFile(fs, str, path);//新建文件
        
        readByBuffer(fs, path);//读取文件
        
        printFileList(fs,"/root/test");//打印某目录下所有文件名称
        
}
/**
 * 连接HDFS服务器
 * @return
 * @throws IOException
 */
public static FileSystem contentHDFS() throws IOException{
Configuration conf = new Configuration(); 
        conf.set("fs.defaultFS", "hdfs://cluster1");
        conf.set("dfs.nameservices", "cluster1");
        conf.set("dfs.ha.namenodes.cluster1", "nna,nns");
        conf.set("dfs.namenode.rpc-address.cluster1.nna", "192.168.0.100:9000");
        conf.set("dfs.namenode.rpc-address.cluster1.nns", "192.168.0.101:9000");           
    conf.set("dfs.client.failover.proxy.provider.cluster1","org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
        return FileSystem.get(conf);
}
/**
 * 打印集群节点
 * @param fileSys
 * @throws IOException
 */
public static void printNodes(FileSystem fileSys) throws IOException{
DistributedFileSystem hdfs = (DistributedFileSystem)fileSys;
DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
for(int i=0;i<dataNodeStats.length;i++){
System.out.println("DataNode_"+i+"_Name:"+dataNodeStats[i].getHostName());
}
}
/**
 * 打印某目录下所有文件名称
 * @param fileSys
 * @param pathString
 * @throws IOException
 */
public static void printFileList(FileSystem fileSys,String pathString) throws IOException{
FileStatus[] list = fileSys.listStatus(new Path(pathString));
for (FileStatus file : list) {
System.out.println(file.getPath().getName());
}
}
/**
 * 写文件
 * @param fs
 * @param str
 * @param path
 * @throws IllegalArgumentException
 * @throws IOException
 */
public static void createFile(FileSystem fs,String str,Path path) throws IllegalArgumentException, IOException{
Long start = System.currentTimeMillis();
byte[] content = str.getBytes("UTF-8");
System.out.println("文本大小:"+content.length);
InputStream is = new ByteArrayInputStream(content);
        //创建一个指向HDFS目标文件的输出流 
        OutputStream out = null;
        if(fs.exists(path)){
        out = fs.append(path);
        }else{
        out = fs.create(path);
        }
        //用IOUtils工具将文件从本地文件系统复制到HDFS目标文件中 
        IOUtils.copyBytes(is, out, 4096,true);
        System.out.println("写入文件耗时:"+(System.currentTimeMillis()-start));
}
/**
 * 读取文件
 * @param fs
 * @param path
 * @throws IOException
 */
public static void readByBuffer(FileSystem fs,Path path) throws IOException{
Long start = System.currentTimeMillis();
FSDataInputStream in = null;
in = fs.open(path);
FileStatus stat = fs.getFileStatus(path);
System.out.println("文件大小:"+stat.getLen());
BufferedReader reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));   
        StringBuilder sb = new StringBuilder();   
        String line = null;   
        try {   
            while ((line = reader.readLine()) != null) {   
                sb.append(line + "\n");   
            }   
        } catch (IOException e) {   
            e.printStackTrace();   
        } finally {   
            try {
            reader.close();
            } catch (IOException e) { 
                e.printStackTrace();   
            }   
        }  
        System.out.println("readByBuffer耗时:"+(System.currentTimeMillis()-start));
        String str = sb.toString();
        System.out.println(str);
        
        IOUtils.closeStream(in);
}
}


你可能感兴趣的:(java,hdfs,JAVA操作HDFS文件)