日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot連接Hive實(shí)現(xiàn)自助取數(shù)的示例

瀏覽:123日期:2023-04-05 11:03:29

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

公司運(yùn)營(yíng)免不了讓我們數(shù)據(jù)做一些臨時(shí)取數(shù),這些取數(shù)有時(shí)候是重復(fù)的,或者可以做成可配置的。需要開(kāi)發(fā)成界面,供他們選擇,自然想到SpringBoot連接Hive,可以把取數(shù)做成一鍵生成,或者讓他們自己寫(xiě)sql,通常大多人是不會(huì)sql的。

1. 需要的依賴配置

為了節(jié)省篇幅,這里給出hiveserver2方式連接hive主要的maven依賴,父工程springboot依賴省略。

<!-- 版本信息 --><properties> <hadoop.version>2.6.5</hadoop.version> <mybatis.version>3.2.7</mybatis.version> <scopeType>compile</scopeType></properties><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version></dependency><!-- hadoop依賴 --><dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> <scope>${scopeType}</scope></dependency><!-- hive-jdbc --><!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc --><dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </exclusion> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> <version>1.2.1</version> <scope>${scopeType}</scope></dependency><!-- 解析html --><dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.8.3</version></dependency>

application-test.yml配置數(shù)據(jù)庫(kù)連接,這里用的是druid連接池管理hiveserver2連接,也是沒(méi)有問(wèn)題的。

# Spring配置spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 多數(shù)據(jù)源**省略若干*** # hive數(shù)據(jù)源 slave3: # 從數(shù)據(jù)源開(kāi)關(guān)/默認(rèn)關(guān)閉 enabled: true driverClassName: org.apache.hive.jdbc.HiveDriver url: jdbc:hive2://cdh:10000/default username: bigdata password: bigdata

2. 代碼實(shí)現(xiàn)

代碼實(shí)現(xiàn)跟其它程序一樣,都是mapper、service、controller層,套路一模一樣。一共設(shè)置了實(shí)時(shí)和離線兩個(gè)yarn資源隊(duì)列,由于其它部門(mén)人使用可能存在隊(duì)列壓力過(guò)大的情況,需要對(duì)數(shù)據(jù)量按照每次查詢的數(shù)據(jù)范圍不超過(guò)60天來(lái)限制,和此時(shí)集群使用資源不能大于55%,這里重點(diǎn)說(shuō)明一下controller層對(duì)數(shù)據(jù)量的預(yù)防。

實(shí)體類(lèi)UserModel:

@NoArgsConstructor@AllArgsConstructor@Data@ToStringpublic class UserModel extends BaseEntity{ private String userId; private Integer count;}

2.1 集群資源使用率不大于55%因?yàn)楹芏鄻I(yè)務(wù)查詢邏輯controller都要用到數(shù)據(jù)量防御過(guò)大的問(wèn)題,這里使用了被Spring切面關(guān)聯(lián)的注解來(lái)標(biāo)識(shí)controller。

定義切面YarnResourceAspect,并且關(guān)聯(lián)注解@YarnResource

@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface YarnResource {}@Aspect@Componentpublic class YarnResourceAspect { private static final Logger log = LoggerFactory.getLogger(YarnResourceAspect.class); /** * 配置切入點(diǎn) */ @Pointcut('@annotation(com.ruoyi.common.annotation.YarnResource)') public void yarnResourcdPointCut(){ } /** * 檢查yarn的資源是否可用 */ @Before('yarnResourcdPointCut()') public void before(){ log.info('************************************檢查yarn的資源是否可用*******************************'); // yarn資源緊張 if(!YarnClient.yarnResourceOk()){ throw new InvalidStatusException(); } }}

獲取yarn的資源使用數(shù)據(jù):

@Slf4jpublic class YarnClient { /** * yarn資源不能超過(guò)多少 */ private static final int YARN_RESOURCE = 55; /** * * @return true : 表示資源正常, false: 資源緊張 */ 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); // 請(qǐng)求超時(shí)5秒 conn.setConnectTimeout(5000); // 設(shè)置HTTP頭: conn.setRequestProperty('Accept', '*/*'); conn.setRequestProperty('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'); // 連接并發(fā)送HTTP請(qǐng)求: conn.connect(); // 判斷HTTP響應(yīng)是否200: if (conn.getResponseCode() != 200) { throw new RuntimeException('bad response'); } // 獲取所有響應(yīng)Header: Map<String, List<String>> map = conn.getHeaderFields(); for (String key : map.keySet()) { System.out.println(key + ': ' + map.get(key)); } // 獲取響應(yīng)內(nèi)容: InputStream input = conn.getInputStream(); byte[] datas = null; try { // 從輸入流中讀取數(shù)據(jù) datas = readInputStream(input); } catch (Exception e) { e.printStackTrace(); } String result = new String(datas, 'UTF-8');// 將二進(jìn)制流轉(zhuǎn)為String Document document = Jsoup.parse(result); Elements elements = document.getElementsByClass('qstats'); String[] ratios = elements.text().split('used'); return Double.valueOf(ratios[3].replace('%', '')) < YARN_RESOURCE; } catch (IOException e) { log.error('yarn資源獲取失敗'); } return false; } private static byte[] readInputStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); outStream.close(); inStream.close(); return data; }}

在controller上通過(guò)注解@YarnResource標(biāo)識(shí):

@Controller@RequestMapping('/hero/hive')public class HiveController { /** * html 文件地址前綴 */ 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 查詢數(shù)據(jù)跨度不超過(guò)60天檢查這樣每次請(qǐng)求進(jìn)入controller的時(shí)候就會(huì)自動(dòng)檢查查詢的日期是否超過(guò)60天了,防止載入數(shù)據(jù)過(guò)多,引發(fā)其它任務(wù)資源不夠。

public class DateCheckUtils { /** * 對(duì)前臺(tái)傳入過(guò)來(lái)的日期進(jìn)行判斷,防止查詢大量數(shù)據(jù),造成集群負(fù)載過(guò)大 * @param o */ 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')); } // 查詢數(shù)據(jù)時(shí)間跨度大于兩個(gè)月 if(DateUtils.getDayBetween(beginTime, endTime) > 60){ throw new InvalidTaskException(); } }}

這里訪問(wèn)hive肯定需要切換數(shù)據(jù)源的,因?yàn)槠渌?yè)面還有對(duì)mysql的數(shù)據(jù)訪問(wèn),需要注意一下。

目前功能看起來(lái)很簡(jiǎn)單,沒(méi)有用到什么高大上的東西,后面慢慢完善。

以上就是SpringBoot連接Hive實(shí)現(xiàn)自助取數(shù)的示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot連接Hive的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费日韩一区二区三区| 日韩三区在线| 蜜桃av一区二区| 丝袜美腿亚洲色图| 丝袜美腿亚洲一区| 中文字幕免费一区二区| 中文字幕一区二区精品区| 一本一道久久a久久| 亚洲在线国产日韩欧美| 亚洲一区二区三区无吗| 日本亚洲最大的色成网站www | 久久国产精品免费精品3p| 欧美日韩18| 国产一区二区精品福利地址| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 日本视频中文字幕一区二区三区| 日本久久二区| 久久久久亚洲精品中文字幕| 久久男人天堂| 136国产福利精品导航网址| 亚洲一区国产| 日韩国产在线观看一区| 国产精品亚洲产品| 国产成人精品免费视| 久久婷婷亚洲| 久久国产99| 免费在线观看日韩欧美| 久久精品97| 超级白嫩亚洲国产第一| 99精品综合| 免费在线观看一区二区三区| 国产女人18毛片水真多18精品| 日韩综合一区| 亚洲欧美久久久| 国产免费av国片精品草莓男男| 日韩激情av在线| 91亚洲成人| 午夜在线精品| 久久国产乱子精品免费女| 日韩在线精品| 亚洲涩涩av| 国产成人a视频高清在线观看| 欧美精品黄色| 国产欧美一区二区精品久久久| 精品少妇一区| 国产精品毛片一区二区三区| 欧美亚洲tv| 久久亚洲精品中文字幕蜜潮电影| 亚洲一级大片| 日本在线啊啊| 深夜福利一区| 日产精品一区二区| 亚洲丝袜啪啪| 黑森林国产精品av| 伊人久久大香伊蕉在人线观看热v| 精品色999| 亚洲九九精品| 日韩在线高清| 国产女人18毛片水真多18精品| 免费污视频在线一区| 日韩精品社区| 人人精品亚洲| 国产精品毛片久久久| 亚洲精品一区二区妖精| 国产精品chinese| 中文久久精品| 成人在线免费观看网站| 亚洲3区在线| 99视频精品全国免费| 国产乱码精品| 国产精品美女久久久| 亚洲黄色免费av| 欧美中文高清| 亚洲在线网站| 成人羞羞在线观看网站| 国产另类在线| 蜜桃久久av一区| 成人精品亚洲| 国内精品美女在线观看| 日本亚洲不卡| 亚洲欧洲一区二区天堂久久| 精品久久久久中文字幕小说| 日韩av在线播放中文字幕| 日韩午夜av| 久久国产欧美| 最新中文字幕在线播放| 欧美激情五月| 欧美一区影院| 日本在线视频一区二区| 亚洲欧美日韩国产综合精品二区| 精品三区视频| 国产精品乱战久久久| 亚洲精品进入| 蜜桃久久av| 午夜精品免费| 欧美久久精品一级c片| sm久久捆绑调教精品一区| 欧美日本不卡| 青草av.久久免费一区| 亚洲一区二区日韩| 国产女优一区| 99国内精品| 欧美1级日本1级| 成人羞羞在线观看网站| 国产精品99视频| 欧美综合社区国产| 日本不卡视频在线观看| 日韩三级精品| 日韩一区免费| 青青草视频一区| 91精品一区| 国产亚洲一区二区三区啪| 日韩激情啪啪| 88久久精品| 国产欧美日韩影院| 亚洲不卡视频| 日本aⅴ亚洲精品中文乱码| 亚洲精品大片| 欧美自拍一区| 国产精品免费不| 国产欧美日本| 欧美黄页在线免费观看 | 精品中文字幕一区二区三区四区| 国产精品欧美大片| 国产精品欧美一区二区三区不卡 | 日韩免费精品| 日韩精品免费观看视频| 日韩精品欧美大片| 国产情侣一区| 国产一区二区三区不卡视频网站| 97精品在线| 91视频一区| 国产99久久久国产精品成人免费| 婷婷精品视频| 亚洲一区免费| 亚洲aa在线| 国产毛片一区二区三区| 久久精品国产99国产精品| 日产精品一区二区| 在线成人动漫av| 丝袜亚洲另类欧美| 午夜亚洲福利| 国产精品嫩草影院在线看| 国产aa精品| 欧美日韩在线网站| 久久高清免费观看| 亚洲精品成a人ⅴ香蕉片| 国产一卡不卡| 亚洲啊v在线| 在线综合亚洲| 欧美亚洲色图校园春色| 国产成人免费视频网站视频社区| 中文字幕人成乱码在线观看 | 国产成人久久精品麻豆二区 | 日韩国产欧美三级| 精品一区二区三区免费看| 日韩视频网站在线观看| 99视频在线精品国自产拍免费观看| 亚洲丝袜啪啪| 精品午夜久久| 国产精品88久久久久久| 日产欧产美韩系列久久99| 久久免费福利| 91久久黄色| 久久不见久久见国语| 久久精品成人| 日韩精品午夜视频| 日韩av自拍| 日韩午夜高潮| 国产精品久久久一区二区| 欧美日韩视频免费观看| 亚洲欧美日本日韩| 欧美aaaaaa午夜精品| 久久精品123| 日本免费新一区视频| 波多野结衣久久精品| 最近国产精品视频| 成人台湾亚洲精品一区二区| 丝袜a∨在线一区二区三区不卡| 久久av资源| 国产偷自视频区视频一区二区| 国产精品15p| 9国产精品视频| 美女久久久久久| 亚洲经典在线| 精品入口麻豆88视频| 麻豆亚洲精品| 久久久久久一区二区| 蜜桃av一区二区| 亚洲综合在线电影| 国产亚洲一卡2卡3卡4卡新区| 久久视频精品| 麻豆视频观看网址久久| 麻豆9191精品国产| 国产精品久久观看| 婷婷综合电影| 亚洲一级特黄| 国内精品伊人| 日本在线不卡视频| 亚洲高清激情|