精华内容
下载资源
问答
  • 山东易普特录波数据离线分析软件,可用于继电保护装置录波图查看、解析以及其他分析,有两个案例以供大家使用。电力系统继电保护专业福音。
  • 山大电力录波数据离线分析软件,继电保护波形查看、分析专用。
  • GPSReport 毕业设计社交网络数据分析系统-web展示
  • AFM数据离线分析软件Nanoscope_Analysis简易使用方法 打开软件 任选一项如需立即查看文件直接按No 打开文件 测试条件 点击可在下拉菜单中选择0阶0th 1阶1st,2阶(2nd)3阶(3rd) 确定后执行 平滑图像 0阶平滑对应平面内...
  • 在99:2100/上的相关资料文件夹下载 NanoScope_Analysis_v140r3sr2.exe AFM图像离线分析软件 之后双击左键安装软件;如果样品上有明显过高的非基底特征如下图中亮点需要使用遮蔽框将这些位置遮蔽后点右键画框再execute...
  • Social_Report 毕业设计社交网络数据分析系统-web展示
  • 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 参考借鉴 | 实用可编辑 ...
  • 在99:2100/上的相关资料文件夹下载 NanoScope_Analysis_v140r3sr2.exe AFM图像离线分析软件 之后双击左键安装软件;如果样品上有明显过高的非基底特征如下图中亮点需要使用遮蔽框将这些位置遮蔽后点右键画框再execute...
  • 数据离线分析:kafka+flume+hdfs

    千次阅读 2018-04-15 22:15:27
    数据采集到kafka中之后,既可以对数据进行离线分析,又可以对数据进行实时分析,有些数据适合进行离线分析,比如用户画像。离线分析,需要将数据从kafka中存到hdfs中,这里使用flume,将数据从kafka中导入到hdfs中。...

           数据采集到kafka中之后,既可以对数据进行离线分析,又可以对数据进行实时分析,有些数据适合进行离线分析,比如用户画像。离线分析,需要将数据从kafka中存到hdfs中,这里使用flume,将数据从kafka中导入到hdfs中。flume的启动配置文件(kafkaToHdfs.conf):

    # ------------------- 定义数据流----------------------
    # source的名字
    a1.sources = s1
    a1.channels = c1
    a1.sinks = k1
    #-------- kafkaSource相关配置-----------------
    a1.sources.s1.type = org.apache.flume.source.kafka.KafkaSource
    a1.sources.s1.channels = c1
    a1.sources.s1.batchSize = 5000
    a1.sources.s1.kafka.bootstrap.servers = mini02:9092,mini03:9092,mini04:9092
    a1.sources.s1.kafka.topics = gsNgixTopic01
    a1.sources.s1.kafka.consumer.group.id = flumetest02
    #---------hdfsSink 相关配置------------------
    a1.sinks.k1.type = hdfs
    a1.sinks.k1.channel = c1
    a1.sinks.k1.hdfs.path = hdfs://mini02:9000/wc/%{topic}/%y-%m-%d
    a1.sinks.k1.hdfs.rollSize = 0
    a1.sinks.k1.hdfs.rollCount = 0
    a1.sinks.k1.hdfs.rollInterval = 5
    a1.sinks.k1.hdfs.threadsPoolSize = 30
    a1.sinks.k1.hdfs.fileType=DataStream
    a1.sinks.k1.hdfs.writeFormat=Text
    #------- memoryChannel相关配置-------------------------
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 100000
    a1.channels.c1.transactionCapacity = 10000
    
    #注意:a1.sources.s1.kafka.consumer.group.id的配置
    //启动flume
    ./bin/flume-ng agent -n a1 -c conf/ -f conf/tempConf/kafkaToHdfs.conf


    展开全文
  • 通过分析网络监控离线分析处理的负载特征, 给出了一种面向数据离线分析处理的并行多策略查询中间件, 并利用多策略及DBMS实现了局部结果的汇总, 对需后处理查询的系统扩展性、不需后处理查询的系统扩展性分别进行了...
  • 目录 整体流程概述 稳妥的采集数据方法 FTP服务器上的Flume配置文件如下 其它常见问题 ...应用层代码部署到分布式mycluster1 ...数据采集(Flume采集nginx日志) ...整个离线分析的总体架构就是使用Flume...

    目录

     

    整体流程概述

    稳妥的采集数据方法

    FTP服务器上的Flume配置文件如下

    其它常见问题

    应用层代码部署到分布式mycluster1

    数据采集(Flume采集nginx日志)

    Visits数据分析

    大数据离线自动执行流程--基于jenkins


    整体流程概述

    首先声明,这个架构模型只能是离线分析技术的一个简单的入门级架构。

    整个离线分析的总体架构就是使用Flume从FTP服务器上采集日志文件,并存储在Hadoop HDFS文件系统上,再接着用Hadoop的mapreduce清洗日志文件,最后使用HIVE构建数据仓库做离线分析。任务的调度使用Shell脚本完成,当然大家也可以尝试一些自动化的任务调度工具,比如说AZKABAN或者OOZIE等。本次任务调度工具使用OOZIE。分析所使用的点击流日志文件主要来自Nginx的access.log日志文件,需要注意的是在这里并不是用Flume直接去生产环境上拉取nginx的日志文件,而是多设置了一层FTP服务器来缓存所有的日志文件,然后再用Flume监听FTP服务器上指定的目录并拉取目录里的日志文件到HDFS服务器上(具体原因下面分析)。从生产环境推送日志文件到FTP服务器的操作可以通过Shell脚本配合Crontab定时器来实现。一般在WEB系统中,用户对站点的页面的访问浏览,点击行为等一系列的数据都会记录在日志中,每一条日志记录就代表着上图中的一个数据点;而点击流数据关注的就是所有这些点连起来后的一个完整的网站浏览行为记录,可以认为是一个用户对网站的浏览session。比如说用户从哪一个外站进入到当前的网站,用户接下来浏览了当前网站的哪些页面,点击了哪些图片链接按钮等一系列的行为记录,这一个整体的信息就称为是该用户的点击流记录。本次设计的离线分析系统就是收集WEB系统中产生的这些数据日志,并清洗日志内容存储分布式的HDFS文件存储系统上,接着使用离线分析工具HIVE去统计所有用户的点击流信息。

    稳妥的采集数据方法

    网站会通过前端JS代码或服务器端的后台代码收集用户浏览数据并存储在网站服务器中。一般运维人员会在离线分析系统和真实生产环境之间部署FTP服务器,并将生产环境上的用户数据每天定时发送到FTP服务器上,离线分析系统就会从FTP服务上采集数据而不会影响到生产环境。    
    采集数据的方式有多种,一种是通过自己编写shell脚本或Java编程采集数据,但是工作量大,不方便维护,另一种就是直接使用第三方框架去进行日志的采集,一般第三方框架的健壮性,容错性和易用性都做得很好也易于维护。本文采用第三方框架Flume进行日志采集,Flume是一个分布式的高效的日志采集系统,它能把分布在不同服务器上的海量日志文件数据统一收集到一个集中的存储资源中,Flume是Apache的一个顶级项目,与Hadoop也有很好的兼容性。现在的flume-ng也是一个高可用的框架。Flume的agent是运行在JVM上的,所以各个服务器上的JVM环境必不可少。每一个Flume agent部署在一台服务器上,Flume会收集web server 产生的日志数据,并封装成一个个的事件发送给Flume Agent的Source,Flume Agent Source会消费这些收集来的数据事件并放在Flume Agent Channel,Flume Agent Sink会从Channel中收集这些采集过来的数据,要么存储在本地的文件系统中要么作为一个消费资源分发给下一个装在分布式系统中其它服务器上的Flume进行处理。Flume提供了点对点的高可用的保障,某个服务器上的Flume Agent Channel中的数据只有确保传输到了另一个服务器上的Flume Agent Channel里或者正确保存到了本地的文件存储系统中,才会被移除。

    ☆☆☆每一个FTP服务器以及Hadoop的name node服务器上都要部署一个Flume Agent;FTP的Flume Agent采集Web Server的日志并汇总到name node服务器上的Flume Agent,最后由hadoop name node服务器将所有的日志数据下沉到分布式的文件存储系统HDFS上面。
    ※※※※由于目前没有配置FTP服务器,暂时直接从nginx的access.log拉取日志到HDFS※※※
    Spooling Directory Source 和 exec source区别:
    当Flume服务down掉的时候Spooling Directory Source能记录上一次读取到的位置,而Exec Source则没有,需要用户自己去处理,当重启Flume服务器的时候如果处理不好就会有重复数据的问题。当然Spooling Directory Source也是有缺点的,会对读取过的文件重命名,所以多架一层FTP服务器也是为了避免Flume“污染”生产环境。Spooling Directory Source另外一个比较大的缺点就是无法做到灵活监听某个文件夹底下所有子文件夹里的所有文件里新追加的内容。关于这些问题的解决方案也有很多,比如选择其它的日志采集工具,像logstash等。
    本次按照直接从测试环境拉取nginx的access.log的日志数据下沉到HDFS存储系统。
    配置直接采集过程在sheet页Flume中已经完成!!

    FTP服务器上的Flume配置文件如下

    agent.channels = memorychannel        
    agent.sinks = target        
            
    agent.sources.origin.type = spooldir        
    agent.sources.origin.spoolDir = /export/data/trivial/weblogs        
    agent.sources.origin.channels = memorychannel        
    agent.sources.origin.deserializer.maxLineLength = 2048        
            
    agent.sources.origin.interceptors = i2        
    agent.sources.origin.interceptors.i2.type = host        
    agent.sources.origin.interceptors.i2.hostHeader = hostname        
            
    agent.sinks.loggerSink.type = logger        
    agent.sinks.loggerSink.channel = memorychannel        
            
    agent.channels.memorychannel.type = memory        
    agent.channels.memorychannel.capacity = 10000        
            
    agent.sinks.target.type = avro        
    agent.sinks.target.channel = memorychannel        
    agent.sinks.target.hostname = 172.16.124.130        
    agent.sinks.target.port = 4545   

    Flume Agent Source可以通过配置deserializer.maxLineLength这个属性来指定每个Event的大小,默认是每个Event是2048个byte。Flume Agent Channel的大小默认等于于本地服务器上JVM所获取到的内存的80%,用户可以通过byteCapacityBufferPercentage和byteCapacity两个参数去进行优化。需要特别注意的是FTP上放入Flume监听的文件夹中的日志文件不能同名,不然Flume会报错并停止工作,最好的解决方案就是为每份日志文件拼上时间戳。    
    在Hadoop服务器上的配置文件如下:

    agent.sources = origin        
    agent.channels = memorychannel        
    agent.sinks = target        
            
    agent.sources.origin.type = avro        
    agent.sources.origin.channels = memorychannel        
    agent.sources.origin.bind = 0.0.0.0        
    agent.sources.origin.port = 4545        
            
    #agent.sources.origin.interceptors = i1 i2        
    #agent.sources.origin.interceptors.i1.type = timestamp        
    #agent.sources.origin.interceptors.i2.type = host        
    #agent.sources.origin.interceptors.i2.hostHeader = hostname        
            
    agent.sinks.loggerSink.type = logger        
    agent.sinks.loggerSink.channel = memorychannel        
            
    agent.channels.memorychannel.type = memory        
    agent.channels.memorychannel.capacity = 5000000        
    agent.channels.memorychannel.transactionCapacity = 1000000        
            
    agent.sinks.target.type = hdfs        
    agent.sinks.target.channel = memorychannel        
    agent.sinks.target.hdfs.path = /flume/events/%y-%m-%d/%H%M%S        
    agent.sinks.target.hdfs.filePrefix = data-%{hostname}        
    agent.sinks.target.hdfs.rollInterval = 60        
    agent.sinks.target.hdfs.rollSize = 1073741824        
    agent.sinks.target.hdfs.rollCount = 1000000        
    agent.sinks.target.hdfs.round = true        
    agent.sinks.target.hdfs.roundValue = 10        
    agent.sinks.target.hdfs.roundUnit = minute        
    agent.sinks.target.hdfs.useLocalTimeStamp = true        
    agent.sinks.target.hdfs.minBlockReplicas=1        
    agent.sinks.target.hdfs.writeFormat=Text        
    agent.sinks.target.hdfs.fileType=DataStream

    round, roundValue,roundUnit三个参数是用来配置每10分钟在hdfs里生成一个文件夹保存从FTP服务器上拉取下来的数据。

    其它常见问题

    ①使用Flume拉取文件到HDFS中会遇到将文件分散成多个1KB-5KB的小文件的问题:    
    需要注意的是如果遇到Flume会将拉取过来的文件分成很多份1KB-5KB的小文件存储到HDFS上,那么很可能是HDFS Sink的配置不正确,导致系统使用了默认配置。spooldir类型的source是将指定目录中的文件的每一行封装成一个event放入到channel中,默认每一行最大读取1024个字符。在HDFS Sink端主要是通过rollInterval(默认30秒), rollSize(默认1KB), rollCount(默认10个event)3个属性来决定写进HDFS的分片文件的大小。rollInterval表示经过多少秒后就将当前.tmp文件(写入的是从channel中过来的events)下沉到HDFS文件系统中,rollSize表示一旦.tmp文件达到一定的size后,就下沉到HDFS文件系统中,rollCount表示.tmp文件一旦写入了指定数量的events就下沉到HDFS文件系统中。    
    ②使用Flume拉取到HDFS中的文件格式错乱:    
    这是因为HDFS Sink的配置中,hdfs.writeFormat属性默认为“Writable”会将原先的文件的内容序列化成HDFS的格式,应该手动设置成hdfs.writeFormat=“text”; 并且hdfs.fileType默认是“SequenceFile”类型的,是将所有event拼成一行,应该该手动设置成hdfs.fileType=“DataStream”,这样就可以是一行一个event,与原文件格式保持一致。

    应用层代码部署到分布式mycluster1

    把前端工程放到hadoop01的/usr/local目录下harFront因为nginx服务在hadoop01这个机器上,实现动静分离,让nginx处理静态文件,所以只能放到hadoop01服务器指定路径下构建集群测试环境参照nginx.conf和tomcat的配置文件server.xml并在mysql的配置文件/etc/my.cnf下加入编译格式utf-8来解决中文乱码问题把后台打包成war,放到五台集群服务器的tomcat的webapps上,重启tomcat,可看到tomcat解压的后台工程。

    windows本地系统需要在C:\Windows\System32\drivers\etc目录下的hosts配置域名来切换本地环境和测试环境pom.xml引入包因为以后服务层预算使用spring-cloud,所以目前只使用[大数据包+java源生]开发,之后引入spring-cloud之后,再大数据包+spring-cloud包组合开发hive有些包不能导入pom.xml中会报错,需要添加外部包。

    以下是hadoop构建离线处理的第一步--采集数据:
    采集数据有很多种方法:
    比如采集日志可以用开源框架flume,可以用js写出埋点代码进行采集
    比如可以做一个爬虫来来抓取网页的各种信息:
    做爬虫也可以采用搜索引擎框架,比如Nutch,也可以自己手写爬虫,比如用python语言由于Nutch框架入手难度较大,所以本次离线暂时采用python写一条简单的网络爬虫来采集数据
    以后会在采集数据这个模块使用:Flume+Kafka+Nutch+源生python

    数据采集(Flume采集nginx日志)

    首先需要了解:    
    nginx服务所在目录/usr/local/nginx,它的输出日志为logs/access.log
    配置设定:flume每小时对nginx数据释放一次上传到hdfs,格式为YY-MM-DD格式.log文件由于是测试,此处选择每一小时自动释放一次,可理解成每小时截断一次。详细配置参照flume定时删除HDFS中过期文件:https://www.cnblogs.com/mengrennwpu/p/6114505.html删除hdfs的logdfs目录下所有文件:bin/hdfs -rm -r /home/hdfs/flume/logdfs/*    
    此处flume上传给hdfs的文件都是小文件,改变成大些的文件方法参照:    
    清空文件内容:echo > filename

    http://blog.csdn.net/simonchi/article/details/43231891    
    http://www.it610.com/article/2107322.htm    
    https://www.cnblogs.com/gxgd/p/7840896.html    
    https://www.linuxidc.com/Linux/2014-03/98555.htm    
    ☆☆☆☆https://blog.csdn.net/simonchi/article/details/43231891    
    各参数讲解:http://lxw1234.com/archives/2015/10/527.htm    
    最终小文件问题解决:    
    加入以下是关键,详解参照:https://blog.csdn.net/kntao/article/details/49278239

    collector2.sinks.k1.hdfs.round=true    
    collector2.sinks.k1.hdfs.roundValue=3    
    collector2.sinks.k1.hdfs.roundUnit=minute    
    采集后的数据存储在hdfs的:    
    隔一个小时生产一个.log文件    
    数据采集后的存在hdfs的/home/hdfs/flume/logdfs目录下

    Visits数据分析

    1)nginx日志字段说明    
    10.10.100.14 - - [31/May/2018:15:29:50 +0800] "GET /harbour/dispatch_order/getDispatchStatusByShipId?ship_id=231 HTTP/1.1" 200 11 "http://hadoop01/html/hjh_harbour_html_dispatch_management.html" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"    
    格式分析:    
    1、访客ip地址:10.10.100.14    
    2、访客用户信息:- -    
    3、请求时间:[31/May/2018:15:29:50 +0800]    
    4、请求方式:GET    
    5、请求的url:/harbour/dispatch_order/getDispatchStatusByShipId?ship_id=231    
    6、请求所用协议:HTTP/1.1    
    7、响应码:200    
    8、返回的数据流量:11    
    9、访客的来源url:http://hadoop01/html/hjh_harbour_html_dispatch_management.html    
    10、访客所用浏览器:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
    2)数据模型建立    
    要对数据仓库中数据进行数据分析,首先需要构建数据仓库的ODS(OperationalData Store)层,数据建模目前可能比较陌生,先了解下数据建模的几种常见方法:

    ①星型模型

    星型模型是数据集市维度建模中推荐的建模方法。星型模型是以事实表为中心,所有的维度表直接连接在事实表上,像星星一样。星型模型的特点是数据组织直观,执行效率高。因为在数据集市的建设过程中,数据经过了预处理,比如按照维度进行了汇总,排序等等,数据量减少,执行的效率就比较高。

    ②雪花模型

    雪花模型也是维度建模中的一种选择。雪花模型的维度表可以拥有其他维度表的,虽然这种模型相比星型模型更规范一些,但是由于这种模型不太容易理解,维护成本比较高,而且性能方面需要关联多层维表,性能也比星型模型要低。所以一般不是很常用。

    ③范式建模

    范式建模是在数据库建模中使用的建模方法,特点是体系化,扩展性好,避免冗余,避免更新异常。所以,在数据仓库的EDW层建模中,我们也提倡使用第三范式建模。但是数据仓库的集成和反映历史变化的特征意味着数据量非常之大,表和表之间的关联效率比较低,所以有些时候完全规范的范式建模并不是最好的选择,通常我们会选择非规范化处理,增加一些冗余的字段来避免表之间关联的次数,这样会节约大量的时间。

    ④星座模型

    星座模型是星型模型延伸而来,星型模型是基于一张事实表的,而星座模型是基于多张事实表的,而且共享维度信息。 通过构建一致性维度,来建设星座模型,也是很好的选择。比如同一主题的细节表和汇总表共享维度,不同主题的事实表,可以通过在维度上互相补充来生成可以共享的维度。

    本次使用星型模型来构建数据仓库的ODS(OperationalData Store)层:下面的命令我们可以通过启动Hive的hiveserver2服务器并使用beeline客户端进行操作或者直接写脚本去定时调度。

    PageViews

    Visits

    eclipse执行MR程序,出现错误:
    Permission denied: user=Admin, access=EXECUTE, inode="/tmp":root:supergroup:drwx------
    windows用户没有hdfs执行权限:
    hdfs dfs -chmod -R 777 /tmp
    递归加权限~~
    再次在eclipse中执行清洗,出现错误:

    [2018-06-12 10:39:12.272]Container exited with a non-zero exit code 1. Error file: prelaunch.err.    
    Last 4096 bytes of prelaunch.err :    
    /bin/bash: line 0: fg: no job control    
    此错误的意思就是在windows中跑linux环境,找不到job,需要加入以下配置,此配置只在eclipse的mapred-site.xml配置文件中加!

    <property>      
      <name>mapred.remote.os</name>    
      <value>Linux</value>    
      <description>Remote MapReduce framework's OS, can be either Linux or Windows</description>     
    </property>    
    <property>    
      <name>mapreduce.app-submission.cross-platform</name>    
      <value>true</value>    
    </property>    
    之前在eclipse跑wordCount.java时候,在http://hadoop02:8088/cluster侧没有记录的原因是wordcount跑的是单机版,没走配置文件,没走yarn,所以没有记录。

    Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.hjh.datacenter.mapreduce.nginx.NginxLogCleanMR$CleanMap not found

    此错误和警告是因为没setjar包导致的,代码中添加:conf.set("mapred.jar", "NginxLogCleanMR.jar");把打好的jar包放在工程的跟目录下,此问题即可解决。

    注意:
    如果在eclipse的src/main/resources中copy linux系统hadoop的配置文件,配置文件会加载,模拟真实的linux的hadoop系统,所以会找相应jar包如果eclipse的src/main/resources中不copy linux系统hadoop的配置文件,则表示eclipse中的代码不走hadoop环境,所以需要把input路径和output路径指定固定的hdfs://hadoop01:9820/home/hdfs/flume/logdfs/的路径才能找到,这样就不需要找jar包,但是这样也没通过yarn,所以在http://hadoop02:8088/cluster中也看不到跑的任务
    注1:在指令中LOCAL关键字用于指定数据从本地加载,如果去掉该关键字,默认从HDFS进行加载!OVERWRITE关键字指定使用覆盖方式进行加载数据,否则使用附加方式进行加载。
    注2:如果数据加载到分区表,则必须指定分区列。

    所以两种写法,如果不想在eclipse中加入hadoop配置文件,则在代码中需要有改变,比如NginxLogCleanMR.java其它代码一直,只是在main方法中有所改变

    public static void main(String[] args) throws Exception {        
        Configuration conf = new Configuration();    
    //    conf.set("fs.defaultFS", "hdfs://mycluster1");    
    //    conf.set("mapred.jar", "NginxLogCleanMR.jar");    
    //    System.setProperty("HADOOP_USER_NAME", "root");    
        Job job = Job.getInstance(conf, "NginxLogCleanMR");    
        job.setJarByClass(NginxLogCleanMR.class);    
        job.setMapperClass(CleanMap.class);    
        job.setMapOutputKeyClass(Text.class);    
        job.setMapOutputValueClass(NullWritable.class);    
        Date curDate = new Date();    
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");    
        String dateStr = sdf.format(curDate);    
    //    String inputPath = "/home/hdfs/flume/logdfs" + dateStr + "/*";    
        String inputPath = "hdfs://hadoop01:9820/home/hdfs/flume/logdfs/20180608/*";    
        String outputPath = "hdfs://hadoop01:9820/home/hdfs/flume/cleanlogs/" + dateStr + "/";    
        FileInputFormat.setInputPaths(job, new Path(inputPath));    
        FileOutputFormat.setOutputPath(job, new Path(outputPath));    
        boolean res = job.waitForCompletion(true);    
        System.exit(res ? 0 : 1);    
        }    
    如果在eclipse中加入hadoop配置文件,需要在NginxLogCleanMR.java中的main方法中改成        
    public static void main(String[] args) throws Exception {        
        Configuration conf = new Configuration();    
        conf.set("fs.defaultFS", "hdfs://mycluster1");    
        conf.set("mapred.jar", "NginxLogCleanMR.jar");    
        System.setProperty("HADOOP_USER_NAME", "root");    
        Job job = Job.getInstance(conf, "NginxLogCleanMR");    
        job.setJarByClass(NginxLogCleanMR.class);    
        job.setMapperClass(CleanMap.class);    
        job.setMapOutputKeyClass(Text.class);    
        job.setMapOutputValueClass(NullWritable.class);    
        Date curDate = new Date();    
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");    
        String dateStr = sdf.format(curDate);    
    //    String inputPath = "/home/hdfs/flume/logdfs" + dateStr + "/*";    
        String inputPath = "/home/hdfs/flume/logdfs/20180608/*";    
        String outputPath = "/home/hdfs/flume/cleanlogs/" + dateStr + "/";    
        FileInputFormat.setInputPaths(job, new Path(inputPath));    
        FileOutputFormat.setOutputPath(job, new Path(outputPath));    
        boolean res = job.waitForCompletion(true);    
        System.exit(res ? 0 : 1);    
        }   

    并把工程打的包NginxLogCleanMR.jar放在工程根目录下。这样就可以在http://hadoop02:8088/cluster看到执行的任务    
    把NginxLogCleanMR.jar包放到linux集群中执行:    
    bin/hadoop jar /usr/software/hadoop-3.0.1/NginxLogCleanMR.jar com.hjh.datacenter.mapreduce.nginx.NginxLogCleanMR    
    bin/hadoop jar /usr/software/hadoop-3.0.1/NginxLogCleanMR.jar com.hjh.datacenter.mapreduce.nginx.NginxLogSessionMR    
    bin/hadoop jar /usr/software/hadoop-3.0.1/NginxLogCleanMR.jar com.hjh.datacenter.mapreduce.nginx.PageViewsMR    
    bin/hadoop jar /usr/software/hadoop-3.0.1/NginxLogCleanMR.jar com.hjh.datacenter.mapreduce.nginx.VisitsInfoMR   

    注:如果在eclipse的环境中把mapred-site.xml配置文件的mapreduce.framework.name设定为yarn-tez,会导致eclipse运行出错,所以eclipse中的mapred-site.xml需要设定mapreduce.framework.name为yarn,然后将工程打包放到linux集群中执行,而linux集群中配置成yarn-tez即可,执行的引擎就为yarn-tez

    MapReduce程序,遇到一个问题,map跑完reduce重写方法跑不进去,原因是:    
    extends Reducer<Text, IntWritable, Text, IntWritable>类中第二个参数需要与extends Mapper<Object, Text, Text, IntWritable>类中第四个参数一致14/Jun/2018:11:40:06 此时间格式:dd/MMM/yyyy:HH:mm:ss

    ①编写完成四个日志清洗类,日志分析类

    NginxLogCleanMR,NginxLogSessionMR,PageViewsMR,VisitsInfoMR

    NginxLogAnalysis.java,NginxSessionAnalysis.java,PageViewsAnalysis.java,VisitsInfoAnalysis.java

    详细参照我上传的资源:https://download.csdn.net/my

    启用桶表,自动控制上一轮reduce的数量从而适配bucket的个数也可以自主设置mapred.reduce.tasks去适配bucket个数推荐使用set hive.enforce.bucketing=true;最终输出结果压缩

    set hive.enforce.bucketing=true;

    set hive.exec.compress.output=true;

    set mapred.output.compress=true;

    set hive.mapred.mode=strict;  //设置mapreduce模式为严格模式,默认是nonstrict模式

    ②在hive数据库中创建pageViews相应的数据库表,并导入hdfs中清洗之后的数据

    a.先创建PageViews的贴源数据表

    分桶表的数据不是直接导入(load)的,是从其他表里面查出来插入的,插入时会在语句中加入约束的语句。

    所以先创建一个中间表:

    create table pageviews_tmp(session string,ip string,requestdate string,requesttime string,visitpage string, staytime string,step string) comment 'this is the table for pageviews' partitioned by(inputDate string) row format delimited fields terminated by  ' ';

    load data inpath '/home/hdfs/flume/pageviews/20180614/' overwrite into table pageviews_tmp partition(inputDate='20180614');

    如果没有标示是在'Local'本地文件系统中,则会去HDFS中加载数据
    select * from pageviews_tmp where inputDate='20180614';验证导入数据成功
    select * from pageviews_tmp where step='13744';验证导入数据成功
    create table pageviews(session string,ip string,requestdate string,requesttime string,visitpage string, staytime string,step string) comment 'this is the table for pageviews' partitioned by(inputDate string) clustered by(session) sorted by(requestdate,requesttime) into 4 buckets row format delimited fields terminated by  ' ';

    将中间表中的数据导入到HIVE的PageViews贴源数据表中

    insert overwrite table pageviews partition(inputDate='20180614') select session,ip,requestdate,requesttime,visitpage,staytime,step from pageviews_tmp where inputDate='20180614' cluster by session;

    b.根据具体的业务分析逻辑创建ODS层的PageViews事实表,并从PageViews的贴源表中导入数据

    create table ods_pageviews(session string,ip string,viewtime string,visitpage string, staytime string,step string) partitioned by(inputDate string) clustered by(visitpage) sorted by(viewtime) into 4 buckets row format delimited fields terminated by ' ';

    导入PageViews贴源数据表数据:

    insert into table ods_pageviews partition(inputDate='20180614') select pv.session,pv.ip,concat(pv.requestdate,"-",pv.requesttime),pv.visitpage,pv.staytime,pv.step from pageviews as pv where pv.inputDate='20180614';

    c.创建PageViews事实表的时间维度表并从当天的事实表里导入数据

    create table ods_dim_pageviews_time(pvtime string,year string,month string,day string,hour string,minutes string,seconds string) partitioned by(inputDate String) clustered by(year,month,day) sorted by(pvtime) into 4 buckets row format delimited fields terminated by ' ';

    insert overwrite table ods_dim_pageviews_time partition(inputDate='20180614') select distinct pv.viewtime, substring(pv.viewtime,0,4),substring(pv.viewtime,6,2),substring(pv.viewtime,9,2),substring(pv.viewtime,12,2),substring(pv.viewtime,15,2),substring(pv.viewtime,18,2) from ods_pageviews as pv;

    d.创建PageViews事实表的URL维度表并从当天的事实表里导入数据

    create table ods_dim_pageviews_url(visitpage string,host string,path string,query string) partitioned by(inputDate string) clustered by(visitpage) sorted by(visitpage) into 4 buckets row format delimited fields terminated by ' ';

    insert into table ods_dim_pageviews_url partition(inputDate='20180614') select distinct pv.visitpage,b.host,b.path,b.query from pageviews pv lateral view parse_url_tuple(concat('http://hadoop01',pv.visitpage),'HOST','PATH','QUERY') b as host,path,query;

    查询每天PV总数前20的页面:

    select op.visitpage as path,count(*) as num from ods_pageviews as op join ods_dim_pageviews_url as opurl on (op.visitpage = opurl.visitpage) join ods_dim_pageviews_time as optime on (optime.pvtime = op.viewtime) where optime.year='2018' and optime.month='06' and optime.day='14' group by op.visitpage sort by num desc limit 20;

    利用sqoop将计算后查询结果导入到mysql

    从hive到出数据到mysql,实际上hive表不能直接导出数据到mysql,hive数据先到出数据到hdfs,再从hdfs导出到mysql 

    所以,执行查询后,结果输出到hdfs指定路径下:

    insert overwrite directory '/user/sqoop/mysql' row format delimited fields terminated by '\t' stored as textfile select op.visitpage as path,count(*) as num from ods_pageviews as op join ods_dim_pageviews_url as opurl on (op.visitpage = opurl.visitpage) join ods_dim_pageviews_time as optime on (optime.pvtime = op.viewtime) where optime.year='2018' and optime.month='06' and optime.day='14' group by op.visitpage sort by num desc limit 20;

    mapreduce操作汇总的结果,默认的分隔符是 '\001',否则如果是从HDFS文件导入的则分隔符则应该是'\t'。此处我是hive执行mapreduce分析汇总的结果,所以默认的分隔是'\001'。

    从HIVE分区表导入到MySQL,需要依次导入每个分区的数据:(进入$sqoop_home/bin路径下)

    sqoop export --connect jdbc:mysql://hadoop01:3306/harbour_user_db --table pv_num --username root -P --hive-partition-key inputDate --hive-partition-value '20180614' --export-dir /user/sqoop/mysql --driver com.mysql.jdbc.Driver --input-fields-terminated-by '\t' --lines-terminated-by '\n'

    导入mysql成功!!

    e.创建Visits信息的贴源数据表

    create table visitsinfo(session string,startdate string,starttime string,enddate string,endtime string,entrypage string,leavepage string,viewpagenum string,ip string,referal string) partitioned by(inputDate string) clustered by(session) sorted by(startdate,starttime) into 4 buckets row format delimited fields terminated by ' ';

    将HDFS中的数据导入到HIVE的Visits信息贴源数据表中

    f.根据具体的业务分析逻辑创建ODS层的Visits事实表,并从visitsinfo的贴源表中导入数据

    create table ods_visits(session string,entrytime string,leavetime string,entrypage string,leavepage string,viewpagenum string,ip string,referal string) partitioned by(inputDate string) clustered by(session) sorted by(entrytime) into 4 buckets row format delimited fields terminated by ' ';

    g.创建Visits事实表的时间维度表并从当天的事实表里导入数据

    create table ods_dim_visits_time(vtime string,year string,month string,day string,hour string,minutes string,seconds string) partitioned by(inputDate String) clustered by(year,month,day) sorted by(vtime) into 4 buckets row format delimited fields terminated by ' ';

    h.创建visits事实表的URL维度表并从当天的事实表里导入数据

    create table ods_dim_visits_url(pageurl string,host string,path string,query string) partitioned by(inputDate string) clustered by(pageurl) sorted by(pageurl) into 4 buckets row format delimited fields terminated by ' ';

    大数据离线自动执行流程--基于jenkins

    1)系统管理->系统设置

    用SSH把其它节点连接上

    2)写好离线流程的shell

    需要写五个shell:

    1.列出shell执行步骤    
    需要验证以下环境:jdk和tomcat不需要验证,因为要能运行jenkins首先需要有jdk和tomcat    
    ①zookeeper集群启动②hadoop集群环境(hdfs+yarn的启动)③flume集群环境④hive⑤mysql集群⑥sqoop验证    
    在hadoop01节点:/usr/software/shell目录下创建shell:    
    1.zookeeper集群是否启动,如果未启动执行集群启动    
    2.hadoop集群是否启动,如果未启动执行集群启动    
    3.flume集群是否启动,如果未启动执行flume集群启动    
    4.hive是否启动,如果未启动执行hive启动    
    5.mysql集群是否启动(包括管理节点+数据存储节点+server节点),如果未启动执行mysql-cluster启动    
    zookeeper集群批量启动+批量关闭shell:    
    写shell之前需要了解一些概念:交互式shell和非交互式shell、登录shell和非登录shell    
    交互式shell:    
    在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。    
    非交互式shell:    
    以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。    
    登录shell:    
    是需要用户名、密码登录后才能进入的shell(或者通过--login”选项生成的shell)。    
    非登录shell:    
    当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令“bash”就是打开一个新的非登录shell,在Gnome或KDE中打开一个“终端”(terminal)窗口程序也是一个非登录shell。

    总结:

    对于Bash来说,登录shell(包括tty1~tty6登录shell和使用“--login”选项的交互shell),它会首先读取和执行/etc/profile全局配置文件中的命令,然后依次查找~/.bash_profile、~/.bash_login 和 ~/.profile这三个配置文件,读取和执行这三个中的第一个存在且可读的文件中命令。在非登录shell里,只读取~/.bashrc(和 /etc/bash.bashrc、/etc/bashrc )文件,不同的发行版里面可能有所不同。进入shell脚本专有目录:cd /usr/software/shell

    2.zookeeper集群启动+停止shell

    创建zookeeper批量执行脚本(启动+停止):touch zk-cluster.sh
    为该shell添加执行权限:chmod u+x zk-cluster.sh
    ./zk-cluster.sh start

    #!/bin/bash

    iparray=(hadoop01 hadoop02 hadoop03 hadoop04 hadoop05)
    user="root"
    echo "$1"
    if [ $1 = "start" ]
    then
        cmd="/usr/software/zookeeper-3.4.11/bin/zkServer.sh start"
    fi


    if [ $1 = "stop" ]
    then
        cmd="/usr/software/zookeeper-3.4.11/bin/zkServer.sh stop"
    fi


    cmd2="jps"


    for ip in ${iparray[*]}
    do
        echo "ssh to $ip"
        ssh $user@$ip "$cmd"
        echo "jps:"
        ssh $user@$ip "$cmd2"
        echo
    done

    ssh -t :就是可以提供一个远程服务器的虚拟tty终端,加上这个参数我们就可以在远程服务器的虚拟终端上输入自己的提权密码了,非常安全,由于集群已经配置过无需密码联机了,所以不需要添加-t

    验证程序是否启动,先做一个样例shell:test.sh,为该shell添加执行权限chmod u+x test.sh

    #!/bin/bash

    b=$(jps)        #把jps命令执行结果赋予一个变量b    
    echo "${b}"        #打印出是否赋予成功    
    if [[ "$b" =~ "NameNode" ]]        #利用字符串运算符 =~ 直接判断字符串"$b"中是否包含"NameNode"    
    #if [[ "$b" =~ "NameNode" && "$b" =~ "Jps"]]            
    then        注:与[[和]]之间一定要有一个半角空格    
        echo "包含"        #如果条件成立则包含    
    else            
        echo "不包含"        #如果条件不成立则不包含    
    fi            
                
    Bash Shell脚本根据进程名获取进程pid:            
    方法一:            
    脚本名:tesh.sh            
    #! /bin/bash            
    process=$1            
    pid=$(ps -ef | grep $process | grep '/bin/java' | grep -v grep | awk '{print $2}')            
    echo $pid            
    执行方式:./tesh.sh myprocessName            
    方法二:            
    echo `jps |grep myprocessName|awk '{print $1}'`            
    或            
    echo $(jps |grep myprocessName|awk '{print $1}')            
    在bash中,$( )与` `(反引号)都是用来作命令替换的。   

    3.flume集群启动+停止shell    
    创建flume批量执行脚本(启动+停止):touch flume-cluster.sh    
    为该shell添加执行权限:chmod u+x flume-cluster.sh    
    关闭flume方法就是杀死flume启动后对应的进程Application    
    执行flume启动或停止就是在shell后面加上start、stop参数,即可代表开始flume集群和停止flume集群

    注:    
    ①由于flume原生启动shell不是在后台运行,并且启动成功后处于悬挂状态,使用ctrl+c可以直接终止程序,这样会导致集群启动时无法持续多台启动,而且直接ctrl+c快捷键直接停止程序使程序不安全,所以此集群shell采用nohup方法,使启动在后端启动,让程序启动安全并且可以集群多台持续启动    
    ②当用ssh远程执行命令时,不识别$,所以需要反编译    
    在kill -9 \$(jps |grep Application|awk '{print \$1}')的$前面加\反斜杠,否则不识别

    ./flume-cluster.sh start    
    #!/bin/bash    
    iparray=(hadoop04 hadoop05 hadoop01)    
    user="root"    
    echo "$1..."    
    if [ $1 = "start" ]    
    then     
        cmd_collector1="nohup /usr/software/flume/bin/flume-ng agent -n collector1 -c conf -f /usr/software/flume/conf/flume-server.properties -Dflume.root.logger=INFO,console > /usr/software/shell-script/nohup.out 2>&1 &"    
        cmd_collector2="nohup /usr/software/flume/bin/flume-ng agent -n collector2 -c conf -f /usr/software/flume/conf/flume-server.properties -Dflume.root.logger=INFO,console > /usr/software/shell-script/nohup.out 2>&1 &"    
        cmd_agent1="nohup /usr/software/flume/bin/flume-ng agent -n agent1 -c conf -f /usr/software/flume/conf/flume-client.properties -Dflume.root.logger=INFO,console > /usr/software/shell-script/nohup.out 2>&1 &"    
        
    cmd2="jps"    
        
    for ip in ${iparray[*]}    
    do    
        echo "ssh to $ip"    
    if [ $ip = "hadoop04" ]    
    then    
        echo "$ip collector1...start"    
        ssh $user@$ip "cd /usr/software/flume/; $cmd_collector1"    
        sleep 5    
        echo "$ip collector1...end"    
    fi    
    if [ $ip = "hadoop05" ]    
    then    
        echo "$ip collector2...start"    
        ssh $user@$ip "$cmd_collector2"    
        sleep 5    
        echo "$ip collector2...end"    
    fi    
    if [ $ip = "hadoop01" ]    
    then    
        echo "$ip agent1...start"    
        ssh $user@$ip "$cmd_agent1"    
        sleep 5    
        echo "$ip agent1...end"    
    fi    
        echo "jps:"    
        ssh $user@$ip "$cmd2"    
        echo    
    done    
    fi    
        
    if [ $1 = "stop" ]    
    then    
        cmd2="jps"    
    for ip in ${iparray[*]}    
    do    
        echo "ssh to $ip"    
    if [ $ip = "hadoop04" ]    
    then    
        echo "$ip collector1 kill...start"    
        ssh $user@$ip "kill -9 \$(jps |grep Application|awk '{print \$1}')"    
        sleep 2    
        echo "$ip collector1 kill...end"    
    fi    
    if [ $ip = "hadoop05" ]    
    then    
        echo "$ip collector2 kill...start"    
        ssh $user@$ip "kill -9 \$(jps |grep Application|awk '{print \$1}')"    
        sleep 2    
        echo "$ip collector2 kill...end"    
    fi    
    if [ $ip = "hadoop01" ]    
    then    
        echo "$ip agent1 kill...start"    
        ssh $user@$ip "kill -9 \$(jps |grep Application|awk '{print \$1}')"    
        sleep 2    
        echo "$ip agent1 kill...end"    
    fi    
        echo "jps:"    
        ssh $user@$ip "$cmd2"    
        echo    
    done    
    fi   

    4.mysql-cluster启动+停止shell        
    参照URL:    
    https://www.jb51.net/article/75614.htm    
    https://www.linuxidc.com/Linux/2015-11/125327.htm    
    https://www.jb51.net/article/85747.htm    
    https://www.2cto.com/net/201605/513371.html   

    5.初始化环境shell    
    创建初始化环境shell:    
    touch initialEnv.sh    
    #!/bin/bash    
        
    export BASE_HOME=/usr/software    
    export ZOOKEEPER_HOME=${BASE_HOME}/zookeeper-3.4.11    
    export HADOOP_HOME=${BASE_HOME}/hadoop-3.0.1    
    export FLUME_HOME=${BASE_HOME}/flume    
    export HIVE_HOME=${BASE_HOME}/hive    
    export SQOOP_HOME=${BASE_HOME}/sqoop    
        
    export MYSQL_HOME=/usr/local/mysql    
        
    #start hdfs    
    ${HADOOP_HOME}/sbin/start-dfs.sh    
        
    #start yarn [[ 0 == $? ]]上一个程序是否执行成功    
    if [[ 0 == $? ]]    
    then    
    /home/ymh/apps/hadoop-2.6.4/sbin/start-yarn.sh    
    fi    
        
    #start flume    
    #if [[ 0 == $? ]]    
    #then    
    #start flume    
    #$nohup ~/apache-flume-1.6.0-bin/bin/flume-ng agent -n agent -c conf -f ~/apache-flume-1.6.0-bin/conf/flume-conf.properties &    
    #fi    
        
    #start mysql    
    if [ 0 = $? ]    
    then    
    service mysqld start    
    fi    
        
    #start HIVE SERVER    
    if [ 0 = $? ]    
    then    
    $nohup /apps/apache-hive-1.2.1-bin/bin/hiveserver2 &    
    fi   

    6.执行离线计算流程shell

    此流程中,hive中的表和mysql中表需要手动提前创建完成,所以创建数据库表不在shell中完成    
    上一步验证完环境之后,flume也在上一步中启动,此步骤进行离线步骤构建:    
    ①flume采集后数据存储在hdfs②执行MapReduce对采集后数据进行清洗    
    ③把清洗后数据导入hive中间表④从hive中间表中把数据插入hive贴源数据表    
    ⑤再分别导入hive的PageViews事实表的时间维度表    
    ⑥再分别导入hive的PageViews事实表的URL维度表    
    ⑦查询每天PV总数前20的页面,并把查询结果保存在HDFS    
    ⑧用sqoop把查询后结果导入mysql

    7.把定时shell配置到jenkins

    展开全文
  • 课程简介: ...②将数据收到 HDFS/Hive/HBase,使用MapReduce和Hive离线分析,其中涉及地域分析、用户相关信息分析及外链分析等。 ③依据业务深入MapReduce使用 ④数据处理时,针对不同问题如何优化调整等
  • 可能不少用户还不知道,我们上个月中旬就已经对外发布了离线数据分析功能。用户可以用它来做什么,它适用于哪些应用场景,有没有应用实例?若要回答这些问题,首先让我们看看部分用户曾经向我们提出过的一些痛点或...

    可能不少用户还不知道,我们上个月中旬就已经对外发布了离线数据分析功能。用户可以用它来做什么,它适用于哪些应用场景,有没有应用实例?若要回答这些问题,首先让我们看看部分用户曾经向我们提出过的一些痛点或需求。为了对用户数据保密,后面提到的应用名字与数据均为虚构。

    • 某应用 TestA 发布几个月之后,由于用户量暴涨,存储在我们这里的数据规模急剧上涨。这就导致了一个不得不忽视的问题:他们在应用刚发布的那段时间会每天从我们这里导出数据,自己写程序做数据分析。而当数据规模(几十 GB)越来越大,受限于网络文件下载速度,每日导出数据再自己做分析已经变得越来越困难。因此,他们希望我们能提供数据分析服务,支持 SQL-like 的查询。
    • 某应用 TestB 每天都会针对应用数据做一些分析报告,主要目的是知晓应用当前的关键数据指标。按照最初的方案,他们需要每日导出数据,自己写脚本程序处理应用数据。实际上,这样的工作对一个需要快速迭代产品的团队来说颇为繁琐,也比较消耗时间。
    • 我们的 工单系统 也是构建在 Leancloud 之上,每一条工单数据都是通过我们的存储组件写入我们的云端数据库。工单系统同时也作为我们的一个示例公开了源代码,从源代码就可以了解到它和其他用户的应用没有本质区别(从数据存储这个角度看)。我们的工程师除了需要非常及时地处理用户提交的工单,也需要了解工单系统的一些统计指标,例如自己最近回复了多少工单、不同平台工单的处理速度等等。如果有一个支持 SQL-like 的查询服务,那么要统计这些指标就会变得很容易。

    相信上面的例子对很多用户来讲都不陌生,它揭示的痛点无非是大量的数据无法通过便捷的手段进行分析。考虑到用户的需求,我们开发了支持 SQL-like 查询的离线数据分析服务。用户要做的不过是按照我们的 离线数据分析使用指南 开启离线数据分析服务,输入合法的 SQL 语句即可分析数据。顺便说一下,这个服务后端核心组件为 Spark SQLParquet

    接下来,就以我们的工单系统为例子,介绍如何利用离线数据分析服务来解决我们日常工作中遇到的一些问题。当然,为了更好地了解工单系统内部的结构,你可以访问 这里 的源代码。

    首先让我们看看整个界面:

    bigquery-0.png

    接下来就让我们针对一些统计指标分析工单系统数据:

    • 统计不同平台类型(type)的工单数量,并按大小排序

      select count(*) as count, type from Ticket where type is not null group by type order by count desc

    结果如图所示(如果图中文字不够清晰,请点击查看大图):

    bigquery-1.png

    • 统计每个工单(Ticket)各有多少条回复(Thread),并按回复数大小排序

      select Ticket.objectId, Ticket.title, count(Thread.content) as count from Ticket inner join Thread where Ticket.objectId=Thread.ticket.objectId group by Thread.content, Ticket.objectId, Ticket.title order by count desc

    结果如图所示:

    bigquery-2.png

    若想知晓 iOS 平台的每条工单各有多少条回复,只需把上面的 SQL 语句做简单修改:

    select Ticket.objectId, Ticket.title, count(Thread.content) as `count` from Ticket inner join Thread where Ticket.objectId=Thread.ticket.objectId and Ticket.type='ios' group by Thread.content, Ticket.objectId, Ticket.title order by `count` desc
    
    • 统计所有工程师最近一个多月处理了多少条工单(Ticket),并按处理数量排序。Admin、Thread、Ticket 这三张表参与了 join 计算,其中 Admin 存放了工程师的个人信息,它和回复(Thread)通过 cid 关联。而回复(Thread)与工单(Ticket)则是通过工单的 objectId 来做关联。

    注:slackName 其实就是这个工程师的用户名,因为我们还使用 Slack 来实时接收消息。

    select count(distinct Ticket.objectId) as `count`, Admin.slackName from Ticket inner join Thread inner join Admin where Thread.ticket.objectId = Ticket.objectId and Admin.cid = Thread.cid and Admin.slackName is not null and unix_timestamp(Ticket.createdAt) &gt; unix_timestamp('2014-12-01T00:00:00.000Z') group by Admin.slackName order by `count` desc
    

    结果如图所示:

    bigquery-3.png

    • 统计所有工程师总共有多少次回复(Thread),并按回复数排序。同工单数的查询类似,这里也需要三张表做 join。

    select count(distinct Thread.objectId) as count, Admin.slackName from Ticket inner join Thread inner join Admin where Thread.ticket.objectId = Ticket.objectId and Admin.cid = Thread.cid and Admin.slackName is not null group by Admin.slackName order by count desc

    结果如图所示:

    bigquery-4.png

    • 统计每天各有多少条回复(Thread)

    substr(createdAt, 1, 10) 用来获取回复的日期(yyyy-MM-dd)select count(*) as count, substr(createdAt, 1, 10) as date from Thread group by substr(createdAt, 1, 10) order by date desc

    结果如图所示:

    bigquery-5.png

    考虑到本文篇幅有限,就不再列举其他查询示例。如果您在使用离线数据分析服务的过程中遇到各种各样的问题,都可以通过工单或者邮件向我们反馈,我们会及时处理相关问题。

    展开全文
  • 百胜离线分析

    2014-04-28 12:19:06
    百胜数据离线分析器,可以离线分析导出的离线数据,方便,快捷。
  • Proxmark3有卡嗅探密钥分析工具。 操作步骤: 1、链接Proxmark3 2、执行命令hf 14a sniff 3、贴合卡片进行刷卡 4、点击按钮 5、hf 14a list获取数据 6、用工具分析日志
  • X-CAN离线分析平台前言X-CAN使用说明软件功能1 解析CAN通讯协议DBC2 加载CAN离线数据信号绘图 前言 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是ISO国际标准化的串行通信协议。1986 年德国博世...

    软件说明

    本X-CAN软件为本人个人开发,开发的初衷为满足我个人在科研实验测试过程从CAN总线采集数据和后期不定期的反复提取离线数据来进行分析。本人的一个实验习惯是,在每一次的实验测试过程中保存当次版本的CAN协议文件、CAN数据文件以及必要的实验摘要。本X-CAN软件则可以根据当次的CAN协议文件和CAN数据文件对原始数据进行各种分析、绘图。

    本软件从最初的个人开发自用,到供给实验室内部使用,再到现在封装供大家免费使用,已经历了多个版本。各版本功能不断完善,同时,也希望各位在使用本软件时能够积极地提一些建议和意见,如有,请直接评论到本博客。

    本X-CAN软件快捷方式如下,统一显示为X-CAN 。
    在这里插入图片描述
    最新版本【V2.3.2.1 】更新内容如下:
    1.释放复用信号解析的用户组限制;
    2. 新增右键导出至CSV文件功能;
    3. 新增多文件批量解析及导出功能。

    本软件下载地址及运行环境

    本软件基于NI LabVIEW 2015 32位编写,安装及运行需要有LabVIEW 2015的运行引擎,请先安装LabVIEW 2015或以上版本,或者安装LabVIEW 2015的运行引擎。
    这里提供X-CAN软件、运行环境的下载地址:

    软件项版本软件大小下载地址备注
    本软件:X-CAN2.3.2.120 MB渠道1:本人网站
    渠道2:CSDN下载
    必装
    运行时引擎:LabVIEW
    Run - Time Engine
    2015 SP1 - (32-bit)274.57 MB官网ftp下载选装
    开发软件:LabVIEW2015 中文版1.41 GB官网ftp下载选装

    本软件免费使用,在CSDN下载是对我开发工作的认可。若你无CSDN积分下载,也可联系本人QQ:19627152或相应QQ邮箱索取,也可以加Q群:646900507互相交流学习。另外,本人为此软件制作了专门的网站:http://www.xcantec.cn/,你也可以通过这个网站进行下载和反馈。

    软件支持的文件格式

    1、CAN协议文件
    目前,本软件仅支持.dbc格式的CAN协议文件,如有其它格式的需求,请联系本人。
    dbc格式的CAN协议文件采用Vector CANdb++软件编写,如有需要,可以点击这里到百度网盘下载,提取码:mrnd ,或点击这里到CSDN下载

    2、CAN离线数据文件
    (1)X-CAN 1.9及以下版本仅支持由ZLG CANpro软件在CAN选项卡下保存或实时保存的
    .txt/.asc文件
    (2)X-CAN 2.0版本开始,支持ZLG CANpro软件在CAN选项卡下保存的
    .can/.txt/.asc文件;支持ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件
    (3)X-CAN 2.2.0.0版本开始,支持ZLG CANpro软件在CAN选项卡下保存的
    .can/.txt/.asc文件;支持ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;支持ZLG CANtest软件保存的 .can /.csv /.txt /.asc文件
    (4)X-CAN 2.2.2.0版本开始,支持ZLG CANpro软件在CAN选项卡下保存的
    .can/.txt/.asc文件;支持ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;支持ZLG CANtest软件保存的 .can /.csv /.txt /.asc文件;支持ZLG CANDTU保存的 .can /.csv /.txt /.asc文件
    (5)X-CAN 2.2.4.0版本开始,支持ZLG CANpro软件在CAN选项卡下保存的
    .can/.txt/.asc文件;支持ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;支持ZLG CANtest软件保存的 .can /.csv /.txt /.asc文件;支持ZLG CANDTU保存的 .can /.csv /.txt /.asc文件;支持PCAN软件保存的 .trc文件
    (CANpro和ZCANPRO的can文件格式定义的解读请参看本人的其他博文:《ZLG的CANpro保存的.can文件解析》和《ZCANPRO的.can文件解析》。)
    (6)如有其它格式的需求,请联系本人。

    软件版本兼容的CAN协议格式兼容的CAN数据文件格式
    X-CAN 2.2.8.1及以上版本.dbc(1).ZLG CANpro软件在CAN选项卡下保存的.can/.txt/.asc文件;
    (2).ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;
    (3).ZLG CANtest软件保存的.csv/.txt/.asc文件;
    (4).ZLG CANDTU保存的.csv/.txt/.asc/.can文件;
    (5).PCAN软件保存的.trc文件;
    (6).PCAN、Vector CANoe/CANape等软硬件保存的.asc文件;
    (7).同星TSMaster、Vector CANoe/CANape等软硬件保存的.blf文件。
    X-CAN 2.2.5.0~2.2.7.4.dbc(1).ZLG CANpro软件在CAN选项卡下保存的.can/.txt/.asc文件;
    (2).ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;
    (3).ZLG CANtest软件保存的.csv/.txt/.asc文件;
    (4).ZLG CANDTU保存的.csv/.txt/.asc/.can文件;
    (5).PCAN软件保存的.trc文件;
    (6).PCAN、Vector CANoe/CANape等软硬件保存的.asc文件。
    X-CAN 2.2.4.0~2.2.4.2.dbc(1).ZLG CANpro软件在CAN选项卡下保存的.can/.txt/.asc文件;
    (2).ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;
    (3).ZLG CANtest软件保存的.csv/.txt/.asc文件;
    (4).ZLG CANDTU保存的.csv/.txt/.asc/.can文件;
    (5).PCAN软件保存的.trc文件。
    X-CAN 2.2.2.0~2.2.3.2.dbc(1).ZLG CANpro软件在CAN选项卡下保存的.can/.txt/.asc文件;
    (2).ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;
    (3).ZLG CANtest软件保存的.csv/.txt/.asc文件;
    (4).ZLG CANDTU保存的.csv/.txt/.asc/.can文件。
    X-CAN 2.2.0.0~2.2.1.3.dbc(1).ZLG CANpro软件在CAN选项卡下保存的.can/.txt/.asc文件;
    (2).ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件;
    (3).ZLG CANtest软件保存的.csv/.txt/.asc文件。
    X-CAN 2.0~2.1.1.dbc(1).ZLG CANpro软件在CAN选项卡下保存的.can/.txt/.asc文件;
    (2).ZLG ZCANPRO软件保存的.can/.csv/.txt/.asc文件。
    X-CAN 1.9及以下版本.dbcZLG CANpro软件在CAN选项卡下保存的.txt/.asc文件。

    注意:不推荐使用.asc格式保存离线数据,CANpro和ZCANPRO保存生成的.asc文件的时间序列与其他几种格式相差较大。
    ZCANPRO软件请自行到ZLG官网下载。而CANpro软件ZLG官网则已不再提供下载,如有需要,可以点击这里到百度网盘下载,提取码:001q 。

    前言

    CAN是控制器局域网络(Controller Area Network, CAN)的简称,是ISO国际标准化的串行通信协议。1986 年德国博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,目前已是汽车网络的标准协议。CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
    在开发人员进行CAN总线相关装置进行调试测试时,通常会采用CAN卡连接CAN网络和PC电脑进行数据的采集、观察和记录。目前国内外有一些列配套的在线分析工具和软件,但是价格昂贵。但长期以来,人们对采集的CAN数据每次都借助EXCEL、Matlab、LabVIEW等工具以及相应的通讯协议配置进行手动解算信号,而且需要非常了解相应的通讯协议和分析处理过程,操作十分繁琐且费时。
    为了更便捷地对采集并储存到存储器中的CAN数据进行分析和绘图,基于LabVIEW平台开发了此X-CAN离线分析平台(以下简称X-CAN)。该X-CAN离线分析平台能够自动解析dbc格式的CAN通讯协议文件和CAN离线数据,并根据所选信号进行图标绘制。本人在进行CAN总线调试时采用CAN卡进行CAN总线数据采集和记录,并利用X-CAN离线分析平台能够高效、低成本的对CAN网络数据进行分析。

    X-CAN

    X-CAN离线分析平台所具有的主要功能如下:

    • 能够加载并读取CAN通讯协议DBC文件,并自动解析DBC文件内的报文信息(包括报文名、ID、字节数、发送节点)以及报文所含的各个信号的信息(包括信号名、起始位、长度、排序格式、有无符号、比例因子、偏移量、最小值、最大值、单位、发送节点),还有各个信号的值定义,并自动绘表显示;
    • 用户可以根据解析的DBC信号表自由选取所需要绘图的信号;
    • 用户可以查看任意信号的值定义;
    • 能够加载并读取ZLG相关软件保存的txt、can、asc、csv等格式的CAN离线数据,并根据所选信号自动绘制曲线;
    • 用户可以对绘制的图表进行缩放、移动、游标读取等操作,也可以导出所选择信号的曲线数据到EXCEL或位图中。

    应用X-CAN离线分析平台后,CAN数据分析过程中许多重复性的工作都可由计算机自动去执行,只需要鼠标进行简单点选即可完成以往繁琐的协议匹配、导入EXCEL、截取、排序、绘图等等操作,从而使得测试人员真正变为从事一些信息的分析、判断、决策等创造性的工作。

    使用说明

    最新版本的X-CAN离线分析平台主界面如下:
    在这里插入图片描述

    1 解析CAN通讯协议DBC

    X-CAN离线分析平台主界面的左上部分为DBC解析和查看的主要界面。
    在这里插入图片描述

    DBC文件是一种描述CAN通信协议的文件,德国 Vector的CANdb++软件可创建和编辑DBC文件,如果没有装这个软件的话,直接用记事本打开DBC文件也可以,但是由于文件的格式比较特殊,直接看文本的话难以理解,这时候可能就需要本软件直接读取解析。

    DBC文件中包含了CAN网络的节点定义、CAN报文的定义、各个信号的定义以及相关值的含义说明等,具体详情用户可至Vector官网进行查询。

    用户选择并加载DBC文件后,X-CAN立即自动解析DBC中的信息。X-CAN解析完DBC文件后会在路径下方显示该DBC文件中蕴含的报文数量和信号数量。

    X-CAN自动解析DBC文件得到其中的信息后,将报文及信号、信号的起始位、长度、格式、缩放系数、偏移量、最小值、最大值、单位、节点等信息以树形表格的形式进行显示,用户可以通过操纵树形表右侧的滚动条可以查看各个报文和信号的定义。
    在这里插入图片描述
    在这里插入图片描述

    也可以查看各信号的值表(值定义):
    在这里插入图片描述

    2 加载CAN离线数据

    在进行CAN数据绘图前,请先加载CAN离线数据。点击CAN离线数据栏目的文件夹按钮,即弹出文件选择框,选择txt或asc格式 的CAN离线数据,点击“加载”即可。点击“加载”后,X-CAN立即加载所选的CAN离线数据,并提示用户CAN离线数据的行数以及当前加载的百分比进度。加载完成后,提示语和进度条消失。说明程序已将数据读取到缓冲区。注:推荐使用ZLG的CANpro保存CAN离线数据

    在这里插入图片描述

    3、信号绘图

    在DBC树形表中双击信号来将信号添加到已选信号栏中,选择完毕后,点击“绘图”即可。
    在这里插入图片描述
    在这里插入图片描述

    用户通过右侧的图例窗口,右键颜色框,即可弹出更改曲线的按钮列表,通过此按钮列表,用户可更改曲线的可见性、曲线类型、线条样式、宽度等等,功能十分丰富,请用户自行探索。

    4、图表导出

    另外,曲线数据也可以导出,在X-CAN中的主图右键可以将绘制得到的图导出到剪贴板、EXCEL或简化图像。
    在这里插入图片描述

    以导出数据至EXCEL为例,点击“导出至EXCEL”即可将所选信号曲线的数据导出到EXCEL,其列顺序依已选信号顺序排列,即“信号1时间,信号1值,信号2时间,信号2值,信号3时间,信号3值……”
    在这里插入图片描述

    5、CAN数据文件合并

    从X-CAN 2.1版本开始,X-CAN集成CAN数据文件合并功能,在合并文件界面下,能够自动读取用户选择目录下后缀为can、txt、asc、csv四种格式的CAN数据文件,并能自动读取文件的大小、所包含的CAN报文数量、首帧时间、末帧时间、以及其所覆盖的时间长度。用户通过选择要合并的文件,可快速对多个CAN数据文件进行自动合并。
    在这里插入图片描述
    关于CAN数据文件合并的使用,请参看本人另外一篇博客:《CANjoiner:CAN离线数据文件合并器》,其详细的功能使用在此就不再赘述。
    在这里插入图片描述

    应用CAN离线数据文件合并器,可以快速查阅在计算机中保存的CAN离线数据文件,并根据需要对若干个数据文件进行合并,以便于后续的数据分析工作,使得数据分析人员可以不受文件分割而影响了数据或曲线的连续性,从而更快速的完成测试分析工作。

    6、多文件解析导出

    在实验测试过程中,经常需要测试多组数据。当进行离线分析时,就会产生多个数据文件解析同类信号的需求。在这里,X-CAN提供了批量解析及导出的功能来满足这个需求。

    具体的操作流程为:

    1. 加载DBC文件
    2. 选择待解析的信号至已选列表
    3. 点击批量解析及导出按钮
    4. 选择多个数据文件(按住Ctrl点选文件)
    5. 点击选择文件后,X-CAN即可自动逐个解析并导出至Excel。

    在这里插入图片描述

    导出的EXCEL将保存在所选择的数据文件相同的目录下,命名格式为“多文件解析+文件数量+日期.xls”。解析完成后,X-CAN会自动调用EXCEL打开结果文件。结果文件中将有文件数量+1个表格:第一个表格为文件列表,记录了所选择的多个文件的文件名,第二个表格开始为逐个文件的解析结果。

    文件列表

    在这里插入图片描述

    更新记录

    X-CAN 版本更新的内容
    2.3.2.11.释放复用信号解析的用户组限制;
    2. 新增右键导出至CSV文件功能;
    3.新增多文件批量解析及导出功能。
    2.3.1.21.增加主图右键菜单项;
    2.增加复制、粘贴Y轴参数的快捷菜单;
    3.修复已知bug;
    4.改进曲线滚动和缩放的响应速度。
    2.2.10.11. 新增低版本CANtest的txt文件解析;
    2.新增Benz XENTRY CAN-Tool保存的asc文件的解析;
    3.新增ZLG CANDTU绝对时间格式的csv文件的解析;
    4.新增打开Origin、上海同星TSmaster的快捷按钮。
    2.2.9.21.新增滚轮缩放和平移功能;
    2.新增某Excel格式数据文件的解析功能;
    3.绘图时自动调整Y轴上下限,上下空出至少一个单位分辨率;
    4.绘图区域右键菜单新增网格颜色设置(默认颜色、关闭所有网格、自定义网格颜色);
    5.调整界面UI;
    6.基本修复Y轴乱飞的BUG。
    2.2.8.11.新增Vector的BLF文件解析功能;
    2.修复无法找到dll的bug。
    2.2.7.41.新增对CAN2.0 复用信号的解析功能;
    2.新增用户分等级机制(注:使用本软件无需连网)。
    2.2.6.01.新增支持解析广成ECAN Tools保存的txt;
    2.新增3处右键菜单;
    3.支持关闭浮动显示坐标;
    4.支持关闭显示Y值定义;
    5.DBC信号列表支持一键展开和折叠;
    6.更改打开DBC和CAN数据文件的按钮。
    2.2.5.01、 支持解析及合并Vector CANoe/CANape和Peak CAN等软件保存的ASC文件;
    2、支持合并Peak CAN等软件保存的trc文件;
    3、改进更新功能,更新时自动退出老版本X-CAN;
    4、修正Peak CAN等软件保存的trc文件解析功能。
    2.2.4.21、绘图时自动选择插值方式,当有离散值定义时绘制为数字信号;
    2、鼠标放置曲线上时一并显示值定义(如有)。
    2.2.4.11、Y轴随曲线自动变颜色;
    2、初始线宽可设。
    2.2.4.01.新增支持解析PCAN软件保存的.trc格式CAN数据文件。
    2.2.3.21.改进主图网格、图例显示;
    2.发现新版本时显示新版本号。
    2.2.3.11.降低了低分屏界面的错位程度。
    2.2.3.01.添加鼠标放置在曲线上自动显示坐标的功能;
    2.改进自动更新功能。
    2.2.2.31.添加自动检查更新功能;
    2.添加自动重排时间顺序功能;
    3.优化部分bugs。
    2.2.2.21.添加语言设置功能,全面支持中文、English界面。
    2.2.2.11.添加若干按钮,可快速打开candb++、CANpro、CANtest等软件;
    2.缩小初始面板至1366*768以下,以避免低分屏错位严重。
    2.2.2.01.修改主界面背景;
    2.添加检查更新按钮;
    3.添加对CANDTU的txt和csv的支持。
    2.2.1.31.适配CANtest保存的另一种txt数据文件;
    2.修正CANpro.can文件的时间解析;
    3.生成英文版。
    2.2.0.01.适配CANtest保存的CAN数据文件(.csv/.txt/.asc);
    2.合并文件完成后立即刷新文件列表;
    3.添加时间轴的切换功能(相对时间(秒)/绝对时间(不显日期)/绝对时间(显示日期));
    4.添加“文件详情”按钮,查看CAN离线数据文件详情;;
    5.“关于”界面添加“前往网页”按钮,点击可打开浏览器显示博客;
    6.修改安装程序,添加卸载快捷方式。
    2.1.1.01.优化文本最后一行读取速度;
    2.优化若干细节问题。
    2.1.0 .01.添加合并文件的功能
    2.0.1 .01.修正解析ZCANPRO的can文件时可能产生的错误
    2.0.0 .01.增加解析ZCANPRO软件保存的数据文件能
    1.9.0.01.增加关于和捐赠按钮
    1.8.0.01.DBC添加有符号和无符号的区分
    1.6.0.01.添加.asc格式CAN数据的解析能力;
    2.离线数据解析得到的数据流中时间改为10us,注意:当时间总量超过11.9个小时时将会溢出;
    3、删除了游标图例,窗口最大化不至于重叠;
    4、增加“加载上一个DBC”按钮,点击可直接加载上次打开的DBC;
    5、DBC信号调整排列顺序,VECTOR__INDEPENDENT_SIG_MSG不再出现在前排;
    6、增加“导出至EXCEL”按钮,此功能为解决部分电脑出现无法导出到EXCEL的bug。

    后补

    附CANpro和ZCANPRO的软件界面如下两图,本人推荐使用CANpro,原因是CANpro可以显示和保存几百万帧的CAN报文都不成问题,而且CANpro保存的.can文件中仅使用24字节即可保存一帧CAN报文。而ZCANPRO中,非实时保存最大只能保存10万帧报文(平均10ms有2帧的话,也就保存个500s,也就是8分钟多一点。),实时保存则会按每个文件只保存10万帧自动生成多文件,而且ZCANPRO保存的.can文件中需要58~66字节来保存一帧CAN报文,异常庞大。另外,ZCANPRO没有“导入数据”选项,仅能通过“数据回放”复现数据,但是亲测ZCANPRO的“数据回放”可能导致时间轴失真。

    CANpro和ZCANPRO软件
    CANpro
    ZCANPRO

    本文为博主原创文章,未经博主允许不得转载。如有问题,欢迎指正。

    展开全文
  • 数据分析平台七大业务...②将数据收到 HDFS/Hive/HBase,使用MapReduce和Hive离线分析,其中涉及地域分析、用户相关信息分析及外链分析等。 ③依据业务深入MapReduce使用 ④数据处理时,针对不同问题如何优化调整等
  • Hive离线分析项目.zip

    2021-01-18 12:27:26
    对应的是Hive离线分析项目风秀直播平台这个项目是离线项目,一天算一次,定时脚本,夜间执行。第二天会算昨天的日志。 T+1一般都是分区表,一个分区存一天的数据
  • 当你准备对自己的网站数据进行深入分析时,是否曾面对着成百上千的数据不知如何下手?如果上面的问题会让你连连点头,那么请跟随我们,展开一段数据分析之旅。希望沿途的见闻,会让你在下次进行数据挖掘操作时,更加...
  • 1.4 了解离线分析系统概念以及处理流程 任务目的 了解离线分析系统的宏观概念 理解离线分析系统的处理流程 任务清单 任务1:需求分析 任务2:数据处理流程 任务3:项目最终效果 详细任务步骤 任务1:需求分析 1...
  • 大数据离线分析------数据仓库

    千次阅读 2019-01-11 15:48:03
    数据仓库是决策支持系统(dss)和联机分析应用数据源的结构化数据环境。 数据仓库特性: 面向主题 —&amp;amp;amp;amp;gt;分析的抽象概括,基于该主题拉数据。 集成性 —&amp;amp;amp;amp;gt;把来自各个...
  • 【项目三】大数据离线分析平台

    千次阅读 2018-05-26 19:22:17
    1.使用eclipse导入javaweb项目 test-aura具体导入方法使用下面的连接https://blog.csdn.net/jenrey/article/details/804575912.修改数据埋点收集的数据发送Nginx的位置注意修改后需要重新部署到Tomcat中3....
  • 离线分析的概念:离线分析指不在生产系统上直接做数据处理,把生产系统上的数据导入另外一个专门的数据分析环境(数据仓库中),跟生产系统脱离的情况下对数据进行计算跟处理,离线数据分析 处理的数据不是实时的,...
  • 大数据离线分析工具Hive简单介绍

    千次阅读 2018-05-20 14:36:32
    Hive是Facebook为了解决海量日志数据分析而开发的,后来开源给了Apache软件基金会,可见Apache软件基金会是个神奇的组织,我们之前学过的很多开源工具都有Apache软件基金会的身影。 官网定义: The Apache Hive ...
  • 某电商网站日志处理项目,使用hadoop、hive、hbase进行ETL清洗、MR分析分析结果入库mysql

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,420
精华内容 36,568
关键字:

数据离线分析