返回顶部
首页 > 资讯 > 精选 >Java/Web如何调用Hadoop进行MapReduce
  • 841
分享到

Java/Web如何调用Hadoop进行MapReduce

javahadoopmapreduce 2023-05-30 20:05:54 841人浏览 独家记忆
摘要

这篇文章主要为大家展示了“Java/WEB如何调用hadoop进行mapReduce”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java/Web如何调用Hadoop进行MapReduce”这篇

这篇文章主要为大家展示了“Java/WEB如何调用hadoop进行mapReduce”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java/Web如何调用Hadoop进行MapReduce”这篇文章吧。

Hadoop环境搭建详见此文章https://www.jb51.net/article/33649.htm。

我们已经知道Hadoop能够通过Hadoop jar ***.jar input output的形式通过命令行来调用,那么如何将其封装成一个服务,让Java/Web来调用它?使得用户可以用方便的方式上传文件到Hadoop并进行处理,获得结果。首先,***.jar是一个Hadoop任务类的封装,我们可以在没有jar的情况下运行该类的main方法,将必要的参数传递给它。input 和output则将用户上传的文件使用Hadoop的Javaapi put到Hadoop的文件系统中。然后再通过Hadoop的JavaAPI 从文件系统中取得结果文件。

搭建javaweb工程。本文使用springspringMVCmybatis框架, 当然,这不是重点,就算没有使用任何框架也能实现。

项目框架如下:

Java/Web如何调用Hadoop进行MapReduce

项目中使用到的jar包如下:

Java/Web如何调用Hadoop进行MapReduceJava/Web如何调用Hadoop进行MapReduce

在Spring的配置文件中,加入

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    <property name="defaultEncoding" value="utf-8" />    <property name="maxUploadSize" value="10485760000" />    <property name="maxInMemorySize" value="40960" /> </bean>

使得项目支持文件上传。

新建一个login.jsp 点击登录后进入user/login

Java/Web如何调用Hadoop进行MapReduce

user/login中处理登录,登录成功后,【在Hadoop文件系统中创建用户文件夹】,然后跳转到console.jsp

package com.chenjie.controller;  import java.io.IOException;   import javax.annotation.Resource;  import javax.servlet.Http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import org.apache.hadoop.conf.Configuration;  import org.apache.hadoop.fs.FileSystem;  import org.apache.hadoop.fs.Path;  import org.springframework.stereotype.Controller;  import org.springframework.web.bind.annotation.RequestMapping; import com.chenjie.pojo.JSONResult;  import com.chenjie.pojo.User;  import com.chenjie.service.UserService;  import com.chenjie.util.AppConfig;  import com.Google.gson.Gson;   @Controller  // 声明当前类为控制器  @RequestMapping("/user")  // 声明当前类的路径  public class UserController {    @Resource(name = "userService")    private UserService userService;// 由Spring容器注入一个UserService实例       @RequestMapping("/login")    // 声明当前方法的路径    public String login(User user, HttpServletRequest request,        HttpServletResponse response) throws IOException {      response.setContentType("application/json");// 设置响应内容格式为json      User result = userService.login(user);// 调用UserService的登录方法      request.getSession().setAttribute("user", result);      if (result != null) {        createHadoopFSFolder(result);        return "console";      }      return "login";    }    public void createHadoopFSFolder(User user) throws IOException {      Configuration conf = new Configuration();      conf.addResource(new Path("/opt/hadoop-1.2.1/conf/core-site.xml"));      conf.addResource(new Path("/opt/hadoop-1.2.1/conf/hdfs-site.xml"));        FileSystem fileSystem = FileSystem.get(conf);      System.out.println(fileSystem.getUri());        Path file = new Path("/user/" + user.getU_username());      if (fileSystem.exists(file)) {        System.out.println("haddop hdfs user foler exists.");        fileSystem.delete(file, true);        System.out.println("haddop hdfs user foler delete success.");      }      fileSystem.mkdirs(file);      System.out.println("haddop hdfs user foler creat success.");    } }

console.jsp中进行文件上传和任务提交、

Java/Web如何调用Hadoop进行MapReduce

文件上传和任务提交:

package com.chenjie.controller;  import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; import java.net.URI; import java.util.ArrayList; import java.util.Iterator; import java.util.List;  import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;  import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.JobID; import org.apache.hadoop.mapred.JobStatus; import org.apache.hadoop.mapred.RunningJob; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartResolver;  import com.chenjie.pojo.User; import com.chenjie.util.Utils;  @Controller // 声明当前类为控制器 @RequestMapping("/hadoop") // 声明当前类的路径 public class HadoopController {    @RequestMapping("/upload")   // 声明当前方法的路径   //文件上传   public String upload(HttpServletRequest request,       HttpServletResponse response) throws IOException {     List<String> fileList = (List<String>) request.getSession()         .getAttribute("fileList");//得到用户已上传文件列表     if (fileList == null)       fileList = new ArrayList<String>();//如果文件列表为空,则新建     User user = (User) request.getSession().getAttribute("user");     if (user == null)       return "login";//如果用户未登录,则跳转登录页面     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(         request.getSession().getServletContext());//得到在Spring配置文件中注入的文件上传组件     if (multipartResolver.isMultipart(request)) {//如果请求是文件请求       MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;        Iterator<String> iter = multiRequest.getFileNames();//得到文件名迭代器       while (iter.hasNext()) {         MultipartFile file = multiRequest.getFile((String) iter.next());         if (file != null) {           String fileName = file.getOriginalFilename();           File folder = new File("/home/chenjie/CJHadoopOnline/"               + user.getU_username());           if (!folder.exists()) {             folder.mkdir();//如果文件不目录存在,则在服务器本地创建           }           String path = "/home/chenjie/CJHadoopOnline/"               + user.getU_username() + "/" + fileName;            File localFile = new File(path);            file.transferTo(localFile);//将上传文件拷贝到服务器本地目录           // fileList.add(path);         }         handleUploadFiles(user, fileList);//处理上传文件       }      }     request.getSession().setAttribute("fileList", fileList);//将上传文件列表保存在Session中     return "console";//返回console.jsp继续上传文件   }    @RequestMapping("/Wordcount")   //调用Hadoop进行mapreduce   public void wordcount(HttpServletRequest request,       HttpServletResponse response) {     System.out.println("进入controller wordcount ");     User user = (User) request.getSession().getAttribute("user");     System.out.println(user);     // if(user == null)     // return "login";     WordCount c = new WordCount();//新建单词统计任务     String username = user.getU_username();     String input = "hdfs://chenjie-virtual-Machine:9000/user/" + username         + "/wordcountinput";//指定Hadoop文件系统的输入文件夹     String output = "hdfs://chenjie-virtual-machine:9000/user/" + username         + "/wordcountoutput";//指定Hadoop文件系统的输出文件夹     String reslt = output + "/part-r-00000";//默认输出文件     try {       Thread.sleep(3*1000);       c.main(new String[] { input, output });//调用单词统计任务       Configuration conf = new Configuration();//新建Hadoop配置       conf.addResource(new Path("/opt/hadoop-1.2.1/conf/core-site.xml"));//添加Hadoop配置,找到Hadoop部署信息       conf.addResource(new Path("/opt/hadoop-1.2.1/conf/hdfs-site.xml"));//Hadoop配置,找到文件系统        FileSystem fileSystem = FileSystem.get(conf);//得打文件系统       Path file = new Path(reslt);//找到输出结果文件       FSDataInputStream inStream = fileSystem.open(file);//打开       URI uri = file.toUri();//得到输出文件路径       System.out.println(uri);       String data = null;       while ((data = inStream.readLine()) != null) {         //System.out.println(data);         response.getOutputStream().println(data);//讲结果文件写回用户网页       } //     InputStream in = fileSystem.open(file); //     OutputStream out = new FileOutputStream("result.txt"); //     IOUtils.copyBytes(in, out, 4096, true);       inStream.close();     } catch (Exception e) {       System.err.println(e.getMessage());     }   }    @RequestMapping("/MapReduceStates")   //得到MapReduce的状态   public void mapreduce(HttpServletRequest request,       HttpServletResponse response) {     float[] progress=new float[2];     try {       Configuration conf1=new Configuration();       conf1.set("mapred.job.tracker", Utils.JOBTRACKER);              JobStatus jobStatus = Utils.getJobStatus(conf1); //     while(!jobStatus.isJobComplete()){ //       progress = Utils.getMapReduceProgess(jobStatus); //       response.getOutputStream().println("map:" + progress[0] + "reduce:" + progress[1]); //       Thread.sleep(1000); //     }       JobConf jc = new JobConf(conf1);              JobClient jobClient = new JobClient(jc);       JobStatus[] jobsStatus = jobClient.getAllJobs();        //这样就得到了一个JobStatus数组,随便取出一个元素取名叫jobStatus        jobStatus = jobsStatus[0];        JobID jobID = jobStatus.getJobID(); //通过JobStatus获取JobID        RunningJob runningJob = jobClient.getJob(jobID); //通过JobID得到RunningJob对象        runningJob.getJobState();//可以获取作业状态,状态有五种,为JobStatus.Failed 、JobStatus.KILLED、JobStatus.PREP、JobStatus.RUNNING、JobStatus.SUCCEEDED        jobStatus.getUsername();//可以获取运行作业的用户名。        runningJob.getJobName();//可以获取作业名。        jobStatus.getStartTime();//可以获取作业的开始时间,为UTC毫秒数。        float map = runningJob.mapProgress();//可以获取Map阶段完成的比例,0~1,        System.out.println("map=" + map);       float reduce = runningJob.reduceProgress();//可以获取Reduce阶段完成的比例。       System.out.println("reduce="+reduce);       runningJob.getFailureInfo();//可以获取失败信息。        runningJob.getCounters();//可以获取作业相关的计数器,计数器的内容和作业监控页面上看到的计数器的值一样。                    } catch (IOException e) {       progress[0] = 0;       progress[1] = 0;     }        request.getSession().setAttribute("map", progress[0]);     request.getSession().setAttribute("reduce", progress[1]);   }      //处理文件上传   public void handleUploadFiles(User user, List<String> fileList) {     File folder = new File("/home/chenjie/CJHadoopOnline/"         + user.getU_username());     if (!folder.exists())       return;     if (folder.isDirectory()) {       File[] files = folder.listFiles();       for (File file : files) {         System.out.println(file.getName());         try {           putFileToHadoopFSFolder(user, file, fileList);//将单个文件上传到Hadoop文件系统         } catch (IOException e) {           System.err.println(e.getMessage());         }       }     }   }    //将单个文件上传到Hadoop文件系统   private void putFileToHadoopFSFolder(User user, File file,       List<String> fileList) throws IOException {     Configuration conf = new Configuration();     conf.addResource(new Path("/opt/hadoop-1.2.1/conf/core-site.xml"));     conf.addResource(new Path("/opt/hadoop-1.2.1/conf/hdfs-site.xml"));      FileSystem fileSystem = FileSystem.get(conf);     System.out.println(fileSystem.getUri());      Path localFile = new Path(file.getAbsolutePath());     Path foler = new Path("/user/" + user.getU_username()         + "/wordcountinput");     if (!fileSystem.exists(foler)) {       fileSystem.mkdirs(foler);     }          Path hadoopFile = new Path("/user/" + user.getU_username()         + "/wordcountinput/" + file.getName()); //   if (fileSystem.exists(hadoopFile)) { //     System.out.println("File exists."); //   } else { //     fileSystem.mkdirs(hadoopFile); //   }     fileSystem.copyFromLocalFile(true, true, localFile, hadoopFile);     fileList.add(hadoopFile.toUri().toString());    }  }

启动Hadoop:

Java/Web如何调用Hadoop进行MapReduce

运行结果:

可以在任意平台下,登录该项目地址,上传文件,得到结果。

Java/Web如何调用Hadoop进行MapReduce

Java/Web如何调用Hadoop进行MapReduce


Java/Web如何调用Hadoop进行MapReduce

Java/Web如何调用Hadoop进行MapReduce

Java/Web如何调用Hadoop进行MapReduce

Java/Web如何调用Hadoop进行MapReduce

运行成功。

以上是“Java/Web如何调用Hadoop进行MapReduce”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java/Web如何调用Hadoop进行MapReduce

本文链接: https://lsjlt.com/news/220909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java/Web如何调用Hadoop进行MapReduce
    这篇文章主要为大家展示了“Java/Web如何调用Hadoop进行MapReduce”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java/Web如何调用Hadoop进行MapReduce”这篇...
    99+
    2023-05-30
    java hadoop mapreduce
  • hadoop中mapreduce如何实现串联执行
    小编给大家分享一下hadoop中mapreduce如何实现串联执行,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!import java.io.IOExc...
    99+
    2023-06-02
  • 如何使用hadoop archive合并小文件并进行mapreduce来减少map的数量
    这篇文章给大家分享的是有关如何使用hadoop archive合并小文件并进行mapreduce来减少map的数量的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如下:原始文件 四个文件经过hadoop archi...
    99+
    2023-06-02
  • java如何实现对Hadoop进行操作
    这篇文章主要为大家展示了“java如何实现对Hadoop进行操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现对Hadoop进行操作”这篇文章吧。基本操作import ...
    99+
    2023-06-20
  • 利用Java连接Hadoop进行编程
    目录实验环境实验内容测试Java远程连接hadoop实验环境 hadoop版本:3.3.2jdk版本:1.8hadoop安装系统:ubuntu18.04编程环境:IDEA编程主机:w...
    99+
    2024-04-02
  • Java如何对方法进行调用详解
    目录一、方法调用二、非虚方法与虚方法三、调用指令四、解析调用五、分派调用六、静态分派七、动态分派八、单分派与多分派一、方法调用 方法调用的唯一目的:确定要调用哪一个方法 方法调用分为...
    99+
    2024-04-02
  • 如何使用Java和Laravel框架进行Web开发?
    在如今的互联网时代,Web开发已经成为了一个非常热门的领域。Java和Laravel框架是Web开发中非常常用的技术,Java作为一种非常成熟的编程语言,Laravel框架则是一种非常流行的PHP框架。本文将介绍如何使用Java和Larav...
    99+
    2023-11-07
    laravel 教程 框架
  • 怎么利用Java连接Hadoop进行编程
    今天小编给大家分享一下怎么利用Java连接Hadoop进行编程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实验环境hado...
    99+
    2023-07-02
  • 如何进行iframe式ajax调用
    如何进行iframe式ajax调用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 1.新建 a.html &...
    99+
    2024-04-02
  • 如何进行调用C++函数
    如何进行调用C++函数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在C++的语言中,和一些程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就...
    99+
    2023-06-17
  • 如何进行Java和Python的Web开发分析
    今天就跟大家聊聊有关如何进行Java和Python的Web开发分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java里面有一种服务端的软件组件技术,叫做Servlet,其实它的...
    99+
    2023-06-04
  • 如何使用Java调用C# Web Service方法
    这篇文章主要介绍“如何使用Java调用C# Web Service方法”,在日常操作中,相信很多人在如何使用Java调用C# Web Service方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用J...
    99+
    2023-06-18
  • 如何调用Web API
    本篇内容介绍了“如何调用Web API”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一步:打开开发者工具,找一个 JSON 响应...
    99+
    2023-06-29
  • 如何在java中调用xls对xml进行格式化
    本篇文章给大家分享的是有关如何在java中调用xls对xml进行格式化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在java中调用xls格式化xml 使用javax.xml....
    99+
    2023-05-31
    java xls xml
  • Django如何使用PHP进行Web开发?
    Django和PHP都是非常流行的Web开发框架,但是它们之间的语言和代码结构存在很大的差异。如果你已经熟悉了Django,并且对PHP也有一定的了解,你可能会想知道如何在Django中使用PHP进行Web开发。在本文中,我们将探讨这个问题...
    99+
    2023-09-30
    path django apache
  • 如何使用pdb进行Python调试
    调试应用有时是一个不受欢迎的工作,当你长期编码之后,只希望写的代码顺利运行。但是,很多情况下,我们需要学习一个新的语言功能或者实验检测新的方法,从而去理解其中运行的机制原理。 即使不考虑这样的场景,调试代码仍然是有必...
    99+
    2022-06-02
    pdb Python调试 python pdb使用
  • 如何去进行css调试
    今天就跟大家聊聊有关如何去进行css调试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。css关系到界面的美观,有时候功能实现了。界面确丑到没人用,终...
    99+
    2024-04-02
  • 教你如何使用Zabbix3.4进行Web监测
    导读zabbix提供web监测,可以实现对网站网页的监测,包括响应速度,状态码访问状态等。本次尝试使用web监测检查网页首页,并尝试状态码200,来衡量网页的情况。主机中增加web场景...
    99+
    2023-06-04
  • 如何开始使用C++进行Web开发?
    要使用 c++++ 进行 web 开发,需要使用支持 c++ web 应用程序开发的框架,如 boost.asio、beast 和 cpp-netlib。开发环境中,需要安装 c++ 编...
    99+
    2024-05-11
    c++ web开发 git
  • 如何使用 Golang 协程进行 Web 编程?
    协程是一种轻量级的并发机制,可用来提升 web 程序性能。如何使用协程进行 web 编程:创建协程:使用 go 关键字。协程通信:使用管道(channel)传递数据。实战案例:一个简单的...
    99+
    2024-05-21
    协程 web 编程 golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作