Java API操作HDFS

HDFS是存储数据的分布式文件系统,对HDFS的操作,就是对文件系统的操作,除了用HDFS的shell命令对文件系统进行操作,我们也可以利用Java API对文件系统进行操作,比如文件的创建、删除、修改权限等等,还有文件夹的创建、删除、重命名等等。

使用Java API对文件系统进行操作主要涉及以下几个类:

1.Configuration类:该类的对象封装了客户端或者服务端的配置。

2.FileSystem类:该类的对象是一个文件系统对象,可以利用该对象的一些方法来对文件进行操作,FileSystem是一个抽象,不能通过new来获取对象,应该通过Filesystem的静态方法get()来获取:

[java] view plain copy

  1. //创建URI对象
  2. //PATH = "hdfs://liaozhongmin:9000/";
  3. URI uri = new URI(PATH);
  4. //获取文件系统
  5. FileSystem fileSystem = FileSystem.get(uri, new Configuration());

3.FSDataInputStream和FSDataOutputStream:这两个类是HDFS中的输入输出流。分别通过FileSystem的open()方法和create()方法获得。

在使用Java API 操作HDFS之前,首先要保证hadoop是正常启动的,可以通过jps命令来查看hadoop的进程是否全部启动,如下图:

注:如上图所示,使用jps命令可以看到Hadoop的五个进程即NameNode、DataNode、SecondaryNameNode、TaskTrackers、JobTracker启动了,就表示hadoop启动成功了。

下面是关于Java API操作HDFS文件系统的常用工具类:

[java] view plain copy

  1. public class FileSystemUtil {
  2. //定义HDFS的路径
  3. private static final String PATH = "hdfs://liaozhongmin:9000/";
  4. /**
  5. * 获取文件系统FileSystem
  6. * @return
  7. */
  8. public static FileSystem getFileSystem(){
  9. try {
  10. //创建URI对象
  11. //PATH = "hdfs://liaozhongmin:9000/";
  12. URI uri = new URI(PATH);
  13. //获取文件系统
  14. FileSystem fileSystem = FileSystem.get(uri, new Configuration());
  15. return fileSystem;
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. return null;
  20. }
  21. /**
  22. * 创建文件夹
  23. * @param fileSystem
  24. */
  25. public static void mkdir(FileSystem fileSystem,String path){
  26. try {
  27. //创建Path对象
  28. Path srcPath = new Path(path);
  29. //通过文件系统对象创建文件夹
  30. fileSystem.mkdirs(srcPath);
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. } finally{
  34. try {
  35. fileSystem.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. /**
  42. * 创建新文件
  43. * @param dst
  44. * @param contents
  45. */
  46. public static void createFile(String dst,byte[] contents){
  47. //定义文件系统
  48. FileSystem fileSystem = null;
  49. //定义输出流
  50. FSDataOutputStream outputStream = null;
  51. try {
  52. //获取文件系统
  53. fileSystem = FileSystemUtil.getFileSystem();
  54. //创建一个目标路径
  55. Path path = new Path(dst);
  56. //创建文件
  57. outputStream = fileSystem.create(path);
  58. //写数据
  59. outputStream.write(contents);
  60. System.out.println("文件创建成功!");
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. } finally{
  64. //关闭
  65. try {
  66. fileSystem.close();
  67. outputStream.close();
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. }
  73. /**
  74. * 向文件系统中上传本地数据
  75. * @param fileSystem
  76. */
  77. public static void putData(FileSystem fileSystem,String src,String dst){
  78. try {
  79. //创建原路径Path对象
  80. Path srcPath = new Path(src);
  81. //创建目标路径Path对象
  82. Path dstPath = new Path(dst);
  83. //调用文件系统的文件爱你复制函数,前面的参数是指是否删除源文件,true为删除,否则不删除
  84. fileSystem.copyFromLocalFile(false, srcPath, dstPath);
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. } finally{
  88. //关闭文件系统
  89. try {
  90. fileSystem.close();
  91. } catch (IOException e) {
  92. e.printStackTrace();
  93. }
  94. }
  95. }
  96. /**
  97. * 文件重命名
  98. * @param oldName 旧名字
  99. * @param newName 新名字
  100. */
  101. public static void rename(FileSystem fileSystem,String oldName,String newName){
  102. try {
  103. //创建旧文件的Path对象
  104. Path oldPath = new Path(oldName);
  105. Path newPath = new Path(newName);
  106. //重命名
  107. fileSystem.rename(oldPath, newPath);
  108. } catch (Exception e) {
  109. e.printStackTrace();
  110. } finally{
  111. try {
  112. fileSystem.close();
  113. } catch (IOException e) {
  114. e.printStackTrace();
  115. }
  116. }
  117. }
  118. /**
  119. * 下载文件
  120. * @param fileSystem
  121. * @param fileName
  122. */
  123. public static void getData(FileSystem fileSystem,String src,String dst){
  124. try {
  125. //创建Path对象
  126. Path path = new Path(src);
  127. //通过path构建文件系统的输入流
  128. FSDataInputStream in = fileSystem.open(path);
  129. //构建文件
  130. File file = new File(dst);
  131. if (!file.exists()){
  132. file.createNewFile();
  133. }
  134. //构建输出流
  135. FileOutputStream fileOutputStream = new FileOutputStream(file);
  136. //下载
  137. IOUtils.copyBytes(in, fileOutputStream, 1024, true);
  138. } catch (IOException e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. /**
  143. * 遍历文件系统中的某个目录
  144. * @param fileSystem
  145. */
  146. public static void listFile(FileSystem fileSystem,String path){
  147. try {
  148. //调用listStatus()方法获取一个文件数组
  149. FileStatus[] listStatus = fileSystem.listStatus(new Path(path));
  150. //循环遍历
  151. for (FileStatus fileStatus : listStatus){
  152. //判断是否为目录
  153. String isDir = fileStatus.isDir()?"是文件夹":"是文件";
  154. //获取文件的权限
  155. String permission = fileStatus.getPermission().toString();
  156. //获取备份
  157. short replication = fileStatus.getReplication();
  158. //获取数组的长度
  159. long len = fileStatus.getLen();
  160. //获取文件的路径
  161. String filePath = fileStatus.getPath().toString();
  162. //打印数据
  163. System.out.println("isDir:" +isDir + "\npermission:" + permission + "\nreplication:" + replication+ "\nlen:" + len + "\nfilepath:" + filePath);
  164. }
  165. } catch (IOException e) {
  166. e.printStackTrace();
  167. }
  168. }
  169. /**
  170. * 删除文件
  171. * @param fileSystem
  172. */
  173. public static void remove(FileSystem fileSystem,String filePath){
  174. try {
  175. //创建path对象
  176. Path path = new Path(filePath);
  177. //通过文件系统进行删除,第二个参数设置为true时才可以删除为目录的文件,否则的话如果是目录而不是文件就会报错的
  178. fileSystem.delete(path, true);
  179. } catch (IOException e) {
  180. e.printStackTrace();
  181. }
  182. }
  183. /**
  184. * 工具类的测试
  185. * @param args
  186. */
  187. public static void main(String[] args) {
  188. //创建文件系统
  189. FileSystem fileSystem = getFileSystem();
  190. //创建文件夹
  191. //FileSystemUtil.mkdir(fileSystem, "/myDir");
  192. //创建文件并写入内容
  193. //byte[] contents = "我爱你".getBytes();
  194. //FileSystemUtil.createFile("/myDir/liao.txt", contents);
  195. //文件重命名
  196. //FileSystemUtil.rename(fileSystem, "/myDir/liao.txt", "/myDir/liao_bak");
  197. //上传文件
  198. //FileSystemUtil.putData(fileSystem, "D:\\Android\\test.txt", "/myDir");
  199. //下载文件
  200. //FileSystemUtil.getData(fileSystem, "/myDir/test.txt", "D:\\test.txt");
  201. //遍历文件系统的某个目录
  202. //FileSystemUtil.listFile(fileSystem, "/");
  203. //删除文件
  204. FileSystemUtil.remove(fileSystem, "/dir/liaozhongmin.txt");
  205. }
  206. }

注:远程文件系统的路径,请自行在hadoop/conf/core-site.xml文件中配置:

[html] view plain copy

    1. <?xml version="1.0"?>
    2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    3. <!-- Put site-specific property overrides in this file. -->
    4. <configuration>
    5. <property>
    6. <name>fs.default.name</name>
    7. <!--文件系统的路径-->
    8. <value>hdfs://liaozhongmin:9000</value>
    9. </property>
    10. <property>
    11. <name>hadoop.tmp.dir</name>
    12. <!--文件保存的位置(上传后以块的形式保存)-->
    13. <value>/usr/local/hadoop/tmp</value>
    14. </property>
    15. </configuration>
时间: 2024-12-04 20:07:48

Java API操作HDFS的相关文章

Hadoop读书笔记(三)Java API操作HDFS

Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的shell操作:http://blog.csdn.net/caicongyang/article/details/41253927 JAVA URL 操作HDFS OperateByURL.java package hdfs; import java.io.InputStream; import jav

使用Java API操作hdfs

如题 我就是一个标题党  就是使用JavaApi操作HDFS,使用的是MAVEN,操作的环境是Linux 首先要配置好Maven环境,我使用的是已经有的仓库,如果你下载的jar包 速度慢,可以改变Maven 下载jar包的镜像站改为 阿里云. 贴一下  pom.xml 使用到的jar包 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifa

java API 操作HDFS服务器

1.准备 开发环境:eclipse 依赖包:hadoop-2.7.7.tar.gz安装包 share/hadoop/下 common.hdfs中的jar包 2.连接HDFS服务器 /** * 连接HDFS服务器 */ @Test public void connectHDFS() { //做一个配置 Configuration conf = new Configuration(); //服务器地址 端口 conf.set("fs.defaultFS", "hdfs://192

HDFS基础和java api操作

1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS将客户端的大文件存放在很多节点的数据块中,Block本质上是一个逻辑概念,它是hdfs读写数据的基本单位) HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间 2. fs 可以使用hdfs shell操作hdfs,常用 fs命令如下: eg: hadoop fs -cat fi

使用java api操作Hadoop文件 Robbin

1 package cn.hadoop.fs; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.URI; 6 import java.net.URISyntaxException; 7 8 import org.apache.hadoop.conf.Configuration; 9 import org.apache.hadoop.fs.FSDataOutputStream; 10 i

Java API 读取HDFS目录下的所有文件

/** * 获取1号店生鲜食品的分类id字符串 * @param filePath * @return */ public String getYHDSXCategoryIdStr(String filePath) { final String DELIMITER = new String(new byte[]{1}); final String INNER_DELIMITER = ","; // 遍历目录下的所有文件 BufferedReader br = null; try { F

Java API 读取HDFS的单文件

HDFS上的单文件: -bash-3.2$ hadoop fs -ls /user/pms/ouyangyewei/data/input/combineorder/repeat_rec_category Found 1 items -rw-r--r-- 2 deploy supergroup 520 2014-08-14 17:03 /user/pms/ouyangyewei/data/input/combineorder/repeat_rec_category/repeatRecCategor

hive-通过Java API操作

通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 1 package org.admln.hive; 2 3 import java.sql.SQLException; 4 import java.sql.Connection; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 import java.sql.DriverManager; 8 9 public class testHiv

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->