`
bat0906
  • 浏览: 27946 次
  • 性别: Icon_minigender_1
  • 来自: 第九天堂
社区版块
存档分类
最新评论

利用JavaAPI访问HDFS的文件

 
阅读更多

来自:http://blog.csdn.net/zhangzhaokun/article/details/5597433

 

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上的一篇文档。

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    利用javaAPI访问HDFS的文件

    ### 使用Java API访问HDFS文件的关键知识点 #### 一、HDFS概述 Hadoop Distributed File System(HDFS)是Apache Hadoop项目的核心组件之一,它为海量数据提供了高吞吐量的数据访问,非常适合大规模数据集的应用...

    hdfs java代码实现文件基础操作

    本教程将详细介绍如何利用Java API进行HDFS的基础操作,包括创建目录、上传文件、下载文件、删除文件、重命名文件以及列举文件等。 首先,进行HDFS操作前,我们需要在项目中引入Hadoop的相关依赖,通常是`hadoop-...

    java 从hadoop hdfs读取文件 进行groupby并显示为条形图

    Java API提供了访问HDFS的接口,例如`org.apache.hadoop.fs.FileSystem`类,可以用于读取、写入和管理文件系统中的文件。 2. **Hadoop MapReduce**:MapReduce是Hadoop用于并行处理和分析大数据的编程模型。在GROUP...

    HDFS两种操作方式:命令行和Java API

    本节将介绍 Linux 操作系统中关于 HDFS 文件操作的常用命令行,并将介绍利用 Hadoop 提供的 Java API 进行基本的文件操作,以及利用 Web 界面查看和管理 HDFS 的方法。 HDFS 常用命令 在 Linux 命令行终端,可以...

    Hadoop系统应用之java-API对HDFS的操作实验缺少的两个文件

    在这个实验中,我们关注的是如何使用Java API来操作HDFS,而提到的"winutils&hadoop.dll"文件对于Windows环境下配置Hadoop环境至关重要。 首先,让我们了解HDFS Java API的基本操作。HDFS API主要由`org.apache....

    HDFS存取实例(java)

    三、HDFS文件上传 1. **配置HDFS环境**:首先需要配置Hadoop的相关环境变量,包括HADOOP_HOME、HADOOP_CONF_DIR等,确保可以正确连接到HDFS集群。 2. **创建`FileSystem`对象**:使用`FileSystem.get(URI uri, ...

    sqoop2 java API从oracle导数据到HDFS开发总结

    - **用户伪装**:为了使root用户能够代表hadoop用户访问HDFS,需要在`core-site.xml`中添加用户伪装配置。具体配置如下: ```xml &lt;name&gt;hadoop.proxyuser.root.hosts * &lt;name&gt;hadoop.proxyuser.root....

    web中进行HDFS文件系统操作的demo

    在这个“web中进行HDFS文件系统操作的demo”中,我们将探讨如何通过Web界面与HDFS进行交互,使得用户能够方便地管理HDFS上的文件和目录,而无需直接使用命令行工具。这个demo是由jsp(JavaServer Pages)编写的,这...

    hdfs-java-api

    而HDFS Java API则是开发人员与HDFS进行交互的主要接口,使得Java应用程序能够便捷地读写HDFS上的文件。本文将深入探讨HDFS Java API的原理、使用方法及其在实际应用中的最佳实践。 一、HDFS基础 1.1 HDFS架构:...

    java操作hdfs.rar

    Java API是与HDFS进行交互的主要方式,它允许开发者编写程序来读取、写入和管理存储在HDFS上的文件。 在使用Java操作HDFS时,首先需要确保你已经在本地环境中安装了Hadoop,并且正确配置了环境变量。这包括设置`...

    数据存储实验2-熟悉常用的HDFS操作.doc(实验报告)

    * FileSystem:用于访问HDFS文件系统的接口 * Path:用于表示HDFS文件路径的接口 * FSDataInputStream:用于读取HDFS文件的接口 * FSDataOutputStream:用于写入HDFS文件的接口 实验代码 实验代码包括: * HDFSApi:...

    hdfs-over-ftp-hadoop-0.20.0.rar_ftp_ftpoverhdfs_hdfs文件传入ftp_java

    标签 "ftp ftpoverhdfs hdfs文件传入ftp java_hadoop java_hdfs-over-ftp" 进一步明确了主题。"ftpoverhdfs"可能是指一个特定的模块或工具,它允许FTP通信“覆盖”HDFS,即通过FTP接口操作HDFS。"java_hadoop"和...

    Hadoop+HBase+Java API

    **Java API** 是Java编程语言提供的应用程序接口,允许开发者使用Java来访问和操作Hadoop和HBase的功能。对于Hadoop,Java API主要包括`org.apache.hadoop.mapreduce`包下的类,如Job、Mapper、Reducer等,用于实现...

    hdfs_design.rar_HDFS-OPERATE_hadoop_hadoop java_hdfs

    文件“hdfs_design.pdf”很可能是HDFS设计的详细解读,涵盖了HDFS的架构、数据复制策略、故障恢复机制、NameNode和DataNode的角色以及客户端API等内容。这部分内容将帮助你深入理解HDFS的内部工作原理,如Block和...

    HDFS-API文件上传、创建、删除、重命名

    本教程将详细讲解如何利用HDFS API进行文件的上传、创建、删除以及重命名等基本操作。这些API是Java编程接口,为开发者提供了与HDFS交互的便利。 首先,我们需要导入Hadoop相关的库,通常在Java项目中,这可以通过...

    webhdfs-java-client-master

    这个Java客户端库则是专门为了方便Java开发者利用WebHDFS进行文件系统操作。 1. **WebHDFS API**: WebHDFS API提供了创建、打开、读取、写入、移动和删除文件或目录的方法。这些方法通常包括GET、PUT、POST和...

    sqoop2 java API从oracle导数据到HDFS开发总结新

    为了让root用户能够伪装成hadoop用户访问HDFS,需要在`core-site.xml`中进行相应的配置。具体步骤如下: ```xml &lt;name&gt;hadoop.proxyuser.root.hosts * &lt;name&gt;hadoop.proxyuser.root.groups * ``` 若未进行...

    hdfs的jar包.zip

    在这个名为“hdfs的jar包.zip”的压缩文件中,包含的是与HDFS相关的Java库,这些库使得开发者能够在Java程序中访问和操作HDFS。使用这些jar包,可以实现创建、读取、写入、移动和删除HDFS上的文件和目录等操作。 ...

Global site tag (gtag.js) - Google Analytics