HDFS操作——使用 FileSystem api 读写数据
2016-04-05 11:27
651 查看
在 hadoop 的 HDFS 操作中,有个非常重要的 api,是 org.apache.hadoop.fs.FileSystem,
这是我们用户代码操作 HDFS 的直接入口,该类含有操作 HDFS 的各种方法,类似于 jdbc 中
操作数据库的直接入口是 Connection 类。
那我们怎么获得一个 FileSystem 对象哪?
以上代码中,要注意调用的是 FileSystem 的静态方法 get,传递两个值给形式参数,第
一个访问的 HDFS 地址,该地址的协议是 hdfs,ip 是 192.168.1.240,端口是 9000.。这个地
址的完整信息是在配置文件 core-site.xml 中指定的,读者可以使用自己环境的配置文件中的
设置。第二个参数是一个配置对象。
图1
我们在 HDFS 的根目录下创建文件夹,代码如下
以上代码中,我们决定创建的文件夹完整路径是“/d1” 。第二行代码是使用方法 exitst
判断文件夹是否存在;如果不存在,执行创建操作。创建文件夹,调用的是 mkdirs 方法,
返回值是布尔值,如果是 true,表示创建成功;如果是 false,表示创建失败。
现在查看一下是否成功了,如图2,可见创建成功了。
图2
第一行代码表示创建的文件是在刚才创建的 d1 文件夹下的文件 f1;
第二行是调用 create 方法创建一个通向 HDFS 的输出流;
第三行是通过调用 hadoop 的一个工具类 IOUtils 的静态方法 copyBytes 把一个字符串发
送给输出流中。该静态方法有四个参数,第一个参数输入流,第二个参数是输出流,第三个
参数是配置对象,第四个参数是布尔值,如果是 true 表示数据传输完毕后关闭流。
现在看一下是否创建成功了,如图3所示。
图 3
final String pathString = “/d1/f1”;
final FSDataInputStream fsDataInputStream = fs.open(new Path(pathString));
IOUtils.copyBytes(fsDataInputStream, System.out, configuration, true);
第二行表示调用方法 open 打开一个指定的文件,返回值是一个通向该文件的输入流;
第三行还是调用 IOUtils.copyBytes 方法,输出的目的地是控制台。见图 4
图4
调用listStatus方法会得到一个指定路径下的所有文件和文件夹,每一个用FileStatus表示。我
们使用for循环显示每一个FileStatus对象。FileStatus对象表示文件的详细信息,里面含有类型、
副本数、权限、长度、路径等很多信息,我们只是显示了一部分。结果如图5所示。
图5
第三行代码表示删除文件“/d1/f1” ,注释掉的第二行代码表示递归删除目录“/d1”及
下面的所有内容。
除了上面列出的 fs 的方法外,还有很多方法,请读者自己查阅 api。
这是我们用户代码操作 HDFS 的直接入口,该类含有操作 HDFS 的各种方法,类似于 jdbc 中
操作数据库的直接入口是 Connection 类。
那我们怎么获得一个 FileSystem 对象哪?
String uri = "hdfs://192.168.1.240:9000/"; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), configuration);
以上代码中,要注意调用的是 FileSystem 的静态方法 get,传递两个值给形式参数,第
一个访问的 HDFS 地址,该地址的协议是 hdfs,ip 是 192.168.1.240,端口是 9000.。这个地
址的完整信息是在配置文件 core-site.xml 中指定的,读者可以使用自己环境的配置文件中的
设置。第二个参数是一个配置对象。
1.创建文件夹
使用 HDFS 的 shell 命令查看一下根目录下的文件情况,如图1所示。图1
我们在 HDFS 的根目录下创建文件夹,代码如下
final String pathString = "/d1"; boolean exists = fs.exists(new Path(pathString)); if(!exists){ boolean result = fs.mkdirs(new Path(pathString)); System.out.println(result); }
以上代码中,我们决定创建的文件夹完整路径是“/d1” 。第二行代码是使用方法 exitst
判断文件夹是否存在;如果不存在,执行创建操作。创建文件夹,调用的是 mkdirs 方法,
返回值是布尔值,如果是 true,表示创建成功;如果是 false,表示创建失败。
现在查看一下是否成功了,如图2,可见创建成功了。
图2
2.写文件
我们可以向 HDFS 写入文件,代码如下:final String pathString = "/d1/f1"; final FSDataOutputStream fsDataOutputStream = fs.create(new Path(pathString)); IOUtils.copyBytes(new ByteArrayInputStream("my name is ## ##".getBytes()), fsDataOutputStream, configuration, true);
第一行代码表示创建的文件是在刚才创建的 d1 文件夹下的文件 f1;
第二行是调用 create 方法创建一个通向 HDFS 的输出流;
第三行是通过调用 hadoop 的一个工具类 IOUtils 的静态方法 copyBytes 把一个字符串发
送给输出流中。该静态方法有四个参数,第一个参数输入流,第二个参数是输出流,第三个
参数是配置对象,第四个参数是布尔值,如果是 true 表示数据传输完毕后关闭流。
现在看一下是否创建成功了,如图3所示。
图 3
3. 读文件
现在我们把刚才写入到 HDFS 的文件“/d1/f1”读出来,代码如下:final String pathString = “/d1/f1”;
final FSDataInputStream fsDataInputStream = fs.open(new Path(pathString));
IOUtils.copyBytes(fsDataInputStream, System.out, configuration, true);
第二行表示调用方法 open 打开一个指定的文件,返回值是一个通向该文件的输入流;
第三行还是调用 IOUtils.copyBytes 方法,输出的目的地是控制台。见图 4
图4
4. 查看目录列表和文件详细信息
我们可以把根目录下的所有文件和目录显示出来,代码如下:final String pathString = "/"; final FileStatus[] listStatus = fs.listStatus(new Path(pathString)); for (FileStatus fileStatus : listStatus) { final String type = fileStatus.isDir()?"目录":"文件"; final short replication = fileStatus.getReplication(); final String permission = fileStatus.getPermission().toString(); final long len = fileStatus.getLen(); final Path path = fileStatus.getPath(); System.out.println(type+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path); }
调用listStatus方法会得到一个指定路径下的所有文件和文件夹,每一个用FileStatus表示。我
们使用for循环显示每一个FileStatus对象。FileStatus对象表示文件的详细信息,里面含有类型、
副本数、权限、长度、路径等很多信息,我们只是显示了一部分。结果如图5所示。
图5
5. 删除文件或目录
我们可以删除某个文件或者路径,代码如下final String pathString = "/d1/f1"; //fs.delete(new Path("/d1"), true); fs.deleteOnExit(new Path(pathString));
第三行代码表示删除文件“/d1/f1” ,注释掉的第二行代码表示递归删除目录“/d1”及
下面的所有内容。
除了上面列出的 fs 的方法外,还有很多方法,请读者自己查阅 api。
相关文章推荐
- 别老扯什么Hadoop了,你的数据根本不够大!
- HDFS的备份机制
- HDFS 与 GFS 的设计差异
- hdfs sync 再次重构
- HDFS常用文件操作命令及注意事项
- flume的hdfssink自定义EventSerializer序列化类
- Hive外部分区表加载flume打到hdfs上文件,读不到.tmp文件
- 将Hdfs数据往Hbase表中导入
- 一 梳理 从 HDFS 到 MR。
- flume实现kafka到hdfs实时数据采集 - 有负载均衡策略
- 基于Docker快速搭建多节点Hadoop集群
- HDFS原理分析(u)
- Flume中的HDFS Sink配置参数说明
- spark解决方案系列--------1.spark-streaming实时Join存储在HDFS大量数据的解决方案
- 是否要用Hadoop
- HDFS块检查命令Fsck机理的分析
- hdfs文件的操作常用命令
- HDFS集群系统的状况查看命令的返回情况
- hadoop上传文件功能实例代码
- hdfs 常用命令