精华内容
下载资源
问答
  • 主要介绍了shell统计pv和uv、独立ip的方法,需要的朋友可以参考下
  • Flink计算pv和uv的通用方法

    千次阅读 2021-11-02 00:41:40
    PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-...

    PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。

    UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。

    计算网站App的实时pv和uv,是很常见的统计需求,这里提供通用的计算方法,不同的业务需求只需要小改即可拿来即用。

    需求

    利用Flink实时统计,从0点到当前的pv、uv。

    一、需求分析

    Kafka发送过来的数据含有:时间戳时间维度用户id,需要从不同维度统计从0点到当前时间的pvuv,第二天0点重新开始计数第二天的。

    二、技术方案

    • Kafka数据可能会有延迟乱序,这里引入watermark

    • 通过keyBy分流进不同的滚动window,每个窗口内计算pvuv

    • 由于需要保存一天的状态,process里面使用ValueState保存pvuv

    • 使用BitMap类型ValueState,占内存很小,引入支持bitmap的依赖;

    • 保存状态需要设置ttl过期时间,第二天把第一天的过期,避免内存占用过大。

    三、数据准备

    这里假设是用户订单数据,数据格式如下:

    {"time":"2021-10-31 22:00:01","timestamp":"1635228001","product":"苹果手机","uid":255420}
    {"time":"2021-10-31 22:00:02","timestamp":"1635228001","product":"MacBook Pro","uid":255421}

    四、代码实现

    整个工程代码截图如下(抹去了一些不方便公开的信息):

    5dbf9be5577d32b0c574dafbc02d10b4.png
    pvuv-project

    1. 环境

    kafka:1.0.0;

    Flink:1.11.0;

    2. 发送测试数据

    首先发送数据到kafka测试集群,maven依赖:

    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>2.4.1</version>
    </dependency>

    发送代码:

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import jodd.util.ThreadUtil;
    import org.apache.commons.lang3.StringUtils;
    import org.junit.Test;
    
    import java.io.*;
    
    public class SendDataToKafka {
    
        @Test
        public void sendData() throws IOException {
            String inpath = "E:\\我的文件\\click.txt";
            String topic = "click_test";
            int cnt = 0;
            String line;
            InputStream inputStream = new FileInputStream(inpath);
            Reader reader = new InputStreamReader(inputStream);
            LineNumberReader lnr = new LineNumberReader(reader);
            while ((line = lnr.readLine()) != null) {
                // 这里的KafkaUtil是个生产者、消费者工具类,可以自行实现
                KafkaUtil.sendDataToKafka(topic, String.valueOf(cnt), line);
                cnt = cnt + 1;
                ThreadUtil.sleep(100);
            }
        }
    }

    3. 主要程序

    先定义个pojo

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @ToString
    public class UserClickModel {
        private String date;
        private String product;
        private int uid;
        private int pv;
        private int uv;
    }

    接着就是使用Flink消费kafka,指定Watermark,通过KeyBy分流,进入滚动窗口函数通过状态保存pvuv

    public class UserClickMain {
    
        private static final Map<String, String> config = Configuration.initConfig("commons.xml");
    
        public static void main(String[] args) throws Exception {
    
            // 初始化环境,配置相关属性
            StreamExecutionEnvironment senv = StreamExecutionEnvironment.getExecutionEnvironment();
            senv.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
            senv.enableCheckpointing(5000, CheckpointingMode.EXACTLY_ONCE);
            senv.setStateBackend(new FsStateBackend("hdfs://bigdata/flink/checkpoints/userClick"));
    
            // 读取kafka
            Properties kafkaProps = new Properties();
            kafkaProps.setProperty("bootstrap.servers", config.get("kafka-ipport"));
            kafkaProps.setProperty("group.id", config.get("kafka-groupid"));
            // kafkaProps.setProperty("auto.offset.reset", "earliest");
    
            // watrmark 允许数据延迟时间
            long maxOutOfOrderness = 5 * 1000L;
            SingleOutputStreamOperator<UserClickModel> dataStream = senv.addSource(
                    new FlinkKafkaConsumer<>(
                            config.get("kafka-topic"),
                            new SimpleStringSchema(),
                            kafkaProps
                    ))
                    //设置watermark
                    .assignTimestampsAndWatermarks(WatermarkStrategy.<String>forBoundedOutOfOrderness(Duration.ofMillis(maxOutOfOrderness))
                            .withTimestampAssigner((element, recordTimestamp) -> {
                                // 时间戳须为毫秒
                                return Long.valueOf(JSON.parseObject(element).getString("timestamp")) * 1000;
                            })).map(new FCClickMapFunction()).returns(TypeInformation.of(new TypeHint<UserClickModel>() {
                    }));
    
            // 按照 (date, product) 分组
            dataStream.keyBy(new KeySelector<UserClickModel, Tuple2<String, String>>() {
                @Override
                public Tuple2<String, String> getKey(UserClickModel value) throws Exception {
                    return Tuple2.of(value.getDate(), value.getProduct());
                }
            })
                    // 一天为窗口,指定时间起点比时间戳时间早8个小时
                    .window(TumblingEventTimeWindows.of(Time.days(1), Time.hours(-8)))
                    // 10s触发一次计算,更新统计结果
                    .trigger(ContinuousEventTimeTrigger.of(Time.seconds(10)))
                    // 计算pv uv
                    .process(new MyProcessWindowFunctionBitMap())
                    // 保存结果到mysql
                    .addSink(new FCClickSinkFunction());
    
            senv.execute(UserClickMain.class.getSimpleName());
        }
    }

    代码都是一些常规代码,但是还是有几点需要注意的。

    注意

    1. 设置watermark,flink1.11中使用WatermarkStrategy,老的已经废弃了;

    2. 我的数据里面时间戳是秒,需要乘以1000,flink提取时间字段,必须为毫秒

    3. .window只传入一个参数,表明是滚动窗口,TumblingEventTimeWindows.of(Time.days(1), Time.hours(-8))这里指定了窗口的大小为一天,由于中国北京时间是东8区,比国际时间早8个小时,需要引入offset,可以自行进入该方法源码查看英文注释。

    Rather than that,if you are living in somewhere which is not using UTC±00:00 time,
    * such as China which is using UTC+08:00,and you want a time window with size of one day,
    * and window begins at every 00:00:00 of local time,you may use {@code of(Time.days(1),Time.hours(-8))}.
    * The parameter of offset is {@code Time.hours(-8))} since UTC+08:00 is 8 hours earlier than UTC time.
    1. 一天大小的窗口,根据watermark机制一天触发计算一次,显然是不合理的,需要用trigger函数指定触发间隔为10s一次,这样我们的pvuv就是10s更新一次结果。

    4. 关键代码,计算uv

    由于这里用户id刚好是数字,可以使用bitmap去重,简单原理是:把 user_id 作为 bit 的偏移量 offset,设置为 1 表示有访问,使用 1 MB的空间就可以存放 800 多万用户的一天访问计数情况

    redis是自带bit数据结构的,不过为了尽量少依赖外部存储媒介,这里自己实现bit,引入相应maven依赖即可:

    <dependency>
        <groupId>org.roaringbitmap</groupId>
        <artifactId>RoaringBitmap</artifactId>
        <version>0.8.0</version>
    </dependency>

    计算pv、uv的代码其实都是通用的,可以根据自己的实际业务情况快速修改的:

    public class MyProcessWindowFunctionBitMap extends ProcessWindowFunction<UserClickModel, UserClickModel, Tuple<String, String>, TimeWindow> {
    
        private transient ValueState<Integer> pvState;
        private transient ValueState<Roaring64NavigableMap> bitMapState;
    
        @Override
        public void open(Configuration parameters) throws Exception {
            super.open(parameters);
            ValueStateDescriptor<Integer> pvStateDescriptor = new ValueStateDescriptor<>("pv", Integer.class);
            ValueStateDescriptor<Roaring64NavigableMap> bitMapStateDescriptor = new ValueStateDescriptor("bitMap"
                    , TypeInformation.of(new TypeHint<Roaring64NavigableMap>() {}));
    
            // 过期状态清除
            StateTtlConfig stateTtlConfig = StateTtlConfig
                    .newBuilder(Time.days(1))
                    .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
                    .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
                    .build();
            // 开启ttl
            pvStateDescriptor.enableTimeToLive(stateTtlConfig);
            bitMapStateDescriptor.enableTimeToLive(stateTtlConfig);
    
            pvState = this.getRuntimeContext().getState(pvStateDescriptor);
            bitMapState = this.getRuntimeContext().getState(bitMapStateDescriptor);
        }
    
        @Override
        public void process(Tuple2<String, String> key, Context context, Iterable<UserClickModel> elements, Collector<UserClickModel> out) throws Exception {
    
            // 当前状态的pv uv
            Integer pv = pvState.value();
            Roaring64NavigableMap bitMap = bitMapState.value();
            if(bitMap == null){
                bitMap = new Roaring64NavigableMap();
                pv = 0;
            }
    
            Iterator<UserClickModel> iterator = elements.iterator();
            while (iterator.hasNext()){
                pv = pv + 1;
                int uid = iterator.next().getUid();
                //如果userId可以转成long
                bitMap.add(uid);
            }
    
            // 更新pv
            pvState.update(pv);
    
            UserClickModel UserClickModel = new UserClickModel();
            UserClickModel.setDate(key.f0);
            UserClickModel.setProduct(key.f1);
            UserClickModel.setPv(pv);
            UserClickModel.setUv(bitMap.getIntCardinality());
    
            out.collect(UserClickModel);
        }
    }

    注意

    1. 由于计算uv第二天的时候,就不需要第一天数据了,要及时清理内存中前一天的状态,通过ttl机制过期;

    2. 最终结果保存到mysql里面,如果数据结果分类聚合太多,要注意mysql压力,这块可以自行优化;

    五、其它方法

    除了使用bitmap去重外,还可以使用Flink SQL,编码更简洁,还可以借助外面的媒介Redis去重:

    1. 基于 set

    2. 基于 bit

    3. 基于 HyperLogLog

    4. 基于bloomfilter

    具体思路是,计算pvuv都塞入redis里面,然后再获取值保存统计结果,也是比较常用的。

    猜你喜欢
    HDFS的快照讲解
    Hadoop 数据迁移用法详解
    Hbase修复工具Hbck
    数仓建模分层理论
    一文搞懂Hive的数据存储与压缩
    大数据组件重点学习这几个

    展开全文
  • 大数据开发最常统计的需求可能就是 PVUVPV 全拼 PageView,即页面访问量,用户每次对网站的访问均被记录,按照访问量进行累计,假如用户对同一页面访问了 5 次,那该页面的 PV 就应该加 5。UV 全拼为 ...

    大数据开发最常统计的需求可能就是 PV、UV。PV 全拼 PageView,即页面访问量,用户每次对网站的访问均被记录,按照访问量进行累计,假如用户对同一页面访问了 5 次,那该页面的 PV 就应该加 5。UV 全拼为 UniqueVisitor,即独立访问用户数,访问该页面的一台电脑客户端为一个访客,假如用户对同一页面访问了 5 次,那么该页面的 UV 只应该加 1,因为 UV 计算的是去重后的用户数而不是访问次数。当然如果是按天统计,那么当天 0 点到 24 点相同的客户端只被计算一次,如果过了今天 24 点,第二天该用户又访问了该页面,那么第二天该页面的 UV 应该加 1。 概念明白了那如何使用 Flink 来统计网站各页面的 PV 和 UV 呢?通过本节来详细描述。

    统计网站各页面一天内的 PV

    在 9.5.2 节端对端如何保证 Exactly Once 中的幂等性写入如何保证端对端 Exactly Once 部分已经用案例讲述了如何通过 Flink 的状态来计算 app 的 PV,并能够保证 Exactly Once。如果在工作中需要计算网站各页面一天内的 PV,只需要将案例中的 app 替换成各页面的 id 或者各页面的 url 进行统计即可,按照各页面 id 和日期组合做为 key 进行 keyBy,相同页面、相同日期的数据发送到相同的实例中进行 PV 值的累加,每个 key 对应一个 ValueState,将 PV 值维护在 ValueState 即可。如果一些页面属于爆款页面,例如首页或者活动页面访问特别频繁就可能出现某些 subtask 上的数据量特别大,导致各个 subtask 之前出现数据倾斜的问题,关于数据倾斜的解决方案请参考 9.6 节。

    统计网站各页面一天内的 UV

    PV 统计相对来说比较简单,每来一条用户的访问日志

    展开全文
  • 网站pv和uv比例多少合适?今天有一个人问我这个问题,SEO优化顶尖大师认为,UV越多越好,PV更多好。但是其实不同行业又是不能相比的,针对大部分的站点而言,PVUV至少三倍以上就不错了。两倍则在大部分行业内都是...

    网站pv和uv比例多少合适?今天有一个人问我这个问题,SEO优化顶尖大师认为,UV越多越好,PV更多好。但是其实不同行业又是不能相比的,针对大部分的站点而言,PV是UV至少三倍以上就不错了。两倍则在大部分行业内都是质量不好的表现。

    在这里插入图片描述

    PV和UV的质量度我们来看几个例子:

    第一个老站,虽然PV是UV的三倍还不到。但是行业所限,只能达到这个标准了,已经可以因此排名第一。所以很难有发展的空间也无需再发展。(综合得分上足够把同行压下去了,即权重同词中最高了)。

    第二个是才上线十天的新站,所以PV才是UV的两倍而已,明显还有发展空间,质量不足的表现,粘性还不够,因为内容不够丰富和完善。(不要问为什么流量一出生就那么高,哥告诉你:生态链;先有了流量后昨天才收录首页的)。

    第三个是论坛,PV是UV的七倍以上了。这个是因为论坛性质决定。尽管如此,和同行论坛相比,质量还算低的。还需要好好做一下才能和同行竞争;否则只能用八个字表达:做得太烂,不堪一击。

    第四个,应该还算不错的。其实第四个站应该看收录和外链和流量;内容少,长尾覆盖率低,不能在核心词上直接把对手压下去,只能靠流量围剿了,一个是长尾引流辅助,一个是外部直接引流为主攻,增加综合得分。另外,此站重点要要看的链接太少,进入首页之前外链都没过十,因此外链也需要好好建设才能冲到第一。所以目前只能在四五六七名反复跳动。(到了首页的站描述也很重要,此站已经更改过描述,非常狗血的描述,让你看到喷血的那种,所以预计下次快照跳出来后会被很快点击上去)。

    展开全文
  • 通过MapReduce统计PV和UV

    2019-08-15 13:10:00
    通过MapReduce统计PV和UV 一、pv(page view,页面浏览量) PV(page view),即页面浏览量;用户每1次对网站中的每个网页访问均被记录1次。用户对同一页面的多次访问,访问量累计。每产生一条访问日志,pv+1。 案例...

    通过MapReduce统计PV和UV

    一、pv(page view,页面浏览量)

    PV(page view),即页面浏览量;用户每1次对网站中的每个网页访问均被记录1次。用户对同一页面的多次访问,访问量累计。每产生一条访问日志,pv+1。

    案例:本次采用本地计算+本地数据的方式运行

    本地计算指的是借助于Windows平台的hadoop环境模拟运行MapReduce程序

    本地数据指的是计算的数据来源于Windows平台,并且输出到本地

    1. 新建maven项目,引入jar包
      <dependency>
            <groupId>org.apache.hadoop<
    展开全文
  • 什么是PV和UV

    万次阅读 多人点赞 2018-08-12 23:02:33
    什么是PV值  PV(page view ) 是网站分析的一个术语,用以衡量网站用户访问的网页的数量。对于广告主,PV 值可预期它可以带来多少广告收入。一般来说,PV 与来访者的数量成正比,但是 PV 并不直接决定页面的真实...
  • 第一、IP、PV和UV分别是什么意思? IP,实际上也就是指独立IP,它的英文为Internet ***otocol,是独立IP数的意思。00:00—24:00相同IP地址记录一次。即使你有多台电脑,但是如果IP地址是一样的,那么也只能算是一个IP的...
  • 关于pv和uv的定义

    万次阅读 2020-11-16 20:06:59
    pv访问量(Page View),即页面访问量,每打开一次页面PV计数+1,刷新页面也是。 UV访问数(Unique Visitor)指独立访客访问数,一台电脑终端为一个访客。 PV(访问量):PV反映的是浏览某网站的页面数,所以每刷新...
  • 本文主要介绍如何通过spark进行pv和uv的计算。一般我们经常会计算pv和uv,那么我们计算pv和uv的时候是不是性能最优的呢?   好,我们开始看例子: 首先看一下数据: {"flag":"...
  • nginx日志统计pv和uv

    2020-05-08 10:54:35
    网上记录nginx日志统计...1.根据访问IP统计UV awk '{print $1}'access.log|sort | uniq -c |wc -l 2.统计访问URL统计PV awk '{print $7}' access.log|wc -l 3.查询访问最频繁的URL awk '{print $7}' access....
  • spark统计pv和uv

    千次阅读 2019-04-25 00:24:25
    文章目录PV 值:page view代码逻辑UV (unique visitor )即独立访客数 PV 值:page view 页面浏览量或点击量,是衡量一个网站或网页用户访问量。具体的说,PV 值就是所有访问者在 24 小时(0 点到 24 点)内看了某个...
  • 网站流量统计之PV和UV

    千次阅读 2018-04-29 23:49:07
    转自:http://blog.csdn.net/webdesman/article/details/4062069如果您是一个站长,或是一个SEO,您一定对于网站统计系统不会陌生,对于SEO新手来说,统计系统中的一些概念不是很清楚,今天讲讲什么是PV和UV!...
  • PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。 UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。...一个UV可以用很多PV,一个PV也只能对应一个IP。 ...
  • 统计网站PV和UV

    千次阅读 2018-09-29 02:34:04
    PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量。对于广告主,PV值可预期它可以带来多少广告收入。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者通过不断...
  • 统计网站pv和uv PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量。对于广告主,PV值可预期它可以带来多少广告收入。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一...
  • 关注我,回复"资料",获取大数据资料最近有个需求,实时统计pv,uv,结果按照date,hour,pv,uv来展示,按天统计,第二天重新统计,当然了实际还需要按照类型字段分...
  • PV(Page View)访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。 UV(Unique Visitor)独立访客,统计1天内...
  • 【为什么学Python?】 Python 是当今非常热门的语言之一,2020年的 TIOBE 编程语言排行榜中 ,Python名列第一,并且其流行度依然处在上升势头。 ... 借此机会,裴老师联合CSDN推出了本课程,希望能影响更多的人...
  • 网站pv和uv比例多少合适?

    万次阅读 2016-03-07 16:10:15
    网站pv和uv比例多少合适?今天有一个人问我这个问题,SEO优化顶尖大师认为,UV越多越好,PV更多好。但是其实不同行业又是不能相比的,针对大部分的站点而言,PVUV至少三倍以上就不错了。两倍则在大部分行业内都是...
  • --export-dir /user/hive/warehouse/db_yhd.db/tb_pvuv_result \ --input-fields-terminated-by ',' 部分案例数据 121508281810000000 ...
  • 通过nginx日志利用shell统计日pv和uv

    万次阅读 2017-05-04 16:17:35
    通过nginx日志利用shell统计日pv和uv 网上记录nginx日志统计访问量的脚本的文档很多,但是看来看去实际都是一个东西,如下: 1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l 2....
  • PV和UV

    2018-08-27 15:39:06
    PV的全称是Pageview,中文的意思是:综合浏览量。 综合浏览量”通俗的解释就是页面被加载的总次数。每一次页面被成功加载,就会被算作一次综合浏览量(PV)。 UPV的全称是Unique Pageview,中文的意思是:唯一身份...
  • 需求:统计每天24小时每个时段的PV和UV的数量 主要使用Hive查询,Sqoop导出到MySQL PV:Page View 一条url就算一次 UV:Unique View 一个用户只算一次 2. 环境准备 操作系统:虚拟机centos7 软件:CDH版本...
  • PV和UV的简单记录

    2016-11-24 18:53:00
    具体的说,PV值就是所有访问者在24小时(0点到24点)内看了某个网站多少个页面或某个网页多少次。PV是指页面刷新的次数,每一次页面刷新,就算做一次PV流量。度量方法就是从浏览器发出一个对网络服务器的请求...
  • UV UV和PV埋点的方式相同,唯一不同的地方就是UV需要在PV的基础上通过唯一标示进行筛选。统计有多少个唯一标示而得UV的数量,一般我们常见的唯一标示如下: 手机号:用户登录页面后依据他绑定的手机号来进行统计,...
  • JAVA 统计网站的访问量PVUV

    热门讨论 2014-06-18 23:17:45
    Java+Spring+Mysql+C3P0 统计网站的访问量,比如PV(页面浏览量),UV(独立访客数),将统计结果保存到MYSQL数据库中。解压后有项目logMysql的建库脚本。
  • PV/UV则是分析用户的浏览行为的最基础指标,所以,通过Nginx的访问日志来统计UV和PV是再合适不过的啦!在Nginx里主要使用 log_format 和 access_log 两条指令来完成相关的配置。这里以博主自己使用的配置为例来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,918
精华内容 7,167
关键字:

pv和uv