博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring+Maven+Dubbo+MyBatis+Linner+Handlebars—Web开发环境搭建
阅读量:4338 次
发布时间:2019-06-07

本文共 17649 字,大约阅读时间需要 58 分钟。

       本文主要分三部分,分别是:后台核心业务逻辑、桥梁辅助控制和前台显示页面。

       本Web开发环境综合了多种工具,包括Maven包管理与编译工具、Dubbo分布式服务框架、MyBatis数据持久化工具、Linner页面管理工具和Handlebars Js模板引擎等前卫的开发工具。

        首先介绍一下:后台核心业务逻辑搭建。

1. 后台核心业务逻辑搭建

      后台核心业务逻辑大致分为三个层次:最底层的核心数据逻辑层(biz层),中间层Dubbo服务实现层(service-impl层)Dubbo服务接口层(service-client层)。此外还有公共的jar包管理父工程(parent工程)公共业务逻辑工程(common工程)任务调度工程(task工程)总的maven管理工程

      示例如下图:

       

     接下来我会按照搭建顺序简单介绍一下相关工程的配置:

     基本的顺序是parent工程→biz工程→common工程→task工程→service-client工程→service-impl工程。

   1.1 基本jar包管理和服务环境配置parent工程

     parent工程结构如下图所示:

     

    parent工程主要包括pom工程配置文件,filters文件下的三个开发环境配置文件和maven打包bat批处理命令文件。

    首先介绍一下parent工程的pom文件:

     (1)  不同的打包环境配置,使用不同的打包配置便利了项目整个开发,测试到生产流程的统一化管理。默认将开发环境激活,配置如下图所示:

     

   (2)  编译时设置不对指定的资源文件进行替换。包括Freemarker模板文件ftl,静态-dynamic.xml文件,mybatis动态SQL Mapper文件。如下图:

    

    (3)   工程编码和打包插件配置:包括工程编码插件Java版本1.7,生成javadoc插件,打包Java源码插件,导入eclipse工程插件等的配置。如下图所示:

    

   (4)  单元测试覆盖率统计插件配置:

   忽略对以下路径文件的单元测试覆盖率统计:action、webapp、interceptor、taglib、domain、model、dto和util/DataFormat.class。下图相应配置信息:

    

   1.2  biz核心业务逻辑工程

       biz工程结构如下图所示:
       

   按模块划分的动态SQLMapper文件:示例:SamStateInfoMapper.xml,如图1-21

   序号①指定mybatis基本配置文件sqlMapConfig.xml的路径。

    序号②指定动态SQL Mapper文件的路径。

    序号③为基础的baseDAO Bean的声明。

    a包类文件,主资源文件;测试Java包类文件,测试资源文件四大部分组成。

     主Java包类文件的文件路径为com.ouc.mkhl.supplier,下按模块划分,示例中为jmx、security和util 3个模块。security模块又细分为advice包、dao包、domain包、model数据实体类包和service服务接口包,service服务接口包下包含impl服务接口实现包。

     主资源文件包含email邮箱模板文件、logs日志配置文件、mybatis配置文件、spring相关配置文件。之后将对各配置文件做逐一介绍。

     测试Java包类文件包含与主Java包相关的各单元测试文件。

     测试资源文件包含springcache文件和mybatis数据持久层generator配置文件。

     1)  biz工程的pom配置文件:如下图所示:

     

    序号①为工程的父maven工程配置。

    序号②为工程的继承和引用工程关系配置。   

   2)  biz工程主资源配置文件说明:

    (1)  mybatis配置文件:首先介绍基本的SQLMap配置文:sqlMapConfig.xml

    

    按模块划分的动态SQLMapper文件:示例:SamStateInfoMapper.xml,如下图

   

   (2)  spring相关配置文件:

   ①   缓存cache配置文件:ehcache.xml,spring-cache-security.xml,spring-cache.xml。

   ②   jmx运行期系统管理配置文件:spring-jmx-mbean.xml。

   ③   按模块划分的自定义Bean声明配置文件:示例:spring-upload.xml

   

   序号①为类似DAO的数据库接口操作类Bean。

   序号②为服务接口Bean方法。

   b为声明的切面,a为前置通知和后置通知要执行的方法。

   ④  公用操作的配置文件spring-common.xml。

   

   序号①指定mybatis基本配置文件sqlMapConfig.xml的路径。

   序号②指定动态SQL Mapper文件的路径。

   序号③为基础的baseDAO Bean的声明。

   ⑤  spring配置工具配置:spring-config-toolkit.xml

   

   ⑥   数据源配置:spring-datasource.xml

   

   ⑦  Dubbo服务接口发布配置:spring-dubbo.xml

  

  ⑧   服务扩展接口配置:spring-external.xml

  

  ⑨   业务日志配置:spring-log.xml

 

   ⑩  Quartz监控配置:spring-monitor.xml

  

  传输事物管理配置:spring-transaction.xml

   biz工程代码示例:

    a.Jmx运行期管理扩展服务:

    用户暴露系统相关管理接口,以实现运行期调用:ExposeMethodInterface

    

   运行期管理系统接口实现:Configuration

    

    b.系统初始化:SystemBootstrap

1 package com.ouc.mkhl.supplier.util; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.util.Properties; 5 import mx4j.tools.adaptor.http.HttpAdaptor; 6 import org.apache.commons.logging.Log; 7 import org.apache.commons.logging.LogFactory; 8 import org.springframework.beans.factory.InitializingBean; 9 import org.springframework.core.env.AbstractEnvironment;10 import com.ouc.openplatform.SysException;11 import com.ouc.openplatform.console.audit.AuditInfoCollector;12 import com.ouc.openplatform.session.listener.MaxSessionUtil;13 import com.ouc.openplatform.util.Env;14 import com.ouc.openplatform.util.HOPConstant;15 16 /**17  * @author WuPing18 */19 public class SystemBootstrap implements InitializingBean {20     /*21      * CONFIG_FILE_PATH 系统变量配置文件路径22      */23     private static final String CONFIG_FILE_PATH = "/env.properties";24     private static final Log LOG = LogFactory.getLog(SystemBootstrap.class);25     private HttpAdaptor httpAdaptor;26     public static void  init() {27         InputStream inputStream = null;28         Properties properties = new Properties();29         try{30     inputStream SystemBootstrap.class.getResourceAsStream(CONFIG_FILE_PATH);31             properties.load(inputStream);32             LOG.info("系统配置项:"+properties);33         }catch (Exception e) {34             LOG.error("读取系统配置文件时发生错误:",e);35             throw new SysException(e);36         }finally{37             if(inputStream != null){38                 try {39                     inputStream.close();40                 } catch (IOException e) {41                     LOG.error("关闭文件输入流失败:",e);42                 }43             }44         }45         Env.init(properties);46         AuditInfoCollector.setAppNM(Env.getProperty(Env.KEY_SERVER_NAME));47         HOPConstant.setAppName(Env.getProperty(Env.KEY_SERVER_NAME));48         //设置一些全局参数49     MaxSessionUtil.setMaxSessionKey(Env.getProperty(Env.KEY_SERVER_NAME)+"_MAX_SESSION_KEYS");50         //使用spring的profile51     System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, Env.getProperty(Env.ENV_TYPE));52     }53 54     @Override55     public void afterPropertiesSet() throws Exception {56         httpAdaptor.start();57     }58 59     public void setHttpAdaptor(HttpAdaptor httpAdaptor) {60         this.httpAdaptor = httpAdaptor;61     }62 }
View Code

     c.DAO:SupplyUserDAO:

1 package com.ouc.mkhl.supplier.security.dao; 2 import java.util.List; 3 import com.ouc.mkhl.supplier.security.model.SupplyUser; 4 public interface SupplyUserDAO { 5     public int deleteByPrimaryKey(String supplycode); 6     public int insert(SupplyUser record); 7     public SupplyUser selectByPrimaryKey(String supplycode); 8     public int updateByPrimaryKey(SupplyUser record); 9     public List
selectAllSupplyUser();10 public SupplyUser selectByVCode(String supplycode);11 }
View Code

     d. Model:SupplyUser

1 package com.ouc.mkhl.supplier.security.model; 2  3 import java.io.Serializable; 4  5 public class SupplyUser implements Serializable{ 6  7     private static final long serialVersionUID = -123120032141L; 8      9     private String supplycode;10 11     private String supplypass;12 13     private String supplyname;14 15     public String getSupplycode() {16         return supplycode;17     }18 19     public void setSupplycode(String supplycode) {20         this.supplycode = supplycode == null ? null : supplycode.trim();21     }22 23     public String getSupplypass() {24         return supplypass;25     }26 27     public void setSupplypass(String supplypass) {28         this.supplypass = supplypass == null ? null : supplypass.trim();29     }30 31     public String getSupplyname() {32         return supplyname;33     }34 35     public void setSupplyname(String supplyname) {36         this.supplyname = supplyname == null ? null : supplyname.trim();37     }38 }
View Code

   1.3 service-client服务接口工程

       service-client工程结构如图:

  

  分为传输DTO包,辅助功能helper包,客户端服务接口声明service包和客户端工具类util包。

    service-client示例代码:

    a. DTO:SupplyUserDTO

1 package com.ouc.mkhl.supplier.dto; 2  3 import java.io.Serializable; 4  5 import com.ouc.openapi.dubbo.governance.annotation.DubboField; 6  7 public class SupplyUserDTO implements Serializable{ 8  9     private static final long serialVersionUID = -223120032141L;10     11     @DubboField(description = "供应商V码")12     private String supplycode;13     14     @DubboField(description = "供应商登录密码-未加密")15     private String supplypass;16     17     @DubboField(description = "供应商全称")18     private String supplyname;19 20     public String getSupplycode() {21         return supplycode;22     }23 24     public void setSupplycode(String supplycode) {25         this.supplycode = supplycode == null ? null : supplycode.trim();26     }27 28     public String getSupplypass() {29         return supplypass;30     }31 32     public void setSupplypass(String supplypass) {33         this.supplypass = supplypass == null ? null : supplypass.trim();34     }35 36     public String getSupplyname() {37         return supplyname;38     }39 40     public void setSupplyname(String supplyname) {41         this.supplyname = supplyname == null ? null : supplyname.trim();42     }43 }
View Code
    b. 客户端服务接口service:SupplyUserServiceClient
1 package com.ouc.mkhl.supplier.service; 2  3 import io.terminus.pampas.client.Export; 4  5 import com.ouc.openapi.dubbo.governance.annotation.DubboMethod; 6 import com.ouc.openapi.dubbo.governance.annotation.DubboParam; 7 import com.ouc.openapi.dubbo.governance.annotation.DubboService; 8 import com.ouc.mkhl.supplier.dto.SupplyUserDTO; 9 10 import java.util.List;11 12 /**13  * 供客户端调用的远程接口14  * 15  * @author WuPing16  * 17  */18 @DubboService(description = "供应商用户服务", displayName = "SupplyUser服务")19 public interface SupplyUserServiceClient {20 21     // get请求22     // @return List
23 @Export(paramNames = {})24 @DubboMethod(description = "获取所有供应商用户信息", displayName = "getAllSupplyUsers", returnParamDes = "供应商用户DTO列表")25 public List
getAllSupplyUsers();26 27 // 用户登录处理28 @Export(paramNames = { "username", "password" })29 @DubboMethod(description = "用户登录验证", displayName = "userLogin", returnParamDes = "验证结果")30 public String userLogin(31 @DubboParam(name = "username", description = "登录用户名", example = "V187") String username,32 @DubboParam(name = "password", description = "密码", example = "123456") String password);33 34 }
View Code

  1.4 service-impl服务接口具体实现功能工程

     Service-impl工程结构如图:

   

    该工程包括异常处理filter包和客户端服务接口具体实现impl包。主资源文件有客户端Dubbo接口发布基本配置文件spring-dubbo.xml和用户自定义服务配置文件spring-user-provider.xml。如下图所示:

    序号①为代理平台分配的应用S码。

    序号②为后台接口代理服务。

    序号③为服务方法认证相关服务接口。

    序号④为服务自动注册接口。

   

    Service-impl示例代码:

   
客户端接口实现Service-impl:SupplyUserServiceClientImpl
1 package com.ouc.mkhl.supplier.service.impl;  2   3 import java.util.ArrayList;  4 import java.util.List;  5   6 import javax.annotation.Resource;  7 import javax.ws.rs.BeanParam;  8 import javax.ws.rs.Consumes;  9 import javax.ws.rs.DefaultValue; 10 import javax.ws.rs.FormParam; 11 import javax.ws.rs.GET; 12 import javax.ws.rs.POST; 13 import javax.ws.rs.Path; 14 import javax.ws.rs.PathParam; 15 import javax.ws.rs.Produces; 16 import javax.ws.rs.QueryParam; 17 import javax.ws.rs.core.MediaType; 18  19 import org.springframework.stereotype.Service; 20  21 import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType; 22 import com.ouc.openapi.dubbo.governance.annotation.DubboParam; 23 import com.ouc.mkhl.supplier.dto.SupplyUserDTO; 24 import com.ouc.mkhl.supplier.service.SupplyUserServiceClient; 25 import com.ouc.mkhl.supplier.security.service.SupplyUserService; 26 import com.ouc.mkhl.supplier.security.model.SupplyUser; 27 import com.ouc.mkhl.supplier.helper.EncryptHelper; 28  29 @Path("supplyUser") 30 @Consumes({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8 }) 31 // 参数类型 32 @Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8 }) 33 // 返回值类型 34 @Service("supplyUserServiceClient") 35 public class SupplyUserServiceClientImpl implements SupplyUserServiceClient { 36  37     @Resource 38     private SupplyUserService supplyUserService; 39  40     public SupplyUserService getSupplyUserService() { 41     return supplyUserService; 42     } 43     public void setSupplyUserService(SupplyUserService supplyUserService) { 44     this.supplyUserService = supplyUserService; 45     } 46      47     @GET 48     @Path("getAllSupplyUser") 49     @Override 50     public List
getAllSupplyUsers() { 51 52 List
supplyUserDTOList = new ArrayList
(); 53 54 List
supplyUserList = supplyUserService.getAllSupplyUser(); 55 for (int i = 0; i < supplyUserList.size(); i++) { 56 SupplyUserDTO tempSupplyUserDTO = new SupplyUserDTO(); 57 tempSupplyUserDTO.setSupplycode(supplyUserList.get(i) 58 .getSupplycode()); 59 tempSupplyUserDTO.setSupplypass(supplyUserList.get(i) 60 .getSupplypass()); 61 tempSupplyUserDTO.setSupplyname(supplyUserList.get(i) 62 .getSupplyname()); 63 supplyUserDTOList.add(tempSupplyUserDTO); 64 } 65 66 return supplyUserDTOList; 67 } 68 69 @SuppressWarnings({ "unused" }) 70 @GET 71 @Path("getUserByIdAndName") 72 @Override 73 public String userLogin( 74 @DefaultValue("V187") @QueryParam("username") String username, 75 @DefaultValue("123456") @QueryParam("password") String password) { 76 System.out.println("当前登录用户:" + username); 77 String md5Pass = ""; // MD5处理过的密码 78 79 // 设置登录反馈信息变量:1—成功;2—用户名不存在;3—密码无效登录失败。 80 String msg = null; 81 82 EncryptHelper md5Helper = new EncryptHelper(); 83 84 // 应用本地库 85 SupplyUser suppUser = new SupplyUser(); 86 87 try { 88 suppUser = supplyUserService.getSupplyUserByVCode(username); 89 } catch (Exception e) { 90 suppUser = null; 91 e.printStackTrace(); 92 } 93 94 if (suppUser == null) { 95 suppUser = new SupplyUser(); 96 if (username.equals("suptest")){ 97 suppUser.setSupplycode("V187"); 98 suppUser.setSupplyname("供应商端测试"); 99 suppUser.setSupplypass("123456");100 }101 else if(username.equals("ouctest")) {102 suppUser.setSupplycode("ouctest");103 suppUser.setSupplyname("ouc端测试");104 suppUser.setSupplypass("123456");105 }106 } else {107 try {108 md5Pass = md5Helper.md5Encode(password).toUpperCase();109 } catch (Exception e) {110 // TODO Auto-generated catch block111 e.printStackTrace();112 }113 System.out.println("MD5后的密码:" + md5Pass);114 password = md5Pass;115 }116 117 // 反馈信息设置118 if (suppUser == null) {119 msg = "2"; // 用户名不存在120 } else {121 if (suppUser.getSupplypass().equals(password)) {122 if (suppUser.getSupplycode().equals("haiertest")){123 //msg = "1"; //ouc端用户登录124 msg = "ouc"; //ouc端125 }126 else {127 //msg = "0"; //供应商端用户登录128 msg = suppUser.getSupplycode(); //供应商端V码129 }130 } else {131 msg = "3";// 密码无效132 }133 }134 return msg;135 }136 137 }
View Code

   1.5 task任务调度工程

     
 Task任务调度工程结构如图:
      
   
示例中的为账号过期定期扫描作业AccountExpireJob。

    配置文件示例spring-lts-job.xml:如图1-35所示。

    序号①为设置作业执行周期。

   

2. 桥梁辅助控制

   
桥梁工程结构如下图所示:
   

    包括控制controller、辅助类domain、excel处理、环境配置过滤器filter、操作拦截器interceptor、辅助工具utils等。

资源文件有:spring接口和代理服务配置文件root-context.xml、网页servlet拦截器配置文件servlet-context.xml、redis配置文件redis-persistence-context.xml。  项目环境配置文件filter,网页web.xml配置文件。

    1)  项目环境配置文件filter:dev.properties,如下图所示。

   dev.properties文件中:

    序号①为项目环境类别说明。

    序号②为日志配置。

    序号③为项目验证url地址。

    序号④为redis相关配置。

    序号⑤为dubbo相关配置。

    序号⑥为项目中央仓库地址配置。

   序号⑦为集群平台terracotta配置。

    ★序号⑧为与页面工程相关的配置:

    应用简称(app.name),服务器名称(server.name),与页面工程有关的服务Key(server.key),dubbo应用名(dubbo.application.name),页面工程路径(publicPathPrefix),浏览器访问域名(domain.name)和默认跳转页面(login.after.jump.url)。

    序号⑨为项目集团内网和外网环境安全配置。

   

  2)  Web.xml配置文件:

   主要内容有配置系统启动监听器startupListeners,基于缓存实现的集群session配置和编码过滤等内容。

  

3. 前台页面工程

  1) 页面工程结构如下.

  典型的被linner管理的项目前端工程结构如下:

├─a: app ##app是开发者自开发代码的存储目录.

│ ├─a1: components ##存放项目的组件文件.
│ │ └─ dropdown ##示例组件(此处假设为dropdown).
│ │     └─ templates ##组件自身的前端模板.
│ │      ├─ view.coffee | view.js ##组件js,可以使coffee也可以是js.
│ │      ├─view.hbs ##组件模板
│  │      └─ view.scss | view.css  ##组件样式文件,可以是scss,也可以是css.
│ ├─ a3: images ##存放项目相关的图片文件.
│  │       └── logo.png
│ ├─ a5: scripts ##存放项目相关的JavaScript文件.
│ │       └── app.coffee
│ ├─ a6: styles ##存放项目相关的StyleSheet文件.
│ │       └── app.scss
│ ├─ a7: templates ##存放项目相关的前端模板文件.
│ │       └── welcome.hbs
│ ├─ a8: views ##用于存放项目相关的页面文件.
│ │       └──index.html
│ └─ a2: files ##用于存放相关配置文件,例如front_config.yaml等.
├─bin ##用户可基于此启动本地服务器(以当前文件夹为根),当然更好的选择是适用jigglepuff来启动一个带渲染逻辑的服务器.
│ └── server.
├─config.yml ##是整个项目的配置文件.
├─ b: public ##是项目执行linner build后生成的打包文件位置,是发布项目所需要的所有文件.
├── test ##测试前端项目的单元测试文件所在目录.
└─ c:  vendor ##存放引入的第三方代码组件,例如jQuery、Underscore等.

                    

   2) 页面调用后台服务

   
  
 特别注意:配置文件对空格敏感,请谨慎编写。

  3)   整个项目的配置文件config.yml。

  

  4)  后端服务back_config.yaml配置:

  

  5)  前端页面引用服务front_config.yaml配置:

  

    6) 页面hbs示例:

  组件类型调用服务示例

  

   ajax类型服务调用方式

  友情链接:

   handlebars官网:

   Node.js官网:

   CoffeeScript 中文网:

   Redis中文官网:

附件

 A.LTS轻任务调度框架介绍:

   •   LTS框架概况:

      LTS是一个轻任务调度框架,参考hadoop的部分思想。有三种角色, JobClient, JobTracker,TaskTracker。各个节点都是无状态的,可以部署多个,来实现负载均衡,实现更大的负载量, 并且框架具有很好的容错能力。 采用Zookeeper暴露节点信息,master选举。Mongo存储任务队列和任务执行日志, netty做底层通信。

       ▶ JobClient : 主要负责提交任务, 和接收任务执行反馈结果。

       ▶ JobTracker : 负责接收并分配任务,任务调度。

       ▶ TaskTracker: 负责执行任务,执行完反馈给JobTracker。

   •   架构图:

   •   节点组:

      ▶ 一个节点组等同于一个集群,同一个节点组中的各个节点是对等的,外界无论连接节点组中的任务一个节点都是可以的。

      ▶ 每个节点组中都有一个master节点,采用zookeeper进行master选举(master宕机,会自动选举出新的master节点),框架会提供接口API来监听master节点的变化,用户可以自己使用master节点做自己想做的事情。

      ▶ JobClient和TaskTracker都可以存在多个节点组。譬如JobClient 可以存在多个节点组。譬如:JobClient 节点组为‘QN_WEB’中的一个节点提交提交一个只有节点组为‘QN_TRADE’的TaskTracker 才能执行的任务。

      ▶ (每个集群中)JobTacker只有一个节点组。

      ▶ 多个JobClient节点组和多个TaskTracker节点组再加上一个JobTacker节点组, 组成一个大的集群。

•   工作流程:

     ▶ JobClient提交一个任务给 JobTracker, 这里我提供了两种客户端API, 一种是如果JobTracker 不存在或者提交失败,直接返回提交失败。另一种客户端是重试客户端, 如果提交失败,先存储文件,返回给客户端提交成功的信息,待JobTracker可用的时候,再将任务提交。

     ▶ JobTracker收到JobClient提交来的任务,先生成一个唯一的JobID。然后将任务储存在Mongo集群中。JobTracker 发现有(任务执行的)可用的TaskTracker节点(组)之后,将优先级最大,最先提交的任务分发给TaskTracker。这里JobTracker会优先分配给比较空闲的TaskTracker节点,达到负载均衡。

     ▶ TaskTracker收到JobTracker分发来的任务之后,执行。执行完毕之后,再反馈任务执行结果给JobTracker(成功or 失败[失败有失败错误信息]),如果发现JobTacker不可用,那么存储文件,等待TaskTracker可用的时候再反馈。反馈结果的同时,询问 JobTacker有没有新的任务要执行。

      ▶ JobTacker收到TaskTracker节点的任务结果信息,生成并插入(mongo)任务执行日志。根据任务信息决定要不要反馈给客户端。不需要反馈的直接删除, 需要反馈的(同样JobClient不可用存储文件,等待可用重发)。

     ▶ JobClient收到任务执行结果,进行自己想要的逻辑处理。

•   特性

    ▶ 负载均衡:

       ▷ JobClient和 TaskTracker会随机连接JobTracker节点组中的一个节点,实现JobTracker负载均衡。当连接上后,将一直保持连接这个节点,保持连接通道,知道这个节点不可用,减少每次都重新连接一个节点带来的性能开销。

        ▷ JobTracker分发任务时,是优先分配给最空间的一个TaskTracker节点,实现TaskTracker节点的负载均衡。

    ▶ 健壮性:

        ▷ 当节点组中的一个节点当机之后,自动转到其他节点工作。当整个节点组当机之后,将会采用存储文件的方式,待节点组可用的时候进行重发。

       ▷ 当执行任务的TaskTracker节点当机之后,JobTracker会将这个TaskTracker上的未完成的任务(死任务),重新分配给节点组中其他节点执行。

    ▶ 伸缩性:

    因为各个节点都是无状态的,可以动态增加机器部署实例, 节点关注者会自动发现。

•   调用示例

     安装 zookeeper 和 mongo , 执行 data/mongo目录下的 mongo.md 中的语句见 job-example 这里给出的是java API(设置配置)方式启动,也可以使用配置文件中。

   ▶ JobTracker端

   ▶ JobClient端

   ▶ TaskTracker端

转载于:https://www.cnblogs.com/wp5719/p/5259835.html

你可能感兴趣的文章
机器码和字节码
查看>>
环形菜单的实现
查看>>
【解决Chrome浏览器和IE浏览器上传附件兼容的问题 -- Chrome关闭flash后,uploadify插件不可用的解决办法】...
查看>>
34 帧动画
查看>>
二次剩余及欧拉准则
查看>>
thymeleaf 自定义标签
查看>>
关于WordCount的作业
查看>>
UIView的layoutSubviews,initWithFrame,initWithCoder方法
查看>>
STM32+IAP方案 实现网络升级应用固件
查看>>
用74HC165读8个按键状态
查看>>
jpg转bmp(使用libjpeg)
查看>>
linear-gradient常用实现效果
查看>>
sql语言的一大类 DML 数据的操纵语言
查看>>
VMware黑屏解决方法
查看>>
JS中各种跳转解析
查看>>
JAVA 基础 / 第八课:面向对象 / JAVA类的方法与实例方法
查看>>
Ecust OJ
查看>>
P3384 【模板】树链剖分
查看>>
Thrift源码分析(二)-- 协议和编解码
查看>>
考勤系统之计算工作小时数
查看>>