利用JavaAPI访问HDFS的文件

body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}html, body{ }h1 { font-size:1.5em; font-weight:bold;}h2 { font-size:1.4em; font-weight:bold;}h3 { font-size:1.3em; font-weight:bold;}h4 { font-size:1.2em; font-weight:bold;}h5 { font-size:1.1em; font-weight:bold;}h6 { font-size:1.0em; font-weight:bold;}img { border:0; max-width: 100%;}blockquote { margin-top:0px; margin-bottom:0px;}table { border-collapse:collapse; border:1px solid #bbbbbb;}td { border-collapse:collapse; border:1px solid #bbbbbb;}
利用JavaAPI访问HDFS的文件

1、重读配置文件core-site.xml

要利用Java客户端来存取HDFS上的文件,不得不说的是配置文件hadoop-0.20.2/conf/core-site.xml了,最初我就是在这里吃了大亏,所以我死活连不上HDFS,文件无法创建、读取。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"
href="configuration.xsl"?>

<configuration>
<!--- global properties
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/zhangzk/hadoop</value>
<description>A
base for other temporary
directories.</description>
</property>
<!-- file system
properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://linux-zzk-113:9000</value>
</property>
</configuration>

配置项:hadoop.tmp.dir表示命名节点上存放元数据的目录位置,对于数据节点则为该节点上存放文件数据的目录。

配置项:fs.default.name表示命名的IP地址和端口号,缺省值是file:///,对于JavaAPI来讲,连接HDFS必须使用这里的配置的URL地址,对于数据节点来讲,数据节点通过该URL来访问命名节点。

2、利用JavaAPI来访问HDFS的文件与目录

package
com.demo.hdfs;

import
java.io.BufferedInputStream;
import java.io.FileInputStream;
import
java.io.FileNotFoundException;
import java.io.FileOutputStream;
import
java.io.IOException;
import java.io.InputStream;
import
java.io.OutputStream;
import java.net.URI;

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;
import
org.apache.hadoop.io.IOUtils;
import
org.apache.hadoop.util.Progressable;

/**
 * @author zhangzk
 *

 */
public class FileCopyToHdfs {

public static void main(String[]
args) throws Exception {
  try
{
   //uploadToHdfs();   
   //deleteFromHdfs();
   //getDirectoryFromHdfs();
   appendToHdfs();
   readFromHdfs();
  }
catch (Exception e) {
   // TODO Auto-generated catch
block
   e.printStackTrace();
  }
  finally
  {
   System.out.println("SUCCESS");
  }
 }

/**上传文件到HDFS上去*/

private static void uploadToHdfs()
throws FileNotFoundException,IOException {
  String localSrc =
"d://qq.txt";
  String dst =
"hdfs://192.168.0.113:9000/user/zhangzk/qq.txt";
  InputStream in =
new BufferedInputStream(new
FileInputStream(localSrc));
  Configuration conf = new
Configuration();
  
  FileSystem fs =
FileSystem.get(URI.create(dst), conf);
  OutputStream out =
fs.create(new Path(dst), new Progressable() {
   public void
progress()
{
    System.out.print(".");
   }
  });
  IOUtils.copyBytes(in,
out, 4096, true);
 }

/**从HDFS上读取文件*/
 private
static void readFromHdfs() throws FileNotFoundException,IOException
{
  String dst =
"hdfs://192.168.0.113:9000/user/zhangzk/qq.txt";  
  Configuration
conf = new Configuration();  
  FileSystem fs =
FileSystem.get(URI.create(dst), conf);
  FSDataInputStream
hdfsInStream = fs.open(new
Path(dst));
  
  OutputStream out = new
FileOutputStream("d:/qq-hdfs.txt");
  byte[] ioBuffer = new
byte[1024];
  int readLen = hdfsInStream.read(ioBuffer);

while(-1 !=
readLen){
  out.write(ioBuffer, 0,
readLen);  
  readLen =
hdfsInStream.read(ioBuffer);
  }
  out.close();
  hdfsInStream.close();
  fs.close();
 }

/**以append方式将内容添加到HDFS上文件的末尾;注意:文件更新,需要在hdfs-site.xml中添<property><name>dfs.append.support</name><value>true</value></property>*/
 private
static void appendToHdfs() throws FileNotFoundException,IOException
{
  String dst =
"hdfs://192.168.0.113:9000/user/zhangzk/qq.txt";  
  Configuration
conf = new Configuration();  
  FileSystem fs =
FileSystem.get(URI.create(dst),
conf);  
  FSDataOutputStream out = fs.append(new
Path(dst));

int readLen = "zhangzk add by
hdfs java api".getBytes().length;

while(-1 !=
readLen){
  out.write("zhangzk add by hdfs java api".getBytes(), 0,
readLen);
  }
  out.close();
  fs.close();
 }

/**从HDFS上删除文件*/
 private
static void deleteFromHdfs() throws FileNotFoundException,IOException
{
  String dst =
"hdfs://192.168.0.113:9000/user/zhangzk/qq-bak.txt";  
  Configuration
conf = new Configuration();  
  FileSystem fs =
FileSystem.get(URI.create(dst), conf);
  fs.deleteOnExit(new
Path(dst));
  fs.close();
 }

/**遍历HDFS上的文件和目录*/
 private
static void getDirectoryFromHdfs() throws FileNotFoundException,IOException
{
  String dst =
"hdfs://192.168.0.113:9000/user/zhangzk";  
  Configuration
conf = new Configuration();  
  FileSystem fs =
FileSystem.get(URI.create(dst), conf);
  FileStatus fileList[] =
fs.listStatus(new Path(dst));
  int size =
fileList.length;
  for(int i = 0; i < size;
i++){
  System.out.println("name:" +
fileList[i].getPath().getName() + "/t/tsize:" +
fileList[i].getLen());
  }
  fs.close();
 }

}

注意:对于append操作,从hadoop-0.21版本开始就不支持了,关于Append的操作可以参考Javaeye上的一篇文档。

http://dongyajun.javaeye.com/blog/643391

来自为知笔记(Wiz)

时间: 2025-01-04 16:28:59

利用JavaAPI访问HDFS的文件的相关文章

【hadoop】使用javaAPI对hdfs进行文件操作

前提:1.搭建好hadoop伪分布式环境:2.安装好eclipse: 注:修改 /etc/hosts 添加 “本机IP hadoop01” , 那么代码中创建hdfs文件系统的时候的URI hdfs://hadoop01:9000 相当于  hdfs://hadoop服务器ip(例如:192.168.1.1XX):9000 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExcep

http访问hdfs文件的调研

1. HTTPFS: 基于HTTP操作hadoop hdfs文件系统 http://my.oschina.net/cloudcoder/blog/277426 2. 利用JavaAPI访问HDFS的文件     http://blog.csdn.net/zhangzhaokun/article/details/5597433

Hadoop HDFS (3) JAVA访问HDFS之二 文件分布式读写策略

先把上节未完成的部分补全,再剖析一下HDFS读写文件的内部原理 列举文件 FileSystem(org.apache.hadoop.fs.FileSystem)的listStatus()方法可以列出一个目录下的内容. public FileStatus[] listStatus(Path f) throws FileNotFoundException, IOException; public FileStatus[] listStatus(Path[] files) throws FileNot

熟练掌握HDFS的Shell访问和JavaAPI访问

HDFS设计的主要目的是对海量数据进行处理,也就是说在其上能够储存很大量文件(可以储存TB级的文件).HDFS将这些文件分割之后,储存在不同的DataNode上,HDFS提供了两种数据访问接口:Shell接口和javaAPI接口,对HDFS里面的文件进行操作. Shell接口  HDFS处理文件的命令和linux命令基本相同,这里区分大小写.下面介绍HDFS操作分布式文件系统的命令. HDFS基本命令 hadoop fs -cmd  其中cmd:具体的操作,基本上与unix的命令相同 args:

几种访问HDFS文件的客户端的总结

HDFS是英文Hadoop Distributed File System的缩写,中文翻译为Hadoop分布式文件系统,它是实现分布式存储的一个系统,所以分布式存储有的特点,HDFS都会有,HDFS的架构图: 上图中HDFS的NameNode其实就是对应着分布式存储的Storage master,主要是用来存储元数据的,根据这些元数据就可以管理所有的机器节点和数据块 HDFS的DataNodes其实就是对应着分布式存储的Storage slaves,主要就是真正存储数据的 在HDFS中,一个大文

HDFS简介及用C语言访问HDFS接口操作实践

一.概述 近年来,大数据技术如火如荼,如何存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有非常广泛的应用. Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是Hadoop项目的核心子项目,是一种具有高容错性.高可靠性.高可扩展性.高吞吐量等特征的分

Hadoop HDFS (3) JAVA访问HDFS

现在我们来深入了解一下Hadoop的FileSystem类.这个类是用来跟Hadoop的文件系统进行交互的.虽然我们这里主要是针对HDFS,但是我们还是应该让我们的代码只使用抽象类FileSystem,这样我们的代码就可以跟任何一个Hadoop的文件系统交互了.在写测试代码时,我们可以用本地文件系统测试,部署时使用HDFS,只需配置一下,不需要修改代码了. 在Hadoop 1.x以后的版本中引入了一个新的文件系统接口叫FileContext,一个FileContext实例可以处理多种文件系统,而

【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

转载自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括,如果你的项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台,这时候你的上架时候是个不确定的时候,具体什么时候能上架,主要跟平台有关,你再着急,也没有用的. 那么如果你的项目是使用脚本语言进行

HDFS小文件合并问题的优化:copyMerge的改进

1.问题分析 用fsck命令统计 查看HDFS上在某一天日志的大小,分块情况以及平均的块大小,即 [[email protected] jar]$ hadoop fsck /wcc/da/kafka/report/2015-01-11 DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command for it. 15/01/13 18:57:23 WARN ut