精华内容
下载资源
问答
  • 2015-07-22 14:21:05

    用Hadoop提取KPI统计指标

    前言

    Web日志包含着网站最重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值等。一般中型的网站(10W的PV以上),每天会产生1G以上Web日志文件。大型或超大型的网站,可能每小时就会产生10G的数据量。对于日志的这种规模的数据,用Hadoop进行日志分析,是最适合不过的了。

    WEB日志概述

    Web日志由Web服务器产生,可能是Nginx, Apache, Tomcat等。从Web日志中,我们可以获取网站每类页面的PV值(PageView,页面访问量)、独立IP数;稍微复杂一些的,可以计算得出用户所检索的关键词排行榜、用户停留时间最高的页面等;更复杂的,构建广告点击模型、分析用户行为特征等等。在Web日志中,每条日志通常代表着用户的一次访问行为,例如下面就是一条nginx日志:

    222.68.172.190 - - [18/Sep/2013:06:49:57 +0000] "GET /images/my.jpg HTTP/1.1" 200 19939
     "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1)
     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
    拆解为以下8个变量
    remote_addr: 记录客户端的ip地址, 222.68.172.190
    remote_user: 记录客户端用户名称, 
    time_local: 记录访问时间与时区, [18/Sep/2013:06:49:57 +0000]
    request: 记录请求的urlhttp协议, GET /images/my.jpg HTTP/1.1
    status: 记录请求状态,成功是200, 200
    body_bytes_sent: 记录发送给客户端文件主体内容大小, 19939
    http_referer: 用来记录从那个页面链接访问过来的, http://www.angularjs.cn/A00n
    http_user_agent: 记录客户浏览器的相关信息, Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36

    KPI指标设计

    • PV(PageView): 页面访问量统计
      Map过程{key:$request,value:1}
      Reduce过程{key:$request,value:求和(sum)}
    • IP: 页面独立IP的访问量统计
      Map: {key:$request,value:$remote_addr}
      Reduce: {key:$request,value:去重再求和(sum(unique))}
    • Time: 用户每小时PV的统计
      Map: {key:$time_local,value:1}
      Reduce: {key:$time_local,value:求和(sum)}
    • Browser: 用户的访问设备统计
      Map: {key:$http_user_agent,value:1}
      Reduce: {key:$http_user_agent,value:求和(sum)}
    • Source: 用户来源域名的统计
      Map: {key:$http_referer,value:1}
      Reduce: {key:$http_referer,value:求和(sum)}

    架构

    日志是由业务系统产生的,我们可以设置web服务器每天产生一个新的目录,目录下面会产生多个日志文件,每个日志文件64M。 设置系统定时器CRON,夜间在0点后,向HDFS导入昨天的日志文件。 完成导入后,设置系统定时器,启动MapReduce程序,提取并计算统计指标。 完成计算后,设置系统定时器,从HDFS导出统计指标数据到数据库,方便以后的即使查询。

    xxx

    程序开发

    public class KPIIP {
    
        public static class KPIIPMapper extends MapReduceBase implements Mapper<Object, Text, Text, Text> {
            private Text word = new Text();
            private Text ips = new Text();
    
            @Override
            public void map(Object key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
                KPI kpi = KPI.filterIPs(value.toString());
                if (kpi.isValid()) {
                    word.set(kpi.getRequest());
                    ips.set(kpi.getRemote_addr());
                    output.collect(word, ips);
                }
            }
        }
    
        public static class KPIIPReducer extends MapReduceBase implements Reducer<Text, Text, Text, Text> {
            private Text result = new Text();
            private Set<String> count = new HashSet<String>();
    
            @Override
            public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
                while (values.hasNext()) {
                    count.add(values.next().toString());
                }
                result.set(String.valueOf(count.size()));
                output.collect(key, result);
            }
        }
    
        public static void main(String[] args) throws Exception {
            String input = "hdfs://192.168.1.210:9000/user/hdfs/log_kpi/";
            String output = "hdfs://192.168.1.210:9000/user/hdfs/log_kpi/ip";
    
            JobConf conf = new JobConf(KPIIP.class);
            conf.setJobName("KPIIP");
            conf.addResource("classpath:/hadoop/core-site.xml");
            conf.addResource("classpath:/hadoop/hdfs-site.xml");
            conf.addResource("classpath:/hadoop/mapred-site.xml");
            
            conf.setMapOutputKeyClass(Text.class);
            conf.setMapOutputValueClass(Text.class);
            
            conf.setOutputKeyClass(Text.class);
            conf.setOutputValueClass(Text.class);
            
            conf.setMapperClass(KPIIPMapper.class);
            conf.setCombinerClass(KPIIPReducer.class);
            conf.setReducerClass(KPIIPReducer.class);
    
            conf.setInputFormat(TextInputFormat.class);
            conf.setOutputFormat(TextOutputFormat.class);
    
            FileInputFormat.setInputPaths(conf, new Path(input));
            FileOutputFormat.setOutputPath(conf, new Path(output));
    
            JobClient.runJob(conf);
            System.exit(0);
        }
    
    }


    更多相关内容
  • 网站kpi统计数据

    2016-02-22 19:27:14
    网站kpi统计数据
  • Hadoop网站KPI使用数据

    2018-06-15 20:50:18
    656MB的日志数据,可以测试数据分片,数据压缩,多节点存储的功能
  • 异常KPI指标自动邮件派发系统,刘天舒,,作为一名网优人员,监控指标一项非常重要并且需要长期坚持的工作,网优人员能够及时的发现指标的变化情况,尤其是发现异常指标,
  • 网站分析(KPI).pptx

    2021-10-11 03:51:28
    网站分析(KPI).pptx
  • 公钥 基础 设施 kpi 简介 入门 原理
  • 网站分析(Web Analytics)即网站访客行为分析,通过对网站数据进行定量和定性的分析,来不断驱动和提高访问者在网站中的体验,并将访客转化为你的商业目标(在线及离线KPI) 网站分析数据收集与处理 二:为何要分析...

    一:网站分析是什么?

    网站分析(Web Analytics)即网站访客行为分析,通过对网站数据进行定量和定性的分析,来不断驱动和提高访问者在网站中的体验,并将访客转化为你的商业目标(在线及离线KPI)

    网站分析数据收集与处理

    二:为何要分析网站数据?

    数据驱动业务提升

    从以上的示例图中可以看到,用户从点击访问到完成业务销售的整个环节,Google Analytics、 OMNITURE等网站分析工具收集提供的数据,有助于提升访问体验以获取更高的在线leads的转化。但是在离线leads的监测方面,却一直是一个数据盲点,我们往往无法将访问来源与电话呼叫的数据关联起来,关于离线监测的数据分析,大家请阅读Sidney Song的这篇文章:
    线上营销对线下行动效果的监测(下) ,另外一个数据盲点是 客服业务的转化环节,呼叫中心往往无法直接和客户访问来源做关联。我们只有把用户在各个环节的数据有效关联起来,才能第一时间内找到业务优化的正确方向!

    最佳实践

    1、标识流量源:通过网站分析工具linktag标识,准确标识细分流量渠道。

    2、定制商业KPI:了解用户在网站哪些关键行为对网站收益影响最大,并将关键行为定制为关键KPI。

    3、监测用户浏览路径:用户是如何在浏览网站?大多用户是在哪些页面流失掉?改进用户访问体验,提升转化率!

    4、分析端到端的ROI:从流量源-商业回报分析。

    5、计算边际成本:计算每次KPI盈亏成本,并根据每次CPA盈亏成本.得到每次CPC或每个用户获取的盈亏成本。

    6、确定优化方向:确定改进哪些环节可以最有效的提升商业回报!并有效执行。

    三、哪些数据指标(度量)具有重要意义?

    四:KPI定制实例

    1、KPI定制实例一

    背景:某健康门户站点一直以来只将咨询留言作为关键KPI,但是随着网站接触用户的渠道越来越多(WEB IM,在线QQ,等),及用户对于信息安全的担忧,KPI成本越来越高。也无法通过唯一的KPI客观的判定流量质量。甚至按照此考量标准去优化广告,已经无法支撑网站运营!

    (代码实施说明 for Google Analytics

    (目标转化配置)

    (数据报告)

    1、媒介优化考量指标是否合理?
    不同KPI转化情况如何? 哪些KPI转化的提升,能有效提升商业回报?

    2、留言KPI,在所有KPI转化中占有的比例是多少?
    结论:我的KPI设定是否合理?

    2、KPI定制实例二
    背景:某共享软件站点,由于竞争因素,市场份额不断萎缩. (计划依靠PPC 流量稳定住市场份额与软件销售,但是从自然搜索流量数据发现,大多数的购买转化只有千分之3,按照这个行业平均CPC (0.5美金)成本去计算,如果转化率达不到1%,很难盈亏平衡. (此站点平均每笔订单的金额大概是50美金左右)

    代码定制样例


    (目标转化配置)

    用户在是如何流失?



    五:解析流量属性与KPI之间的关系

    大多数转化率高的流量源,用户平均停留时间都超过了1分钟. 跳出率都在80%以内

    转换率表现最好的流量源,新访问者占有比率很低。

    所有停留时间低于30秒,跳出率高于90%的流量源无转化。

    这篇网站分析基础KPI实践,希望对大家能有所帮助。 有什么问题,有什么想法,都尽管留言吧! 同时也期待大家在留言中,分享一些KPI定制的案例和网站KPI定制的经验和见解!

    via:adsem

    展开全文
  • 信息安全知识分享—KPI技术

    千次阅读 2020-05-04 21:38:35
    直接上脑图:

    直接上脑图:
    在这里插入图片描述

    1.什么是PKI?

    PKI是在公开密钥加密技术基础上形成和发展起来的提供安全服务的通用性基础平台,用户可以利用PKI基础平台所提供的安全服务,在网上实现安全的通信。

    也有人将PKI定义为:
    它是创建、颁发、管理和撤销公钥证书所涉及的所有软件、硬件系统,以及所涉及的整个过程安全策略规范、法律法规和人员的集合。其中证书是PKI的核心元素,CA是PKI的核心执行者。

    2.使用基于PKI基础平台的用户建立安全通信相互信任的基础:

    1. 公钥的基础之上的,公钥是可以对外公开的
    2. 与公钥成对的私钥,必须自己严密保管
    3. 这个信任的基础是通过公钥证书的使用来实现的
      公钥证书就是一个用户在网上的身份证明,是用户身份与他所持有公钥的绑定结合,公钥证书由一个可信任的认证机构CA来审查和签发后生效。

    3.PKI的组成

    (1)认证机构CA(Certificate Authority)。

    • CA由以下3部分组成:
    1. 第一级是根CA,负责总政策。
    2. 第二级是政策CA,负责制定具体认证策略。
    3. 第三级为操作CA(OCA),是证书签发和发布机构。
    • 功能:
    1. 验证并标识证书申请者的身份;
    2. 确保CA用于签名证书的非对称密钥的质量和安全性(私钥大于1024bit);
    3. 对证书信息资料的管理,确保证书主体标识的唯一性;
    4. 在证书使用中确定并检查证书的有效期;
    5. 发布和维护作废证书列表(CRL);
    6. 对已签发证书的使用全过程进行监视跟踪,作全程日志记录,以备发生交易争端时,提供公正依据,参与仲裁。
    • 为实现其功能,主要组成部分
    1. 注册服务器:通过Web Server建立的站点,可为客户提供网上提出证书申请和填写相应的证书申请表。
    2. 证书申请受理和审核机构:负责客户证书的申请和审核。
    3. 认证中心服务器:是数字证书生成、发放的运行实体,同时提供发放证书的管理、证书废止列表(CRL)的生成和处理等服务。

    (2)证书和证书库

    • 证书
    1. 主要内容按X.509标准规定其逻辑表达式为:
     CA《A》= CA﹛V,SN,AI,CA,UCA,A,UA,AP,TA﹜
    
    1. 目前我国已建成的第三方认证机构
      中国电信CA安全认证体系(CTCA)
      上海电子商务CA认证中心(SHECA)
      中国金融认证中心(CFCA)

    2. 在PKI体系中,获得证书的方式
      发送者发送签名信息时,附加发送自己的证书
      单独发送证书信息的通道
      可从访问发布证书的目录服务器获得
      可从证书的相关实体(如RA)处获得

    3. 用户产生、验证和分发密钥的方式
      用户自己产生密钥对。
      CA为用户产生密钥对

    • 证书库
    1. 由于证书的不可伪造性,因此,可以在数据库中公布,而无须其他的安全措施来保护这些证书。
    2. 供广大公众开放式查询的目的
      想得到与之通信实体的公钥
      验证通信对方的证书是否已进入“黑名单”

    (3)证书撤销
    认证机构CA通过签发证书来为用户的身份和公钥进行捆绑,但因种种原因,还必须存在一种机制来撤销这种捆绑关系,将现行的证书撤销。

    • 撤销延迟
      两次证书撤销信息之间的间隔
    • 证书撤销的实现方法
    1. 利用周期性的发布机制
    2. 在线查询机制

    (4)密钥备份和恢复
    在这里插入图片描述

    (5)密钥和证书的更新
    一个证书的有效期是有限的

    (6)证书历史档案
    旧证书和相应的私钥组成了用户密钥和证书的历史档案。

    (7)交叉认证
    在这里插入图片描述

    (8)不可否认性
    如甲签发了某份文件,若干时间后,他不能否认他对该文件进行了数字签名

    (9)时间戳
    是一个可信的时间权威用一段可认证的完整数据表示的时间戳(以格林尼治时间为标准的32bit值)

    (10)客户端软件
    在这里插入图片描述

    (11)证书运作声明
    也称证书运作规范,它是PKI不可缺少的安全策略组成部分

    展开全文
  •  ▶ PV(Page View):页面浏览量,用户每1次对网站中的每个网页访问均被记录1次。用户对同一页面的多次访问,计算累计访问。通常对网站中资源的访问请求也被计算在PV统计内;  ▶ 跳出率:只访问了一个页面就离开...

      本项目分析apache服务器产生的日志,分析pv、独立ip数和跳出率等指标。其实这些指标在第三方系统中都可以检测到,在生产环境中通常用来分析用户交易等核心数据,此处只是用于演示说明日志数据的分析流程。

    一、需求分析

      我们可以编写执行的shell脚本,将apache每天产生的日志上传到HDFS中,然后经过数据清洗,hive分析,最后将数据从HDFS导入到mysql中,然后设定计划任务每天定期自动执行分析工作。

    1、指标说明

       ▶ PV(Page View):页面浏览量,用户每1次对网站中的每个网页访问均被记录1次。用户对同一页面的多次访问,计算累计访问。通常对网站中资源的访问请求也被计算在PV统计内;

       ▶ 跳出率:只访问了一个页面就离开的浏览量与所产生总浏览量的百分比;

    2、实现步骤

       1) 将日志数据上传到HDFS中。如果数据较小,可以通过在shell中编写hdfs命令上传数据到HDFS中,如果数据量较大的话可以通过NFS在另一台机器上上传日志数据。如果服务器比较多,可以使用flume来完成日志收集工作;

       2) 使用MapReduce将HDFS中进行数据清洗。日志原始数据可能在格式上不满足要求,这时候需要通过MapReduce程序来将HDFS中的数据进行清洗过滤,转换成hive统计所需要的格式;

       3) 使用hive对清洗后的数据进行统计分析。利用hive,我们可以很方便地统计分析日志数据。实现建立一个外部分区表,关联到清洗后的HDFS目录中,然后每天数据清洗完后添加当天的分区,最后执行HiveQL完成统计并保存结果;

       4) 利用sqoop将hive统计结果导出到关系数据库如mysql中;

       5) 前端展现统计结果。利用web或其他一些展现手段将mysql中的结果数据直观地展示给用户;

    二、详细实现

       本实验分析apache服务器产生的访问日志(样本),其数据格式如“221.194.31.149 - - [27/May/2015:17:52:48 +0800] "GET /static/image/common/star_level1.gif HTTP/1.1" 200 547”,依次表示访问ip、访问时间、访问路径、服务器返回状态。

       本实验实验流程图如下所示:

    图1 apache服务器日志分析流程示意图 

    1、编写MapReduce,将原始数据格式清洗筛选,留下三列:IP、访问时间和访问地址,参考代码:

    package com.hicoor.hadoop.logproj;
    
    import java.net.URI;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;
    import org.apache.hadoop.util.GenericOptionsParser;
    
    public class DataCleaner {
        
        static class LogMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
            LogParser logParser = new LogParser();
            Text v2 = new Text();
            protected void map(LongWritable k1, Text v1, org.apache.hadoop.mapreduce.Mapper<LongWritable,Text,Text,LongWritable>.Context context) throws java.io.IOException ,InterruptedException {
                try {
                    String[] parse = logParser.parse(v1.toString());
                    //过滤空白行
                    if(parse != null) {
                        //过滤结尾的特定格式字符串
                        if(parse[2].endsWith(" HTTP/1.1")){
                            parse[2] = parse[2].substring(0, parse[2].length()-" HTTP/1.1".length());
                        }
                        
                        v2.set(parse[0]+'\t'+parse[1]+'\t'+parse[2]);
                    }
                } catch (Exception e) {
                    System.out.println("当前行处理出错:"+v1.toString());
                }
                context.write(v2, new LongWritable(1));
            };
        }
        
        static class LogReduce extends Reducer<Text, LongWritable, Text, NullWritable>{
            protected void reduce(Text k2, java.lang.Iterable<LongWritable> v2s, org.apache.hadoop.mapreduce.Reducer<Text,LongWritable,Text,NullWritable>.Context context) throws java.io.IOException ,InterruptedException {
                context.write(k2, NullWritable.get());
            };
        }
        
        public static void main(String[] args) throws Exception {
            System.setProperty("hadoop.home.dir", "D:/desktop/hadoop-2.6.0");
            Configuration conf = new Configuration();
            conf.setStrings("dfs.nameservices", "cluster1");
            conf.setStrings("dfs.ha.namenodes.cluster1", "hadoop0,hadoop1");
            conf.setStrings("dfs.namenode.rpc-address.cluster1.hadoop0", "hadoop0:9000");
            conf.setStrings("dfs.namenode.rpc-address.cluster1.hadoop1", "hadoop1:9000");
            //必须配置,可以通过该类获取当前处于active状态的namenode
            conf.setStrings("dfs.client.failover.proxy.provider.cluster1", "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
            
            
            Job job = Job.getInstance(conf, "LogDataCleaner");
            
            String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
            if (otherArgs.length < 2) {
              System.err.println("Usage: wordcount <in> [<in>...] <out>");
              System.exit(2);
            }
            
                
            // 删除已存在的输出目录
            String FILE_OUT_PATH = otherArgs[otherArgs.length - 1];
            //String FILE_OUT_PATH = "hdfs://cluster1/hmbbs_cleaned/2013_05_30";
             FileSystem fileSystem = FileSystem.get(new URI(FILE_OUT_PATH), conf);
             if (fileSystem.exists(new Path(FILE_OUT_PATH))) {
                 fileSystem.delete(new Path(FILE_OUT_PATH), true);
             }
            
            job.setJarByClass(DataCleaner.class);
            //1.1 设置分片函数
            job.setInputFormatClass(TextInputFormat.class);
            for (int i = 0; i < otherArgs.length - 1; ++i) {
              FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
            }
            //FileInputFormat.addInputPath(job, new Path("hdfs://cluster1/hmbbs_logs/access_2013_05_30.log"));
            //1.2 设置map
            job.setMapperClass(LogMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(LongWritable.class);
            //1.3 设置分区函数
            job.setPartitionerClass(HashPartitioner.class);
            //job.setNumReduceTasks(3);
            //1.4 分组排序
            //1.5 规约
            
            job.setOutputFormatClass(TextOutputFormat.class);
            FileOutputFormat.setOutputPath(job, new Path(FILE_OUT_PATH));
            
            //2.2 设置Reduce
            job.setReducerClass(LogReduce.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(NullWritable.class);
            
            job.waitForCompletion(true);
        }
        
        static class LogParser {
    
            public static final SimpleDateFormat FORMAT = new SimpleDateFormat("d/MMM/yyyy:HH:mm:ss", Locale.ENGLISH);
            public static final SimpleDateFormat dateformat1=new SimpleDateFormat("yyyyMMddHHmmss");
    //        public static void main(String[] args) throws ParseException {
    //            final String S1 = "27.19.74.143 - - [30/May/2013:17:38:20 +0800] \"GET /static/image/common/faq.gif HTTP/1.1\" 200 1127";
    //            LogParser parser = new LogParser();
    //            final String[] array = parser.parse(S1);
    //            System.out.println("样例数据: "+S1);
    //            System.out.format("解析结果:  ip=%s, time=%s, url=%s, status=%s, traffic=%s", array[0], array[1], array[2], array[3], array[4]);
    //        }
            /**
             * 解析英文时间字符串
             * @param string
             * @return
             * @throws ParseException
             */
            private Date parseDateFormat(String string){
                Date parse = null;
                try {
                    parse = FORMAT.parse(string);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                return parse;
            }
            /**
             * 解析日志的行记录
             * @param line
             * @return 数组含有5个元素,分别是ip、时间、url、状态、流量
             */
            public String[] parse(String line){
                if(line.trim() == "") {
                    return null;
                }
                String ip = parseIP(line);
                String time = parseTime(line);
                String url = parseURL(line);
                String status = parseStatus(line);
                String traffic = parseTraffic(line);
                
                return new String[]{ip, time ,url, status, traffic};
            }
            
            private String parseTraffic(String line) {
                final String trim = line.substring(line.lastIndexOf("\"")+1).trim();
                String traffic = trim.split(" ")[1];
                return traffic;
            }
            private String parseStatus(String line) {
                final String trim = line.substring(line.lastIndexOf("\"")+1).trim();
                String status = trim.split(" ")[0];
                return status;
            }
            private String parseURL(String line) {
                final int first = line.indexOf("\"");
                final int last = line.lastIndexOf("\"");
                String url = line.substring(first+1, last);
                return url;
            }
            private String parseTime(String line) {
                final int first = line.indexOf("[");
                final int last = line.indexOf("+0800]");
                String time = line.substring(first+1,last).trim();
                Date date = parseDateFormat(time);
                return dateformat1.format(date);
            }
            private String parseIP(String line) {
                String ip = line.split("- -")[0].trim();
                return ip;
            }
            
        }
    }
    View Code

    2、mysql中新建表web_logs_stat,包含字段:vtime、pv、ip_n、jumper_n。

    3、在shell中创建外部分区表,关联到清洗后的hdfs目录,命令:

       hive> CREATE EXTERNAL TABLE ex_logs(ip string, atime string, url string) PARTITIONED BY (logdate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/web_cleaned';

    4、新建日常自动处理的shell脚本logs_daily_process.sh,内容如下:

    #!/bin/sh
    
    #get yesterday format string
    yesterday=`date --date='1 days ago' +%Y_%m_%d`
    #yesterday=$1
    
    #upload logs to hdfs
    hadoop fs -put /apache_logs/access_${yesterday}.log  /web_logs
    
    #cleaning data
    hadoop jar /apache_logs/cleaned.jar  /web_logs/access_${yesterday}.log  /web_cleaned/${yesterday}  1>/dev/null
    
    
    #alter hive table and then add partition to existed table
    hive -e "ALTER TABLE ex_logs ADD PARTITION(logdate='${yesterday}') LOCATION '/web_cleaned/${yesterday}';"
    
    #create hive table everyday
    hive -e "CREATE TABLE web_pv_${yesterday} AS SELECT COUNT(1) AS PV FROM ex_logs WHERE logdate='${yesterday}';"
    hive -e "CREATE TABLE web_ip_${yesterday} AS SELECT COUNT(DISTINCT ip) AS IP FROM ex_logs WHERE logdate='${yesterday}';"
    hive -e "CREATE TABLE web_jumper_${yesterday} AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM ex_logs WHERE logdate='${yesterday}' GROUP BY ip HAVING times=1) e;"
    hive -e "CREATE TABLE web_${yesterday} AS SELECT '${yesterday}', a.pv, b.ip, C.jumper FROM web_pv_${yesterday} a JOIN  JOIN web_ip_${yesterday} b ON 1=1 JOIN web_jumper_${yesterday} c ON 1=1;"
    
    #delete hive tables
    hive -e "drop table web_pv_${yesterday};"
    hive -e "drop table web_ip_${yesterday};"
    hive -e "drop table web_jumper_${yesterday};"
    
    
    #sqoop export to mysql
    sqoop export --connect jdbc:mysql://hadoop0:3306/ex_logs --username root --password 123456 --table web_logs_stat --fields-terminated-by '\001' --export-dir '/user/hive/warehouse/web_${yesterday}'
    
    #delete hive tables
    hive -e "drop table web_${yesterday};"
    View Code

    5、配置计划任务,命令:crontab -e,内容如:* 1 * * * logs_daily_process.sh,表示每天1点周期执行脚本。

    转载于:https://www.cnblogs.com/hanganglin/p/4533992.html

    展开全文
  • SEO推广计划类型可以分为哪些,推广手段众多,除了我们熟知的搜索引擎网站推广,博客微博推广,提到推广就离不开目标的确定。在营销中拥有KPI很重要,SEO也不例外。 SEO推广离不开销售的相关概念,简洁、快速...
  • ZAC访谈精华:有关网站定位,成功秘密及seo团队KPI.doc
  • 本文节选译自Eric T.Peterson的《网站分析KPI大全》 一、表现形式  在设计KPI指标时,“期间”的设计非常重要。期间按照时间的长短可以从「按日」到「按年」进行合计,根据不同的业务背景采取不同的
  • 页面URL:http://blog.digitalforest.cn/web-analytics-kpi-pvpervisit   通过每次访问的页面浏览数,可以统计出访问者对该网站感兴趣的程度和导航是否能够顺利的运行。 图:每次访问的页面浏览数...
  • 某体育用品公司信息发展部MIS&POS组网站管理员KPI组成表.doc
  • 本文节选译自Eric T.Peterson的《网站分析KPI大全》 一、表现形式  在设计KPI指标时,“期间”的设计非常重要。期间按照时间的长短可以从「按日」到「按年」进行合计,根据不同的业务背景采取不...
  • 转载:网站分析KPI汇总 网站分析KPI汇总   原文出处:数码林博客 http://blog.digitalforest.cn/kpi-collect   2012年06月18日 | 作者 数码林 | KPI精选连载 1. 订单转化率  订单转化...
  • MapReduce实现网站用户流量统计网站的文件都会统计注册用户的流量信息,下面实现一个统计用户的上行流量,下行流量和总共使用流量。基本的思路还是通过map(获取日志中的一行数据,切分各个字段,抽取出我们需要的...
  • 网站分析KPI汇总

    2012-10-30 17:42:49
    原文地址:http://blog.digitalforest.cn/kpi-collect     1. 订单转化率  订单转化率是指在线的商品销售网站或者是在线的服务提供网站,通过网站分析工具对网站访问者的统计,明确其中订购了商品(服务...
  • SEO优化的五大KPI

    2018-07-18 16:48:45
    做网站优化,如何观测优化的效果,想必是所有SEOer所关心的问题,特别是网站主管、SEO优化经理(主管)必做的工作任务之一。SEO优化的项目有很多,有些数据是我们无法统计和观测的,只能通过一些数据来具体分析得出...
  • KPI_library 该库可存储任何企业的关键绩效指标,使用Google Spreadsheets作为源并将搜索结果存储在数据库中。 您可以在下面看到有关如何自行下载和使用的提示。 使用的主要库是jLord的SheetSee(非常感谢您创建它...
  • 一个渐进式的框架,用于构建高效且可扩展的服务器端应用程序。 描述 框架TypeScript入门资料库。 安装 $ npm install 运行应用 # development $ npm run start # watch mode ... 网站-https: 执照 Nest已。
  • 程序员的KPI考核

    千次阅读 2019-03-01 09:54:21
    web前端教程用大白话,来讲编程关于程序员的绩效考核,一直存在很大的争议!之前我在微信上问过很多公众号的伙伴,大家所在的公司对于KPI考核也是五花八门。程序员的绩效考核不...
  • 用java针对网站日志进行KPI处理的代码,分段进行。package byzx.fq.get;/** *针对sogou表 KPI 数据表统计工程 */ public class KPI { //工程信息定义 private String time;// 记录客户端的访问时件 time ...
  • 网站分析实战

    2018-10-19 16:20:27
    第1章解密神奇的网站分析——网站分析的目的、流程及价值 第2章从这里开始学习网站...第7章我们的目标是什么——网站目标与KPI 第8章深入追踪网站的访问者——路径与转化分析 第9章从新手到专家——网站分析高级应用
  • ...................... 转载于:https://www.cnblogs.com/xyp666/p/9407991.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,453
精华内容 2,581
关键字:

网站KPI