从goaccess的官网我们可以看到有提供生成html页面的功能,今天就在这个基础上演示下怎么做一个实时的日志分析。
1.1、查看当前配置
#egrep -v "^#|^$" /usr/local/etc/goaccess/goaccess.conf
由上可见默认配置中并无时间参数,需要在配置中添加时间参数。
1.2、添加时间参数
# cat >>goaccess.conf<<EOF time-format %H:%M:%S date-format %d/%b/%Y #NCSA Combined Log Format log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u" EOF #cp -a goaccess.conf ../
30 * * * * goaccess /var/log/nginx/access.log -o /etc/nginx/html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED
修改nginx.conf文件
location /report.html { #指定个人配置的目录 root html; index report.html index.htm; }
https://服务器IP/report.html
页面展示如下:
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
自从1992年施乐的科学家为了解决信息负载的问题,第一次提出协同过滤算法,个性化推荐已经经过了二十几年的发展。1998年,林登和他的同事申请了“item-to-item”协同过滤技术的专利,经过多年的实践,亚马逊宣称销售的推荐占比可以占到整个销售GMV(Gross Merchandise Volume,即年度成交总额)的30%以上。随后Netflix举办的推荐算法优化竞赛,吸引了数万个团队参与角逐,期间有上百种的算法进行融合尝试,加快了推荐系统的发展,其中SVD(Sigular Value Decomposition,即奇异值分解,一种正交矩阵分解法)和Gavin Potter跨界的引入心理学的方法进行建模,在诸多算法中脱颖而出。其中,矩阵分解的核心是将一个非常稀疏的用户评分矩阵R分解为两个矩阵:User特性的矩阵P和Item特性的矩阵Q,用P和Q相乘的结果R'来拟合原来的评分矩阵R,使得矩阵R'在R的非零元素那些位置上的值尽量接近R中的元素,通过定义R和R'之间的距离,把矩阵分解转化成梯度下降等求解的局部最优解问题。Netflix最新的实时推荐系统如图9-5所示。
图9-5 NetFlix的实时推荐系统系统架构图(来源:http://techblog.netflix.com/2013/03/system-architectures-for.html)
与此同时,Pandora、LinkedIn、Hulu、Last.fm等一些网站在个性化推荐领域都展开了不同程度的尝试,使得推荐系统在垂直领域有了不少突破性进展,但是在全品类的电商、综合的广告营销上,进展还是缓慢,仍然有很多的工作需要探索。特别是在全品类的电商中,单个模型在母婴品类的效果还比较好,但在其他品类就可能很差,很多时候需要根据品类、推荐栏位、场景等不同,设计不同的模型。同时由于用户、SKU不停地增加,需要定期对数据进行重新分析,对模型进行更新,但是定期对模型进行更新,无法保证推荐的实时性,一段时间后,由于模型训练也要相当时间,可能传统的批处理的Hadoop的方法,无法再缩短更新频率,最终推荐效果会因为实时性问题达到一个瓶颈。
推荐算法主要有基于人口统计学的推荐、基于内容的推荐、基于协同过滤的推荐等,而协同过滤算法又有基于邻域的方法(又称基于记忆的方法)、隐语义模型、基于图的随机游走算法等。基于内容的推荐解决了商品的冷启动问题,但是解决不了用户的冷启动问题,并且存在过拟合问题(往往在训练集上有比较好的表现,但在实际预测中效果大打折扣),对领域知识要求也比较高,通用性和移植性比较差,换一个产品形态,往往需要重新构建一套,对于多媒体文件信息特征提取难度又比较大,往往只能通过人工标准信息。基于邻域的协同过滤算法,虽然也有冷启动问题和数据稀疏性等问题,但是没有领域知识要求,算法通用性好,增加推荐的新颖性,并且对行为丰富的商品,推荐准确度较高。基于模型的协同过滤算法在一定程度上解决了基于邻域的推荐算法面临的一些问题,在RMSE(Root Mean Squared Error,即均方根误差)等推荐评价指标上更优,但是通常算法复杂,计算开销大,所以目前基于邻域的协同过滤算法仍然是最为流行的推荐算法。
基于邻域的协同过滤主要分为User CF和Item CF,根据以下条件不同,各自又有不同的使用场景。
计算量大小不同。基于邻域的协同过滤的时间复杂度为
, 其中n为用户数,m为产品数,应用SVD等降维方法可以降低算法复杂度,但是分解矩阵又会花费一定的时间。
数据稀疏性倾斜度不同。例如,User CF主要基于用户对共同项目的评分,如果用户远远多于物品,没有足够评分将导致两个用户很少有共同评分的项目,找最近邻用户非常的不准确,虽然通过基于BP神经网络、朴素贝叶斯分类、基于内容的预测等方法可以填充矩阵,但是都会不同程度地带来的计算时间。
对于用户数量远远大于产品,并且产品相对稳定的电商系统,计算产品相似度计算量小,适用Item CF,否则用户量大,并且如果用户购买频繁,计算用户相似度计算量很大,极端情况下,100个用户对应2个产品,一个要计算C1002次相似度,一个只要计算C22,即一次相似度;反之,对于更新频繁,物品数量海量的新闻、博客、微博等系统,User CF效果更好。
当然,虽然SVD在分解矩阵上花费了一定时间,同时降维也会导致用户-项目矩阵中的信息丢失,但是用户-项目矩阵降维后, 运算复杂度大大降低,同时矩阵稀疏性问题得到了较好地解决,作为Netflix比赛中最终提升效果较好的两个方法之一,被众多网站采用。用户-项目矩阵中的信息丢失问题可以通过选取合适的保留维数k在一定程度上得到缓解。
在一个电商系统中,有商品、类目、品牌、团购、闪购、搜索、店铺、广告、促销活动、抵用券等诸多实体;有首页的大轮播、猜你喜欢栏位,详情页的看了还看、看了还买、推荐品牌等栏位,购物车页面的买了还买、凑单免邮等栏位。如何在不同的栏位融入不同的推荐算法给用户推荐相应的实体,构建出属于电商自己的场景引擎,实现全站精准化,让网站的GMV或者利润达到最高,是每一个电商需要思考的问题。在实际中,很多推荐算法不一定要求实时,实时推荐在哪些场景下能带给栏位更高的GMV转化率,也是需要一定时间摸索和试错的。
目前基于用户画像的推荐,主要用在基于内容的推荐,从最近的RecSys大会(ACM Recommender Systems)上来看,不少公司和研究者也在尝试基于用户画像做Context-Aware的推荐(情境感知,又称上下文感知)。利用用户的画像,结合时间、天气等上下文信息,给用户做一些更加精准化的推荐是一个不错的方向。
实时推荐系统的方法
目前的商用推荐系统,当用户数和商品数达到一定数目时,推荐算法都面临严重的可扩展性问题,推荐的实效性变得非常差,如何在算法和架构上提高推荐速度是很多公司不得不思考的问题。目前,在算法上主要通过引入聚类技术和改进实时协同过滤算法提高推荐速度;在架构上,目前实时推荐主要有基于Spark、Kiji框架和Storm的流式计算3种方法。
1.聚类技术和实时协同过滤算法
在算法上,一般采用EM(Expectation-Maximization)、K-means、吉布斯(Gibbs Sampling)、模糊聚类等聚类技术提高推荐速度。因为使用聚类技术可以大大缩小用户或项目的最近邻居搜索范围,从而提高推荐的实时性,如表9-1所示。
除此之外,实时协同过滤算法本身一直是人们研究的热点,早在2003年,Edward F. Harrington就第一次提出了基于感知器的实时协同过滤算法,但是这种方法需要所有用户的偏好,实用性较差;2010年,杨强等提出了实时进化的协同过滤算法,给予新得分更高的权重来增量更新User和Item的相似度;2011年,UC Berkeley的Jacob Abernethy等人提出了OCF-SGD算法,我们知道传统的矩阵分解把用户评分矩阵R分解成多个矩阵,比如R≈P*Q,该方法提出当新来一个User到Item的得分,把更新R矩阵的问题转换成更新P和Q矩阵,从而达到实时协同过滤;近几年的RecSys大会上,实时协同过滤也是讨论的热点,OCF-SGD算法每次只考虑一个用户,忽略了用户之间的关系,Jialei Wang等人提出了基于多任务学习的实时协同过滤算法,把每一个用户当做一个任务,定义一个表示各个任务间相似性和交互程度的矩阵A,当新来一个User到Item的得分,通过矩阵A来更新其他用户的得分。
2.基于Spark的方式
在架构上,第一种是使用Spark把模型计算放在内存中,加快模型计算速度,Hadoop中作业的中间输出结果是放到硬盘的HDFS中,而Spark是直接保存在内存中,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的模型计算,如表9-2所示。
(来源:http://www.csdn.net/article/2014-05-19/2819831-TDW-Shuffle/2)
3.基于Kiji框架的方式
第二种是使用Kiji,它是一个用来构建大数据应用和实时推荐系统的开源框架,本质上是对HBase上层的一个封装,用Avro来承载对象化的数据,使得用户能更容易地用HBase管理结构化的数据,使得用户姓名、地址等基础信息和点击、购买等动态信息都能存储到一行,在传统数据库中,往往需要建立多张表,在计算的时候要关联多张表,影响实时性。Kiji与HBase的映射关系如表9-3所示。
Kiji提供了一个KijiScoring模块,它可以定义数据的过期策略,如综合产品点击次数和上次的点击时间,设置数据的过期策略把数据刷新到KijiScoring服务器中,并且根据自己定义的规则,决定是否需要重新计算得分。如用户有上千万浏览记录,一次的行为不会影响多少总体得分,不需要重新计算,但如果用户仅有几次浏览记录,一次的行为,可能就要重新训练模型。Kiji也提供了一个Kiji模型库,使得改进的模型部署到生产环境时不用停掉应用程序,让开发者可以轻松更新其底层的模型。
4.基于Storm的方式
最后一种基于 Storm 的实时推荐系统。在实时推荐上,算法本身不能设计的太复杂,并且很多网站的数据库是TB、PB级别,实时读写大表比较耗时。可以把算法分成离线部分和实时部分,利用Hadoop离线任务尽量把查询数据库比较多的、可以预先计算的模型先训练好,或者把计算的中间数据先计算好,比如,线性分类器的参数、聚类算法的群集位置或者协同过滤中条目的相似性矩阵,然后把少量更新的计算留给Storm实时计算,一般是具体的评分阶段。
基于本章前面的学习,我们可以设计图9-6所示的实时推荐系统。
图9-6 实时推荐系统(图片来源PRANAB GHOSH,Big Data Cloud meetup。版权归原书作者所有)
用HBase或HDFS存储历史的浏览、购买行为信息,用Hadoop基于User CF的协同过滤,先把用户的相似度离线生成好,用户到商品的矩阵往往比较大,运算比较耗时,把耗时的运行先离线计算好,实时调用离线的结果进行轻量级的计算有助于提高产品的实时性。
我们来简单回顾一下协同过滤算法(如图9-7所示):首先程序获取用户和产品的历史偏好,得到用户到产品的偏好矩阵,利用Jaccard相似系数(Jaccard coefficient)、向量空间余弦相似度(Cosine similarity)、皮尔逊相关系数(Pearson correlation coefficient)等相似度计算方法,得到相邻的用户(User CF)或相似商品(Item CF)。在User CF中,基于用户历史偏好的相似度得到邻居用户,将邻居用户偏好的产品推荐给该用户;在Item CF中,基于用户对物品的偏好向量得到相似产品,然后把这款产品推荐给喜欢相似产品的其他用户。
图9-7 协同过滤算法过程
然后通过Kafka或者Redis队列,保存前端的最新浏览等事件流,在Storm的Topology中实时读取里面的信息,同时获取缓存中用户topN个邻居用户,把邻居用户喜欢的商品存到缓存中,前端从缓存中取出商品,根据一定的策略,组装成推荐商品列表。
当然除了相似性矩阵,其他模型大体实现也相似,比如实际的全品类电商中不同的品类和栏位,往往要求不同的推荐算法,如母婴产品,如图9-8所示,如果结合商品之间的序列模式和母婴年龄段的序列模式,效果会比较好,可以把模型通过Hadoop预先生成好,然后通过Storm实时计算来预测用户会买哪些产品。
图9-8 序列模式在母婴类目推荐中的应用
本文摘自《Storm技术内幕与大数据实践》
本书先介绍实时大数据平台架构上的一些知识和难点,然后引入Storm来解决其中的问题。开始介绍Storm开发,再分享Storm集群中性能调优、资源隔离的一些知识和经验,然后加入Storm监控和日志的内容。后面介绍如何通过Storm构建公司的基础数据层;如何通过良好的架构设计实时更新基础数据层的用户画像、分布式索引等,最后依托实时更新的基础数据层,介绍如何构建各类个性化应用。
家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
Mojo CSS 是一个原子 CSS 框架,其基于 HTML 实时生成 CSS,并且运行时间接近零。Mojo CSS 提供了创建自定义、美观且响应式布局的最快方法,而无需编写一行 CSS。 全套实用程序可帮助开发者充分发挥网页的性能。
目前 Mojo CSS 在 Github 通过 MIT 协议开源,代表了下一代原子 CSS 框架,无需交付任何 CSS 即可打造华丽的 UI。
当其他框架和库将 CSS 生成静态文件时,Mojo 会实时处理一切。 其会自动扫描 HTML,查找使用的实用程序,并仅生成这些实用程序所需的 CSS。
Mojo 不断扫描网页,并在每次检测到 DOM 变化时生成所需的 CSS。比如,当用户输入 class="bg-c-blue",Mojo CSS 会自动编译生成以下样式:
<style>
.bg-c-blue {
...
}
</style>
这样方式不仅可以节省文件大小、实现快速渲染,并且能够实时设置 HTML 样式,因为浏览器会立即接收到更改,而无需重新加载页面。
与其他框架不同,Mojo 提供了一种独特的样式方法,使其有别于传统的 CSS 框架。虽然普通项目通常需要至少 100kb 的 CSS 来处理样式,但 Mojo 只需要一个约 50kb(15kb gzip 压缩)的 JS 文件即可处理任何规模项目的样式。
// Import Mojo CSS
import mojo from 'mojocss'
// Initialize
mojo()
这种方法可以显著减少页面加载时间并提高性能。 Mojo 不是加载大型 CSS 文件并将样式应用到页面上的所有元素,而是使用单个 JavaScript 文件实时设置元素样式,这意味着仅加载页面上当前可见元素所需的样式。
Mojo CSS 无需每次加载页面时下载数百 KB 的代码,从而缩短页面加载时间并提高网站性能。
Mojo 遵循 Atomic CSS 方法,这意味着其专注于提供一组可用于构建自定义用户界面的底层 CSS 实用程序。
Mojo 不提供自定义的 UI 工具包,而是让开发人员能够灵活地使用提供的实用程序创建自己的 UI 设计。以下是使用 Mojo 实用程序的 qoute 卡的示例。
<div class="bg-c-body:+2 pa-5 border-left-3 border-c-primary rounded-right-5">
<quote class="text-c-stronginvert">
“Any sufficiently advanced technology is
indistinguishable from magic”
</quote>
<div class="mt-4">
Arthur C. Clarke
</div>
</div>
Mojo 是另一个典型的 Atomic CSS 框架吗?不是! Mojo 通过引入属性变体而脱颖而出,使 Atomic CSS 更具可读性且更易于维护。下面将 Mojo 与传统的 Atomic CSS 框架进行比较:
<!-- Typical Atomic CSS frameworks -->
<div class="bg-red-400 px-5 hover:bg-red-600 hover:px-8">
...
</div>
<!-- Mojo CSS -->
<div class="bg-c-red px-5" hover="bg-c-red:+2 px-8">
...
</div>
由于担心多次重复代码,使用原子设计的想法似乎仍然没有吸引力,然而利用组合实用程序的概念却与众不同。
当构建项目时,开发者可能会发现自己一遍又一遍地重复相同的实用程序模式,从而 使代码难以维护和更新。
通过创建使用 Mojo 实用程序的自定义组件,可以保持代码 DRY(Don't Repeat Yourself)并更轻松地维护和更新项目。
以一个按钮为例:
<button class="bg-c-primary text-c-white py-2 px-4 rounded-4" hover="bg-c-primary:+5">
Button
</button>
使用 React、Vue 或 Angular 等 JavaScript 框架时,建议创建使用 Mojo 实用程序的自定义组件。
这允许开发者利用框架的强大功能来创建动态和交互式用户界面,同时仍然利用 Mojo 的实用程序来处理组件的样式。
例如,如果在 Vue 中构建按钮组件,则可以创建如下自定义组件:
<template>
<button class="bg-c-primary text-c-white py-2 px-4 rounded-4" hover="bg-c-primary:+5">
<slot></slot>
</button>
</template>
<script>
export default {
name: "custom-button"
}
</script>
然后在 Vue 模板中使用:
<custom-button>
<!-- button content -->
</custom-button>
如果不使用 JS 框架,则可以使用 Mojo 的模式。 模式提供了一种将一组实用程序封装到一个类中的方法,然后可以在整个项目中重复使用该类。
以按钮为例:
mojo({
patterns : {
'.btn': {
idle : 'bg-c-primary text-c-white py-2 px-4 rounded-4',
hover: 'bg-c-primary:+5'
}
},
})
接着就可以在 HTML 中如下引入:
button class="btn">
<!-- button content -->
</button>
https://mojocss.com/docs/guide/component-abstraction
https://github.com/mojocss/mojocss
*请认真填写需求信息,我们会在24小时内与您取得联系。