成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

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

公司運營免不了讓我們數(shù)據(jù)做一些臨時取數(shù),這些取數(shù)有時候是重復的,或者可以做成可配置的。需要開發(fā)成界面,供他們選擇,自然想到SpringBoot連接Hive,可以把取數(shù)做成一鍵生成,或者讓他們自己寫sql,通常大多人是不會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ù)庫連接,這里用的是druid連接池管理hiveserver2連接,也是沒有問題的。

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

2. 代碼實現(xiàn)

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

實體類UserModel:

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

2.1 集群資源使用率不大于55%因為很多業(yè)務查詢邏輯controller都要用到數(shù)據(jù)量防御過大的問題,這里使用了被Spring切面關聯(lián)的注解來標識controller。

定義切面YarnResourceAspect,并且關聯(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); /** * 配置切入點 */ @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資源不能超過多少 */ 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); // 請求超時5秒 conn.setConnectTimeout(5000); // 設置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請求: conn.connect(); // 判斷HTTP響應是否200: if (conn.getResponseCode() != 200) { throw new RuntimeException('bad response'); } // 獲取所有響應Header: Map<String, List<String>> map = conn.getHeaderFields(); for (String key : map.keySet()) { System.out.println(key + ': ' + map.get(key)); } // 獲取響應內(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');// 將二進制流轉(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上通過注解@YarnResource標識:

@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ù)跨度不超過60天檢查這樣每次請求進入controller的時候就會自動檢查查詢的日期是否超過60天了,防止載入數(shù)據(jù)過多,引發(fā)其它任務資源不夠。

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

這里訪問hive肯定需要切換數(shù)據(jù)源的,因為其它頁面還有對mysql的數(shù)據(jù)訪問,需要注意一下。

目前功能看起來很簡單,沒有用到什么高大上的東西,后面慢慢完善。

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

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久人人超碰| 狠狠色综合播放一区二区| 亚洲福利视频三区| 色综合久久综合网97色综合| 69久久夜色精品国产69蝌蚪网| 免费在线成人网| 色成人在线视频| 奇米精品一区二区三区四区| 狂野欧美一区| 五月婷婷色综合| 久久资源在线| 日本在线不卡视频一二三区| 一本到不卡精品视频在线观看| 日韩综合一区二区| 狂野欧美一区| 久久精品72免费观看| 欧美日韩一区二区三区视频| 精品一区二区综合| 欧美日韩激情一区二区| 久久国产婷婷国产香蕉| 欧美日韩电影在线| 国产一区高清在线| 精品蜜桃在线看| 欧美在线亚洲| 国产精品视频九色porn| 极品av少妇一区二区| 中文字幕视频一区| 韩日成人在线| 亚洲人成网站在线| 在线视频精品一区| 亚洲高清免费一级二级三级| 日本道色综合久久| 国产精品一区二区不卡| 精品国产麻豆免费人成网站| 欧美 亚欧 日韩视频在线| 国产精品视频在线看| 亚洲精品在线视频观看| 亚洲午夜影视影院在线观看| 日本精品一区二区三区高清| 久久99国产精品免费网站| 91精品国产黑色紧身裤美女| youjizz国产精品| 中文字幕在线不卡一区| 中文一区二区| 天堂蜜桃一区二区三区| 欧美色图在线观看| 成人精品视频一区| 亚洲视频在线观看三级| 美脚丝袜一区二区三区在线观看 | 精品久久久久久久一区二区蜜臀| 91香蕉视频黄| 亚洲天堂免费在线观看视频| 久久久天天操| 国产精品一区二区免费不卡| 久久精品综合网| 亚洲精品少妇| 人人狠狠综合久久亚洲| 欧美人妇做爰xxxⅹ性高电影| 成人免费观看av| 亚洲日穴在线视频| 色美美综合视频| 国产成人免费在线观看| 国产精品婷婷午夜在线观看| 久久久精品国产一区二区三区| 国产资源精品在线观看| 久久久99精品免费观看不卡| 在线亚洲激情| 国产一区在线精品| 国产片一区二区| 久久亚洲高清| 99久精品国产| 亚洲成人综合网站| 欧美一区二区在线观看| 亚洲午夜激情| 另类的小说在线视频另类成人小视频在线| 精品久久久网站| 中文日韩在线| 国产在线看一区| 国产精品免费人成网站| 91久久精品网| 欧美国产精品| 美日韩一级片在线观看| 久久久久久久久久久电影| 久久大逼视频| 成人毛片在线观看| 亚洲私人黄色宅男| 69久久夜色精品国产69蝌蚪网 | 一本大道久久a久久精二百| 风间由美性色一区二区三区| 亚洲视频网在线直播| 欧美性高清videossexo| 欧美日韩精品免费观看 | 亚洲免费综合| 成人性色生活片免费看爆迷你毛片| 成人免费在线播放视频| 欧美日韩电影一区| 亚洲国产精品一区制服丝袜 | 精品一区二区在线看| 中文字幕巨乱亚洲| 欧美午夜不卡视频| 国内外成人免费视频| 国产一区二区不卡老阿姨| 亚洲激情网站免费观看| 日韩欧美资源站| 欧美亚洲三区| 欧美高清一区二区| 精品一区二区三区免费观看 | 香蕉av777xxx色综合一区| 成人激情校园春色| 香蕉成人啪国产精品视频综合网| 久久久久久黄色| 欧美性色黄大片手机版| 亚洲二区三区四区| 成人性生交大片免费看在线播放| 亚洲成av人片在线观看无码| 国产婷婷色一区二区三区在线| 欧美优质美女网站| 在线观看成人一级片| 成人成人成人在线视频| 秋霞电影网一区二区| 亚洲精品乱码久久久久久日本蜜臀| 精品免费日韩av| 欧美色男人天堂| 国产一区二区三区久久久久久久久| 99视频热这里只有精品免费| 精一区二区三区| 亚洲国产视频网站| 国产精品久久影院| 日韩三区在线观看| 在线看不卡av| 亚洲一区二区三区四区中文| 欧美日本中文| 成人高清伦理免费影院在线观看| 捆绑调教美女网站视频一区| 亚洲国产精品自拍| 亚洲色图一区二区| 欧美国产精品专区| 欧美一级黄色录像| 欧美日韩一区二区三区视频| 美女诱惑一区| 亚洲欧洲精品一区二区| 午夜国产精品视频免费体验区| 成人禁用看黄a在线| 国产精品白丝jk白祙喷水网站| 美女视频免费一区| 日韩av一二三| 亚洲超碰97人人做人人爱| 亚洲欧美日韩国产成人精品影院| 欧美—级在线免费片| 久久亚区不卡日本| 日韩免费福利电影在线观看| 欧美老女人第四色| 欧美在线制服丝袜| 色域天天综合网| 亚洲一区网站| 一区二区三区免费看| 亚洲承认在线| 激情综合视频| 红桃视频亚洲| 国产精品成人观看视频免费| 欧美女激情福利| 91免费版pro下载短视频| 成人app软件下载大全免费| 丰满放荡岳乱妇91ww| 国产成人av一区二区| 国产一二精品视频| 国产一区二区不卡在线| 久久国产精品免费| 韩国中文字幕2020精品| 蜜臀精品久久久久久蜜臀 | 日本不卡高清视频| 婷婷久久综合九色国产成人| 亚洲午夜精品在线| 午夜影视日本亚洲欧洲精品| 亚洲国产一二三| 日日骚欧美日韩| 日产国产高清一区二区三区| 免费欧美高清视频| 美女视频黄频大全不卡视频在线播放| 五月天丁香久久| 日本午夜精品一区二区三区电影| 欧美aaaaa成人免费观看视频| 免费久久99精品国产| 麻豆成人免费电影| 久久爱www久久做| 国产一区欧美日韩| 国产黑丝在线一区二区三区| 懂色av中文字幕一区二区三区| 成人精品免费看| 91日韩精品一区| 国产中文一区二区| 亚洲福利国产| 国产精品视区| 91国产免费看| 51久久夜色精品国产麻豆| 欧美xxxx老人做受| 亚洲国产成人一区二区三区| 亚洲免费伊人电影| 亚洲成人午夜电影| 欧美aaa在线|