栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot连接Hive实现自助取数的示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot连接Hive实现自助取数的示例

原文链接: http://www.ikeguang.com/?p=815

公司运营免不了让我们数据做一些临时取数,这些取数有时候是重复的,或者可以做成可配置的。需要开发成界面,供他们选择,自然想到SpringBoot连接Hive,可以把取数做成一键生成,或者让他们自己写sql,通常大多人是不会sql的。

1. 需要的依赖配置

为了节省篇幅,这里给出hiveserver2方式连接hive主要的maven依赖,父工程springboot依赖省略。



 2.6.5
 3.2.7
 compile


 org.mybatis
 mybatis
 ${mybatis.version}




 org.apache.hadoop
 hadoop-common
 ${hadoop.version}
 ${scopeType}





 org.apache.hive
 hive-jdbc
 
  
   org.slf4j
   slf4j-api
  
  
   ch.qos.logback
   logback-core
  
  
   ch.qos.logback
   logback-classic
  
 
 1.2.1
 ${scopeType}




 org.jsoup
 jsoup
 1.8.3

application-test.yml配置数据库连接,这里用的是druid连接池管理hiveserver2连接,也是没有问题的。

# Spring配置
spring:
 datasource:
 type: com.alibaba.druid.pool.DruidDataSource
 driverClassName: com.mysql.cj.jdbc.Driver
 druid:
  # 多数据源**省略若干***
  # hive数据源
  slave3:
  # 从数据源开关/默认关闭
  enabled: true
  driverClassName: org.apache.hive.jdbc.HiveDriver
  url: jdbc:hive2://cdh:10000/default
  username: bigdata
  password: bigdata

2. 代码实现

代码实现跟其它程序一样,都是mapper、service、controller层,套路一模一样。一共设置了实时和离线两个yarn资源队列,由于其它部门人使用可能存在队列压力过大的情况,需要对数据量按照每次查询的数据范围不超过60天来限制,和此时集群使用资源不能大于55%,这里重点说明一下controller层对数据量的预防。

实体类UserModel:

@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
public class UserModel extends baseEntity{

 private String userId;
 private Integer count;
}

2.1 集群资源使用率不大于55%
因为很多业务查询逻辑controller都要用到数据量防御过大的问题,这里使用了被Spring切面关联的注解来标识controller。

定义切面YarnResourceAspect,并且关联注解@YarnResource

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface YarnResource {

}

@Aspect
@Component
public class YarnResourceAspect {

 private static final Logger log = LoggerFactory.getLogger(YarnResourceAspect.class);

 
 @Pointcut("@annotation(com.ruoyi.common.annotation.YarnResource)")
 public void yarnResourcdPointCut(){
 }

 
 @Before("yarnResourcdPointCut()")
 public void before(){
  log.info("************************************检查yarn的资源是否可用*******************************");
  // yarn资源紧张
  if(!YarnClient.yarnResourceOk()){
   throw new InvalidStatusException();
  }
 }

}

获取yarn的资源使用数据:

@Slf4j
public class YarnClient {

 
 private static final int YARN_RESOURCE = 55;

 
 public static boolean yarnResourceOk() {
  try {
   URL url = new URL("http://master:8088/cluster/scheduler");
   HttpURLConnection conn = null;
   conn = (HttpURLConnection) url.openConnection();
   conn.setRequestMethod("GET");
   conn.setUseCaches(false);
   // 请求超时5秒
   conn.setConnectTimeout(5000);
   // 设置HTTP头:
   conn.setRequestProperty("Accept", "*
 private String prefix = "hero";

 @Autowired
 IUserService iUserService;

 @RequestMapping("")
 @RequiresPermissions("hero:hive:view")
 public String heroHive(){
  return prefix + "/hive";
 }

 @YarnResource
 @RequestMapping("/user")
 @RequiresPermissions("hero:hive:user")
 @ResponseBody
 public TableDataInfo user(UserModel userModel){
  DateCheckUtils.checkInputDate(userModel);

  PageInfo pageInfo = iUserService.queryUser(userModel);
  TableDataInfo tableDataInfo = new TableDataInfo();

  tableDataInfo.setTotal(pageInfo.getTotal());
  tableDataInfo.setRows(pageInfo.getList());

  return tableDataInfo;
 }
}

2.2 查询数据跨度不超过60天检查
这样每次请求进入controller的时候就会自动检查查询的日期是否超过60天了,防止载入数据过多,引发其它任务资源不够。

public class DateCheckUtils {

 
 public static void checkInputDate(baseEntity o){
  if("".equals(o.getParams().get("beginTime")) && "".equals(o.getParams().get("endTime"))){
   throw new InvalidTaskException();
  }

  String beginTime = "2019-01-01";
  String endTime = DateUtils.getDate();

  if(!"".equals(o.getParams().get("beginTime"))){
   beginTime = String.valueOf(o.getParams().get("beginTime"));
  }

  if(!"".equals(o.getParams().get("endTime"))){
   endTime = String.valueOf(o.getParams().get("endTime"));
  }

  // 查询数据时间跨度大于两个月
  if(DateUtils.getDayBetween(beginTime, endTime) > 60){
   throw new InvalidTaskException();
  }
 }
}

这里访问hive肯定需要切换数据源的,因为其它页面还有对mysql的数据访问,需要注意一下。

目前功能看起来很简单,没有用到什么高大上的东西,后面慢慢完善。

以上就是SpringBoot连接Hive实现自助取数的示例的详细内容,更多关于SpringBoot连接Hive的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/130068.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号