Servlet实现HDFS系统的远程上传

21 篇文章 0 订阅
9 篇文章 0 订阅

首先要使用apache的commons.fileupload包,这个可以去官网上下的啦...很方便

另外还要使用:hadoop-core.jar以及logging.jar,大家都下下来,放到Servlet的lib下吧。

我身边的哥们用的是Struts实现,大家有兴趣的话,可以以后发给大家一起瞅瞅

upload.htm源码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
</HEAD>
<BODY bgColor=#e6e6e6><BR>
<FORM action="uploadServlet"  encType="multipart/form-data" method="post">
<TABLE><TR><TD><FONT color=#000000 face=helv,helvetica size=1>&nbsp;&nbsp;
File:&nbsp;</FONT>&nbsp;&nbsp;<INPUT  size=60 type=file  name="file"> </TD></TR></TABLE>
<INPUT type=submit value=Send name="send">
</FORM>
</BODY>
</HTML>

Servlet的源代码:

使用了两种方式来实现,一种比较直接,一种使用API来实现。。。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.text.*;
import java.util.*;
import org.apache.commons.fileupload.*;
import org.apache.hadoop.conf.Configuration;
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 uploadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private static final int BUFFER_SIZE = 16 * 1024;
private static final String CONTENT_TYPE = "text/html; charset=GBK";
       public void init() throws ServletException {
    }
     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      Configuration conf = new Configuration();
      conf.set("fs.default.name", "hdfs://192.168.1.200:9000/");
      conf.set("dfs.replication","1" );
      //conf.addResource(new Path("/home/grid/Hadoop/hadoop-0.20.2/conf/core-site.xml"));
      //conf.addResource(new Path("/home/grid/Hadoop/hadoop-0.20.2/conf/hdfs-site.xml"));
      //conf.addResource(new Path("/home/grid/Hadoop/hadoop-0.20.2/conf/mapred-site.xml");
      FileSystem hdfs = FileSystem.get(conf);

     
     
     
     String yourTempDirectory = "/home/grid/upload/";
        boolean writeToFile = true;
        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>uploadServlet</title></head>");
        out.println("<link rel='stylesheet' href='css/turbocrm.css' type='text/css'>");
        out.println("<body bgcolor=\"#ffffff\">");
        out.println("<p>成功上载</p>");
        out.println("<a href='upload.htm'>返回</a>");
        out.println("</body></html>");
       
        //先判断是否为multipart
        boolean isMultipart = FileUpload.isMultipartContent(request);
        System.out.println(isMultipart);
        if(isMultipart){
        try{
            // 创建DiskFileUpload对象
            DiskFileUpload   upload = new DiskFileUpload();
            // 解析request
            List items = upload.parseRequest(request);
            // 处理Item
            Iterator iter = items.iterator();
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();
                if (item.isFormField()) {
                     String name = item.getFieldName();
                     String value = item.getString();
                     System.out.println(name + " "+ value );
                }
                //如果是文件
                else {
                 //String fieldName = item.getFieldName();
                    //String contentType = item.getContentType();
                    //boolean isInMemory = item.isInMemory();
                    //long sizeInBytes = item.getSize();
                
                     String fileName =  item.getName();
                     int index = fileName.lastIndexOf(".");
                     String temp = fileName.substring(index,fileName.length());
                     //解析出上传文件的扩展名
                     if (writeToFile) {
                          System.out.println("write");
                          //保存到硬盘设定的目录
                          SimpleDateFormat dateformat1=new SimpleDateFormat("yyyyMMddHHmmssSS");
                          String time = dateformat1.format(new Date());

                       
                          //方式一:直接将数据存储到HDFS中去
                          FSDataOutputStream fsdo = null;
                          InputStream in = null;
                          Path dfs = new Path(yourTempDirectory + time +temp);
                          fsdo = hdfs.create(dfs);
                          in = new BufferedInputStream(item.getInputStream(), BUFFER_SIZE);
                          byte[] buffer = new byte[BUFFER_SIZE];
                          int len = 0;
                          while ((len = in.read(buffer)) > 0) {
                            fsdo.write(buffer, 0, len);
                          }
                       
                        //方式二:先将数据存储到Hadoop的节点中,在上传到HDFS中
//                          File uploadedFile = new File(yourTempDirectory + time +temp);
//                          item.write(uploadedFile);
//                          Path src = new Path(yourTempDirectory + time +temp);
//                          Path dst = new Path("/");
//                          hdfs.copyFromLocalFile(src, dst);
                      } else {
                          InputStream uploadedStream = item.getInputStream();
                          uploadedStream.close();
                    }
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}
    public void destroy() {
    }
}
这个其实偶刚写的,也没有测试,大家瞅瞅玩吧~明天偶看看去  呵呵~

在 IntelliJ IDEA 中利用 Maven 实现 Hadoop Distributed File System (HDFS) 文件上传和下载,你需要做以下几个步骤: 1. **设置环境**: - 安装并配置好 Java 和 Maven。确保你有 Apache Hadoop 和 Hadoop Client(如 hdfs-client 或 hadoop-common)的库版本。 - 配置你的系统变量,包括 HADOOP_HOME 和 PATH,以便运行 HDFS 命令。 2. **添加依赖**: 在 `pom.xml` 文件中添加 Hadoop 相关的 Maven 仓库和依赖: ```xml <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>your-hadoop-version</version> </dependency> </dependencies> ``` 3. **编写代码**: 使用 Hadoop 的 `FileSystem` API 来操作 HDFS。以下是一个简单的示例,展示了如何上传和下载文件: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSUtil { private static final String HDFS_URI = "hdfs://localhost:9000"; // 根据实际情况修改 public static void uploadFileToHDFS(String localFilePath, String remotePath) throws Exception { Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Path outputPath = new Path(HDFS_URI + remotePath); fs.copyFromLocalFile(new Path(localFilePath), outputPath); } public static void downloadFileFromHDFS(String remoteFilePath, String localDestinationPath) throws Exception { Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Path inputFile = new Path(HDFS_URI + remoteFilePath); fs.copyToLocalFile(inputFile, new Path(localDestinationPath)); } } ``` 4. **测试**: 创建一个主类实例化 `HDFSUtil` 类,并调用对应的上传和下载方法: ```java public static void main(String[] args) { try { HDFSUtil.uploadFileToHDFS("local/path/to/file.txt", "/remote/path"); HDFSUtil.downloadFileFromHDFS("/remote/path/file.txt", "local/download/directory"); } catch (Exception e) { e.printStackTrace(); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值