HDFS Java开发

搭建HDFS开发环境

1、导入Hadoop Jar包

2、建立resources文件夹,加配置文件(core-site.xml  hdfs-site.xml)

3、new Configuration 进行操作

 

Configuration cfg = new Configuration();

cfg.addResource();//添加新的资源配置文件

cfg.get(“fs.default.name”);

cfg.get(“myInt”, 123);

 

FileSystem抽象

建立文件/文件夹

    删除文件/文件夹

    读取文件

写入文件

修改文件/文件夹名字

移动/复制

 

看javadoc,操作和之前介绍的命令行很类似。

 

 

FileSystem fs = FileSystem.get(cfg); //根据配置得到文件系统

 

Path path = new Path(“a”); //如果以/开头表示绝对路径,否则相对

FSDataOutputStream fdos = fs.create(path); //根据路径创建文件 得到一个流  会递归创建

 

fs.create(path, 是否递归);

fs.create(path,复制几份);

fdos.close();

 

fdos.writeBytes();//写字节

 

fs.mkdirs(path); 创建目录 会递归

 

fs.delete(path, 是否递归);

 

fs.delete();

 

不支持随机修改  不支持并非修改 但支持追加

 

为了支持追加,需要配置:

hdfs-site.xml

<property>

<name>dfs.support.append</name>

<value>true</value>

</property>

 

Path path = new Path(“路径”);

FSDataIOutputStream fdos = fs.append(path); //追加

fdos.write……即可

fdos.flush();//刷出数据

 

  1. public class AppendContent {  
  2.         public static void main(String[] args) {  
  3.             String hdfs_path = "hdfs://mycluster/home/wyp/wyp.txt";//文件路径  
  4.             Configuration conf = new Configuration();  
  5.             conf.setBoolean("dfs.support.append", true);  
  6.        
  7.             String inpath = "/home/wyp/append.txt";  
  8.             FileSystem fs = null;  
  9.             try {  
  10.                 fs = FileSystem.get(URI.create(hdfs_path), conf);  
  11.                 //要追加的文件流,inpath为文件  
  12.                 InputStream in = new  
  13.                       BufferedInputStream(new FileInputStream(inpath));  
  14.                 OutputStream out = fs.append(new Path(hdfs_path));  
  15.                 IOUtils.copyBytes(in, out, 4096, true);  
  16.             } catch (IOException e) {  
  17.                 e.printStackTrace();  
  18.             }  
  19.         }  
  20.     }

 

FSDataInputStream fdis = fs.open(path);

 

Text line = new Text();

LineReader reader = new LineReader(fdis); //一行一行的读

 

while(reader.readLine(line) > 0) {

         System.out.println(line);//输出

}

 

fdis.close();

 

 

fs.rename(oldPath, newPath); //重命名

 

 

复制:

Path localPath = new Path(……);

Path hdfsPath = new Path(……);

fs.copyFromLocalFile (localPath, hdfsPath); 默认不删除本地 不覆盖hdfs

fs.copyFromLocalFile (false, localPath, hdfsPath);  false表示不删除local的

 

fs.copyFromLocalFile (false,false, localPath, hdfsPath);  false表示不删除local的 也不覆盖

 

同理 还有一个copyToLocalFile 复制hdfs到本地,API完全类似

Path localPath = new Path(……);

Path hdfsPath = new Path(……);

fs. copyToLocalFile(hdfsPath, localPath);  默认不删除hdfs不覆盖本地

fs. copyToLocalFile(false, hdfsPath, localPath);  false表示不删除local的

 

fs. copyToLocalFile(false,false, localPath, hdfsPath);  false表示不删除local的 也不覆盖

 

 

移动(一定先删除老的 再移动)

Path localPath = new Path(……);

Path hdfsPath = new Path(……);

fs.moveFromLocalFile (localPath, hdfsPath);

 

fs.moveFormLocalFile(Path数组, hdfs目录);

 

同理 还有一个moveToLocalFile移动hdfs到本地,API完全类似

Path localPath = new Path(……);

Path hdfsPath = new Path(……);

fs.moveToLocalFile (hdfsPath, localPath);

 

fs. moveToLocalFile (hdfs目录数组, 本地目录);

 

其他

fs.getDefaultBlockSize() 得到默认的block块大小

 

fs.getUri()   hdfs的路径

 

fs.getDefaultReplication()  备份数量

 

fs.getWorkingDirectory 默认工作目录uri

 

fs.getHomeDirectory

 

 

fs.listStatus(hdfs目录); 得到当前目录下所有文件/文件夹信息

 

 

Path path = new Path(……);

path.depth();//深度

path.getParent();//父亲

 

FileUtil API详解

FileUtil fileUtil = new FileUtil();

 

fileUtil.copy(本地文件, FileSystem, hdfs Path, 是否删除源, Configuration); //从本地到HDFS

fileUtil.copy(FileSystem, hdfs Path, 本地文件, 是否删除源, Configuration);//从HDFS到本地

还可以从一个HDFS到另一个HDFS

fileUtil.copy(源FileSystem, 源Path, 目标FileSystem, 目标Path, 是否删除源,  Configuration)

 

合并目录(很不错,java里没这样的东西)

FileUtil.copyMerge(源FileSystem, 源Path, 目标FileSystem, 目标Path, 是否删除源,  Configuration, “备注”)

 

fileUtil.fullyDelete(new File(“……”)); //本地的完全删除

猜你喜欢

转载自blog.csdn.net/qq_40784783/article/details/79052594