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
publicclassUserModelextendsBaseEntity{
privateStringuserId;
privateIntegercount;
}
2.1集群资源使用率不大于55%
因为很多业务查询逻辑controller都要用到数据量防御过大的问题,这里使用了被Spring切面关联的注解来标识controller。
定义切面YarnResourceAspect,并且关联注解@YarnResource
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public@interfaceYarnResource{
}
@Aspect
@Component
publicclassYarnResourceAspect{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(YarnResourceAspect.class);
/**
*配置切入点
*/
@Pointcut("@annotation(com.ruoyi.common.annotation.YarnResource)")
publicvoidyarnResourcdPointCut(){
}
/**
*检查yarn的资源是否可用
*/
@Before("yarnResourcdPointCut()")
publicvoidbefore(){
log.info("************************************检查yarn的资源是否可用*******************************");
//yarn资源紧张
if(!YarnClient.yarnResourceOk()){
thrownewInvalidStatusException();
}
}
}
获取yarn的资源使用数据:
@Slf4j
publicclassYarnClient{
/**
*yarn资源不能超过多少
*/
privatestaticfinalintYARN_RESOURCE=55;
/**
*
*@returntrue:表示资源正常,false:资源紧张
*/
publicstaticbooleanyarnResourceOk(){
try{
URLurl=newURL("http://master:8088/cluster/scheduler");
HttpURLConnectionconn=null;
conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setUseCaches(false);
//请求超时5秒
conn.setConnectTimeout(5000);
//设置HTTP头:
conn.setRequestProperty("Accept","*/*");
conn.setRequestProperty("User-Agent","Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/86.0.4240.111Safari/537.36");
//连接并发送HTTP请求:
conn.connect();
//判断HTTP响应是否200:
if(conn.getResponseCode()!=200){
thrownewRuntimeException("badresponse");
}
//获取所有响应Header:
Map>map=conn.getHeaderFields();
for(Stringkey:map.keySet()){
System.out.println(key+":"+map.get(key));
}
//获取响应内容:
InputStreaminput=conn.getInputStream();
byte[]datas=null;
try{
//从输入流中读取数据
datas=readInputStream(input);
}catch(Exceptione){
e.printStackTrace();
}
Stringresult=newString(datas,"UTF-8");//将二进制流转为String
Documentdocument=Jsoup.parse(result);
Elementselements=document.getElementsByClass("qstats");
String[]ratios=elements.text().split("used");
returnDouble.valueOf(ratios[3].replace("%",""))
在controller上通过注解@YarnResource标识:
@Controller
@RequestMapping("/hero/hive")
publicclassHiveController{
/**
*html文件地址前缀
*/
privateStringprefix="hero";
@Autowired
IUserServiceiUserService;
@RequestMapping("")
@RequiresPermissions("hero:hive:view")
publicStringheroHive(){
returnprefix+"/hive";
}
@YarnResource
@RequestMapping("/user")
@RequiresPermissions("hero:hive:user")
@ResponseBody
publicTableDataInfouser(UserModeluserModel){
DateCheckUtils.checkInputDate(userModel);
PageInfopageInfo=iUserService.queryUser(userModel);
TableDataInfotableDataInfo=newTableDataInfo();
tableDataInfo.setTotal(pageInfo.getTotal());
tableDataInfo.setRows(pageInfo.getList());
returntableDataInfo;
}
}
2.2查询数据跨度不超过60天检查
这样每次请求进入controller的时候就会自动检查查询的日期是否超过60天了,防止载入数据过多,引发其它任务资源不够。
publicclassDateCheckUtils{
/**
*对前台传入过来的日期进行判断,防止查询大量数据,造成集群负载过大
*@paramo
*/
publicstaticvoidcheckInputDate(BaseEntityo){
if("".equals(o.getParams().get("beginTime"))&&"".equals(o.getParams().get("endTime"))){
thrownewInvalidTaskException();
}
StringbeginTime="2019-01-01";
StringendTime=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){
thrownewInvalidTaskException();
}
}
}
这里访问hive肯定需要切换数据源的,因为其它页面还有对mysql的数据访问,需要注意一下。
目前功能看起来很简单,没有用到什么高大上的东西,后面慢慢完善。
以上就是SpringBoot连接Hive实现自助取数的示例的详细内容,更多关于SpringBoot连接Hive的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。