HDFS文件系统的操作_Hadoop,ERP及大数据讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Hadoop,ERP及大数据讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3001 | 回复: 1   主题: HDFS文件系统的操作        上一篇   下一篇 
水云间山水
注册用户
等级:中士
经验:223
发帖:2
精华:0
注册:2016-2-17
状态:离线
发送短消息息给水云间山水 加好友    发送短消息息给水云间山水 发消息
发表于: IP:您无权察看 2016-3-30 16:29:39 | [全部帖] [楼主帖] 楼主


HDFS是一种文件系统,存储着Hadoop应用将要处理的数据,类似于普通的Unix和linux文件系统,不同的是他是实现了google的GFS文件系统的思想,是适用于大规模分

布式数据处理相关应用的、可扩展的分布式文件系统。它有以下优点:


1、在分布式存储中,经常会出现节点失效的情况,HDFS可以持续监视,错误检查,容错处理,自动恢复;


2、分布式存储的文件都是非常巨大的,HDFS重新规定了每次I/O的块的大小;


3、对于搜索引擎的业务,大部分都只会在文件尾添加新数据,很少修改已有数据,HDFS做了优化;


4、与应用一起设计的文件系统API对整个系统的弹性和适用性有很大好处;


5、有效的支持多个客户端并行添加同一个文件。


虽然HDFS实现了这么多的功能,但是因为它已经实现为一个开源框架,所以对于程序开发者来说,并不需要了解其底层的文件操作,我们可以通过其提供的一套与

linux文件命令类似的命令行工具来进行文件操作。


基本文件命令:


格式为:hadoop fs -cmd <args>


cmd的命名通常与unix对应的命令名相同。例如,文件列表命令: hadoop fs -ls


1、添加目录和文件


HDFS有一个默认的工作目录 /user/$USER,其中$USER是你的登录用户名。不过目录不会自动建立,我们现在用mkdir建立它,我使用的是jared作为用户名。

hadoop fs -mkdir /user/jared


(hadoop的mkdir命令会自动创建父目录,类似于带-p的unix命令)


我们现在放本地文件系统的一个文件进去。

hadoop fs -put example.txt .


最后一个参数是句点,相当于放入了默认的工作目录,等价于 hadoop fs -put example.txt /user/jared


当你把文件放入HDFS上后,你就可以运行Hadoop程序来处理它。


2、检索文件


get命令与put命令相反,它从HDFS复制文件回到本地文件系统。


hadoop fs -get example.txt .

复制到本地的当前工作目录中。


另一种是显示数据,用cat

hadoop fs -cat example.txt


3、删除文件


rm命令

hadoop fs -rm example.txt


也可以用来删除空目录


编程读写HDFS


利用HDFS给我们提供的API,我们同样可以访问它。


在Hadoop中用作文件操作的主类位于org.apache.hadoop.fs软件包中。包括常见的open、read、write、close。Hadoop文件的API起点是FileSystem类,这是一个与文

件系统交互的抽象类,我们通过调用factory的方法FileSystem.get(Configuration conf)来取得所需的FileSystem实例,如下我们可以获得与HDFS接口的FileSystem

对象:


Configuration conf = new Configuration();


FileSystem hdfs = FileSystem.get(conf);//获得HDFS的FileSystem对象


如果我们要实现HDFS与本地文件系统的交互,我们还需要获取本地文件系统的FileSystem对象


FileSystem local = FileSystem.getLocal(conf);//获得本地文件系统的FileSystem对象


以下代码讲解了一个例子,我们开发一个PutMerge程序,用于合并本地文件后放入HDFS,因为大文件HDFS处理起来比较容易,所以这个程序经常会在以后的开发中用到


import java.io.IOException;  

import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.fs.FSDataInputStream;  
import org.apache.hadoop.fs.FSDataOutputStream;  
import org.apache.hadoop.fs.FileStatus;  
import org.apache.hadoop.fs.FileSystem;  
import org.apache.hadoop.fs.Path; 
 
public class PutMerge {  

   public static void main(String[] args) throws IOException { 
    
Configuration conf = new Configuration();  
FileSystem hdfs =FileSystem.get(conf); //获得HDFS文件系统的对象  
FileSystem local = FileSystem.getLocal(conf);//获得本地文件系统的对象 
 
Path inputDir = new Path(args[0]);//设定输入目录  
Path hdfsFile = new Path(args[1]);//设定输出目录  

try{  
  FileStatus[] inputFiles = local.listStatus(inputDir);//FileStatus的listStatus()方法获得一个目录中的文件列表  
  
           FSDataOutputStream out = hdfs.create(hdfsFile);//生成HDFS输出流  
           for(int i = 0; i < inputFiles.length; i ++){  
      System.out.println(inputFiles[i].getPath().getName());  
      
    FSDataInputStream in = local.open(inputFiles[i].getPath());//打开本地输入流  
    byte[] buffer = new byte[256];  
    int bytesRead = 0;  
    while((bytesRead = in.read(buffer))>0){  
        out.write(buffer,0,bytesRead);//通过一个循环来写入  
    }  
    in.close();  
        }  
        out.close();  
        
    }catch (IOException e) {  
e.printStackTrace();  
    }  
}










赞(0)    操作        顶端 
花花公子
注册用户
等级:下士
经验:175
发帖:2
精华:0
注册:2016-2-17
状态:离线
发送短消息息给花花公子 加好友    发送短消息息给花花公子 发消息
发表于: IP:您无权察看 2016-4-1 16:01:45 | [全部帖] [楼主帖] 2  楼

好帖子,别沉啊



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论