2. 接口数据协议
2.1 HQL语法约定
该部分的HQL由Web Server提交至Hive Server端执行。
根据Hive的特点,除了执行部分SELECT语句会启动MapReduce外,其他如alter、load、insert语句等都不会涉及M/R。由此可知,大部分情况下不会有MapReduce的执行过程日志输出,而目前IDE的日志监控部分仅对有MapReduce执行的查询有处理。根据《基于Hive JDBC实现的Web可视化界面方案V0.2.docx》分析得知,Hive JDBC仅对executeQuery和close方法做了真正实现,所有的HQL语句皆通过executeQuery方法传入并执行。因此,是否启动日志监控功能,只要在此方法的HQL参数前添加日志开关标识即可。
日志开关的标识约定为:{TYPE}_{DEST}_{SN}[_{IP}_{PORT}] #@#@ 。
TYPE:代表语句类型,取值为KILL、QUERY(即select的语句)。
DEST:代表目的地,取值为HBASE、REDIS(FILE、HDFS暂不支持);
SN:为每个Job日志和查询结果数据key的前缀。如,执行A Job的日志单元标识前缀为dataA,那么对于存储在目的地中的key序列为dataA_LOG000001、dataA_LOG000002、dataA_LOG000003、…、dataA_LOGN(N为大于等于0的正整数,在位数不足6位的情况下,前缀补0以达到6位长度),客户端取对应执行日志时,即通过该key值序列逐一取出。而查询结果数据的key前缀为dataA_DATA。
另外特别注意两点:1.编号由000001开始;2.由于语法前缀标识符以下划线”_”分割,那么SN中决不能出现”_”符号,否则数据出错。
IP:目标主机的有效IP地址或域名,该参数在DEST为REDIS时必填,否则可以为空;
PORT:目标主机的有效端口,该参数在DEST为REDIS时必填,否则可以为空。即当DEST为REDIS时,日志开关的标识约定变为:{TYPE}_{DEST}_{SN};
#@#@:为分割标识,在欲新增日志存储方式的语句最前面。#@#@前后各留一个或多个空格。其中TYPE为 KILL时,无需#@#@分隔符及后缀。
下面针对各种情况分别举例:
一、 应用redis转存日志。select * from table 这个查询HQL,假如,流水号设定为20121112151900,redis的ip地址为192.168.8.8,端口为8888,那么查询语句应该更改为:QUERY_REDIS_20121112151900_192.168.8.8_8888 #@#@ select * from table 。
二、 应用hbase转存日志。select * from table 这个查询HQL,假如,流水号设定为20121112151900,那么查询语句应该更改为:QUERY_HBASE_20121112151900 #@#@ select * from table 。
三、 应用redis时kill停止执行任务。 select * from table 这个查询HQL,假如,流水号设定为20121112151900,redis的ip地址为192.168.8.8,端口为8888,那么kill语句应该更改为:KILL_REDIS_20121112151900_192.168.8.8_8888。
四、 应用hbase时kill停止执行任务。 select * from table 这个查询HQL,假如,流水号设定为20121112151900,那么kill语句应该更改为:KILL_HBASE_20121112151900。
调用Statement.executeQuery(sql)执行即可。
2.2 读取日志约定
由Web Server发起读取转存日志的请求。
读取执行日志的方式会随着存放的目的地不同而稍有差异,建议Web Server端封装读取日志的接口,便于灵活切换。下面分别约定从Redis和HBase中读取日志的规则。
日志在redis中以key-value键值对的形式进行存储,其key值是日志开关标识中的SN为前缀,后跟6位从000001开始的序列;value值为具体日志内容的字符串型。
举例说明,假设日志开关的为QUERY_REDIS_20121112151900_192.168.8.8_8888,那么Web Server读取日志时连接的Redis服务端的IP和Port分别为192.168.8.8和8888,再调用redis客户端递增读取以20121112151900_LOG000001、20121112151900_LOG000002、…、20121112151900_LOG00000N(N为大于等于0的正整数,在位数不足6位的情况下,前缀补0,达到6位长度)。
每次读取日志时,同时读取20121112151900_LOG000000的日志标志位,当标志位的以“00”开头时,表示程序正常执行完毕;当以“10”开头时,表示程序仍在执行中;当以“20”开头时,表示程序执行完毕,但是执行过程异常;当以“30”开头时,表示程序异常终止[详见2.5节]。简单代码如下:
Jedis jedis = new Jedis("192.168.8.8", 8888); int num=1; String numStr= String.valueOf(i); numStr=”000000”.subString(0,6- numStr.length())+numStr; String loginfo=jedis.get("20121112151900_LOG " + numStr); System.out.println(loginfo); String logFlag= jedis.get("20121112151900_LOG000000 " ); if(logFlag !=null && logFlag.startWith(“00”)){ //判断状态标志位,并输出提示 } |
日志在HBase中以rowid-value行键与列族值的条记录形式进行存储,其rowid值是日志开关标识中的SN为前缀,后跟6位从000001开始的序列;value值为具体日志内容的字符串型。
举例说明,假设日志开关的为QUERY_HBASE_20121112151900,那么Web Server读取日志时连接的HBase服务端通过hbase-site.xml中进行配置,再调用HBase客户端递增读取以20121112151900_LOG 000001、20121112151900_LOG 000002、…、20121112151900_LOG 00000N(N为大于等于0的正整数,在位数不足6位的情况下,前缀补0,达到6位长度)或者设定rowid值区间批量读取。
每次读取日志时,同时读取20121112151900_LOG000000的日志标志位,当标志位的以“00”开头时,表示程序正常执行完毕;当以“10”开头时,表示程序仍在执行中;当以“20”开头时,表示程序执行完毕,但是执行过程异常;当以“30”开头时,表示程序异常终止[详见2.5节]。简单代码如下:
1. 读取单条记录 |
HTable table = new HTable(conf, "IDE_MR_LOG"); int num=1; String rowKey = String.valueOf(i); rowKey ="20121112151900_LOG " +”000000”.subString(0,6- numStr.length())+numStr; Get get = new Get(rowKey.getBytes()); Result rs = table.get(get); for (KeyValue kv : rs.raw()) { //System.out.print(new String(kv.getRow()) + " "); //System.out.print(new String(kv.getFamily()) + ":"); //System.out.print(new String(kv.getQualifier()) + " "); //System.out.print(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); String logFlag= jedis.get("20121112151900_LOG000000 " ); if(logFlag !=null && logFlag.startWith(“00”)){ //判断状态标志位,并输出提示 } } |
2. 读取多条记录 |
HTable table = new HTable(conf, "IDE_MR_LOG"); int num=1; String startRowKey = String.valueOf(i); startRowKey =” 20121112151900_LOG”+”000000”.subString(0,6- numStr.length())+numStr; String startRowKey = String.valueOf(i); String endRowKey =” 20121112151900_LOG”+”000000”.subString(0,6- numStr.length())+numStr; Scan s = new Scan(startRowKey.getBytes[],endRowKey.getBytes[],); ResultScanner ss = table.getScanner(s); for (Result r : ss) { for (KeyValue kv : rs.raw()) { //System.out.print(new String(kv.getRow()) + " "); //System.out.print(new String(kv.getFamily()) + ":"); //System.out.print(new String(kv.getQualifier()) + " "); //System.out.print(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); String logFlag= jedis.get("20121112151900_LOG000000 " ); if(logFlag !=null && logFlag.startWith(“00”)){ //判断状态标志位,并输出提示 } } } |
2.3 读取查询结果数据约定
由Web Server发起读取转存(方便后续可追踪)查询结果数据的请求。
读取执行查询结果数据的方式会随着存放的目的地不同而稍有差异,建议Web Server端封装读取和写入数据的接口,便于灵活切换。下面分别约定从Redis和HBase中读取查询结果数据的规则。
日志在redis中以key-value键值对的形式进行存储,其key值是日志开关标识中的SN为前缀,后跟+”_DATA”组成数据的key;value值为查询列的元数据和结果数据组装而成的JSON格式的字符串。
拼装的JSON格式为:
{ "metadata":["selcolumn1","selcolumn2",...,"selcolumnN"], "resultdata": [ ["value1","value2",...,"valueN"], ["value1","value2",...,"valueN"], ..., ["value1","value2",...,"valueN"] ] } |
其中,metadata为select语句中查询的列顺序,当列为*时,由元数据ResultSetMetaData取出; resultdata为select语句中查询的列顺序,对应为每一条记录组合而成的数组结构。 |
举例说明,假设日志开关的为QUERY_REDIS_20121112151900_192.168.8.8_8888,那么Web Server读取数据时连接的Redis服务端的IP和Port分别为192.168.8.8和8888,再调用redis客户端读取key值为20121112151900_D的值。简单代码如下:
Jedis jedis = new Jedis("192.168.8.8", 8888); String jsonData=jedis.get("20121112151900_DATA " ); System.out.println(jsonData); |
日志在HBase中以rowid-value行键与列族的条记录形式进行存储,其rowid值是日志开关标识中的SN为前缀,后跟“_D”后再接6位从000001开始的序列;value值为一个列族,列族下对应的列由select后接的查询列(全部转换为小写)生成。如,select a,b,c from table,那么在HBase的列族对应为:value:a, value:b, value:c 。
举例说明,假设日志开关的为QUERY_HBASE_20121112151900,那么Web Server读取查询结果数据时连接的HBase服务端通过hbase-site.xml中进行配置,再调用HBase客户端递增读取以20121112151900_DATA000001、20121112151900_DATA000002、…、20121112151900_DATA00000N(N为大于等于0的正整数,在位数不足6位的情况下,前缀补0,达到6位长度)或者设定rowid值区间批量读取。简单代码如下:
1. 读取单条记录 |
HTable table = new HTable(conf, "IDE_MR_DATA"); int num=1; String rowKey = String.valueOf(i); rowKey =” 20121112151900_DATA”+”000000”.subString(0,6- numStr.length())+numStr; Get get = new Get(rowKey.getBytes()); Result rs = table.get(get); for (KeyValue kv : rs.raw()) { System.out.print(new String(kv.getRow()) + " "); System.out.print(new String(kv.getFamily()) + ":"); System.out.print(new String(kv.getQualifier()) + " "); //System.out.print(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); } |
2. 读取多条记录 |
HTable table = new HTable(conf, "IDE_MR_DATA"); int num=1; String startRowKey = String.valueOf(i); startRowKey =” 20121112151900_DATA”+”000000”.subString(0,6- numStr.length())+numStr; String startRowKey = String.valueOf(i); String endRowKey =” 20121112151900_DATA”+”000000”.subString(0,6- numStr.length())+numStr; Scan s = new Scan(startRowKey.getBytes[],endRowKey.getBytes[],); ResultScanner ss = table.getScanner(s); for (Result r : ss) { for (KeyValue kv : rs.raw()) { System.out.print(new String(kv.getRow()) + " "); System.out.print(new String(kv.getFamily()) + ":"); System.out.print(new String(kv.getQualifier()) + " "); //System.out.print(kv.getTimestamp() + " "); System.out.println(new String(kv.getValue())); } } |
2.4 操作日志存储约定
操作日志必须持久化,存储在RMDB中,操作日志的写入由Web Server完成。
操作日志表字段包括:operator,operteStartTime, operteEndTime,operateContent,operateResult,operateRaletiveRowId,分别表示操作人,操作开始时间,操作结束时间,操作内容,操作结果,操作关联的结果集rowId。
举例说明,假设IDE上线运行一段时间后,想追踪运行情况,那么可以从操作日志中读取具体情况。假设查询日志开关SN为20121112151900的操作历史,那么Web Server读取数据时连接的HBase服务端通过hbase-site.xml中进行配置,再调用HBase客户端递增读取以20121112151900_LOG为rowId。代码为JDBC普通代码,此处略去。
2.5 状态标志位约定
序号 |
编码 |
说明 |
1 |
00#@#@num#@#@概要描述 |
程序执行完毕,日志输出完毕。num为写入日志最终条数 |
2 |
10#@#@num#@#@概要描述 |
程序正在执行中。其中,num为过渡值。 |
3 |
20#@#@num#@#@概要描述 |
程序执行完毕,但其间报有异常。num为写入日志最终条数 |
4 |
30#@#@num#@#@概要描述 |
程序异常终止,日志输出完毕。num为写入日志最终条数 |
注意 |
“#@#@”是编码与中文描述的分隔符,#号后面接中文描述,例如“00#@#@执行完毕”、“20#@#@执行完毕,日志开关中指定的ip和port连接异常”。 读取状态标志位的key或rowid为日志开关标识中SN值加上_LOG000000,即{SN}_LOG000000 |
相关推荐
5. **项目代码**:压缩包中的"项目代码"很可能包含了上述所有步骤的实现代码,可能包括数据采集脚本、Hadoop或Spark作业、数据清洗和转换的Python脚本,以及用于创建可视化界面的Web应用代码(如使用Django、Flask等...
《汽车销售可视化——基于Hadoop、Hive与JavaWeb的大数据项目实践》 在当今的信息化社会,数据已经成为企业决策的重要依据。汽车行业也不例外,通过对汽车销售数据的深度挖掘与分析,可以洞察市场趋势,优化营销...
在本毕业设计项目中,主要涉及了大数据处理与分析以及Web前端开发两个核心领域,具体地,使用Hadoop和Hive构建数据仓库,利用Django框架配合ECharts库来搭建前端展示界面,实现业务指标的可视化。下面将分别对这两个...
4. **数据可视化**:Hue可以通过图表展示查询结果,但有时图表加载失败。这可能与后端服务(如Sentry或Solr)的配置或性能有关。检查相关服务的状态并优化配置。 5. **版本兼容性**:Hue与Hadoop、Hive等组件的版本...
Hive不仅提供了自己的CLI(命令行界面)和Web UI,还支持与多种流行的商业智能(BI)工具和数据可视化工具集成,如Tableau、PowerBI、Apache Superset等。这些工具可以直接连接到Hive,利用Hive的数据仓库能力进行...
- HiveClientsGraph:可视化Hive客户端的活动图。 #### 三、Hive巡检 定期进行Hive巡检是保障Hive稳定运行的重要手段之一。 - **查看CDH集群-hive-事件** - 检查Cloudera Manager中Hive服务的事件日志,确保...
总结,基于Hadoop的Web日志分析是一个复杂而重要的过程,涵盖了数据预处理、统计分析、结果导出和数据可视化等多个环节。通过对这些知识点的深入理解和应用,可以有效地利用Web日志数据,提升网站运营效率和用户体验...
在大数据领域,日志分析是一项至...总结起来,这个项目结合了Hadoop生态系统中的多个组件,构建了一个完整的网站日志分析解决方案,实现了数据的高效存储、处理和可视化,对于大数据分析和业务决策具有很高的实用价值。
综上所述,“hivequeen”是一个强大的工具,结合了Django的Web开发能力和Ansible的自动化能力,为Linux服务器管理提供了一种现代化、易用的解决方案。对于那些希望提升IT基础设施管理水平的团队来说,这是一个极具...
总体而言,分布式网络日志分析系统通过结合当前的大数据处理技术和分布式系统架构,实现了从海量日志数据中自动采集、分析到结果可视化的一整套流程。这一系统可以有效地帮助网站运营者监控网站运行状态,分析用户...
2. **节点配置**:对于每个工作流节点,如MapReduce、Hive等,用户可以通过可视化界面设置参数,无需直接编辑XML文件。 3. **定时与依赖设置**:协调器和布尔作业的配置也变得更加直观,用户可以方便地设定执行时间...
用户可以通过页面选择数据源即可创建数据同步任务,支持RDBMS,Hive,HBase,ClickHouse,MongoDB等数据源,RDBMS数据源可批量创建数据同步任务,支持实时查看数据同步进度及日志并提供终止同步功能,集成并二次开发...
5. 数据可视化:将处理后的结果导入到如Hive或Pig这样的数据仓库,或者Elasticsearch等搜索引擎,再通过工具如Tableau或Kibana进行数据可视化展示。 四、Hadoop生态系统的扩展 随着大数据技术的发展,Hadoop生态...
本课程旨在通过Spark2.x新闻网大数据实时分析可视化系统,讲解大数据项目的业务分析、技术选型、架构设计、集群规划、安装部署、整合继承与开发和 web可视化交互设计。课程特色包括全方位、全流程讲解、大数据项目的...
Linux,Web,匿名器,SQL ReCaser,Hadoop,Hive,Solr,大数据和NoSQL工具 DevOps,Linux,SQL,Web,大数据,NoSQL,各种编程语言和Kubernetes的模板。 所有程序都具有--help 。 也可以看看: repos包含数百种...
用户可通过页面选择数据源即可创建数据同步任务,支持RDBMS、Hive、HBase、ClickHouse、MongoDB等数据源,RDBMS数据源可批量创建数据同步任务,支持实时查看数据同步进度及日志并提供终止同步功能,集成并二次开发...
而Zeppelin则是一个交互式的笔记本环境,支持多种语言,包括Hive,用于数据分析和可视化。在这个“Hive实战项目数据文件和Zeppelin源文件”中,我们很显然会涉及到这两个组件的结合使用。 Hive的核心概念包括表、...
数据分析结果导出及可视化阶段是将Hive分析的结果导出到MySQL数据库中,并通过Python程序设计实现数据结果的图形化展示,以便于直观地理解和汇报分析结果。 整个网站日志分析案例覆盖了大数据平台的搭建与应用、...
- **介绍**:ECharts是一个纯JavaScript的图表库,提供丰富的可视化图形,易于集成到Web应用中。 - **特点**:高度可定制化,支持多种图表类型,包括折线图、柱状图、饼图等。 ### 项目背景与功能 #### 项目背景 ...
Apache Zeppelin 是一种基于 Web 的数据可视化工具,能够提供实时的数据可视化和分析服务。 大数据中台架构栈是指在大数据处理过程中,各个技术组件之间的整体架构设计。该架构栈通常包括数据采集、数据传输、数据...