CIFCOM跨境电商 CIFCOM跨境电商

当前位置: 首页 » 出海百科 »

facebook的数据收集

什么是UGC?

很高兴回答这个问题,我是辰妈,什么是vlog,Vlog是videoblog的缩写,是一种视频形式,指的是一种集文字、图像和音频于一体,经过剪辑美化,能表达人格化和展示创作者日常生活的视频日记。也叫网络日志”,也是博客的一类,Vlog多为记录作者的个人生活日常琐事的集合,也可随着传播载体的变化不断更迭,人们的记载形式经历了从静态呈现到动态展现的变化,从图文表述到视像和声音传达的转变。称为视频网络日志”。Vlog记录作者有一个共同的名字,就叫vlogger。

阿里DevOps转型之后,运维平台是如何建设的?

hello大家好我是硕硕关于(大学生如何做好vlog我想给你们分享一下我的想法)

1首先我们先了解什么是vlog

vlog是博客的一种,全称是video weblog或videoblog,意思是视频博客,视频网络日志,源于blog的变体,vlog多为记录作者的个人生活日常,主题非常广泛。

2 其次给大家分享一下如何做好vlog

vlog其实不是刚上来就特别好做的有很多的问题都搞不懂这就需要我们耐心的去头条上面查询资料

在做vlog时就如我上面所介绍含义一样,一定要与自己的生活息息相关。下面给大家说一下可能会遇到的几种问题。

分布式日志收集系统:Facebook Scribe

1.分布式日志收集系统:背景介绍

许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理这些日志需要特定的日志系统,一般而言,这些系统需要具有以下特征:

(1) 构建应用系统和分析系统的桥梁,并将它们之间的关联解耦;

(2) 支持近实时的在线分析系统和类似于Hadoop之类的离线分析系统;

(3) 具有高可扩展性。即:当数据量增加时,可以通过增加节点进行水平扩展。

更多c/c++ Linux服务器高阶知识、电子书籍、视频等等请后台私信【架构】获取

知识点有C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。

2.分布式日志收集系统:Facebook Scribe主要内容

(1)Scribe简介及系统架构

(2)Scribe技术架构

(3)Scribe部署结构

(4)Scribe主要功能和使用方案

(5)Scribe的具体应用实例

(6)Scribe的扩展

(7)Scribe研究体会

3.Scribe简介

Scribe是facebook开源的日志收集系统,在facebook内部已经得到大量的应用。 Scribe是基于一个使用非阻断C++服务器的thrift服务的实现。它能够从各种日志源上收集日志,存储到一个中央存储系统 (可以是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。它为日志的分布式收集,统一处理”提供了一个可扩展的,高容错的方案。

4.Scribe的系统架构

如上图所示:Scribe从各种数据源上收集数据,放到一个共享队列上,然后push到后端的中央存储系统上。当中央存储系统出现故障时,scribe可以暂时把日志写到本地文件中,待中央存储系统恢复性能后,scribe把本地日志续传到中央存储系统上。

5.Scribe的技术架构

如上图所示:Scribe服务器底层数据通信框架是Thrift,Thrift也是Facebook开源的,并得到了广泛的使用。也用到了C++的准标准库boost,主要使用共享指针和文件相关的功能。Thrift也用到了libevent开发库和socket编程技术。

6.Scribe部署结构

7.Scribe的主要功能

1.支持多种存储类型:7种并且可扩展

2.日志自动切分功能:按文件大小和时间切分

3.灵活的客户端:

(1)支持多种常用语言(Thrift提供支持);

(2)可与应用系统集成;可以作实现独立客户端

4.支持日志分类功能(Facebook有上百种日志分类)

5.其他功能

(1)连接池

(2)灵活的日志缓存大小

(3)多线程功能(消息队列)

(4)scribe服务器之间可以转发日志

6.以上功能都是可以通过配置文件来灵活配置

8.Scribe使用方案

(1)和产生日志文件的应用系统集成

scribe能够和各种应用系统很好的集成是因为它提供几乎所有的开发语言的开发包

(2)应用系统在本地产生日志文件,使用一个独立运行的客户端程序同样,独立的客户端也可以采用各种语言开发,我们采用的是python来开发客户端

9.Scribe的具体应用实例

1.Facebook肯定大量的使用,主要用于处理Facebook级别日志,一旦有新的日志分类生成,Scribe将自动处理。(Facebook有上百个日志分类)。

2. Twitter:一款分布式实时统计系统Rainbird使用了scribe

3.我的公司:

(1)*****

(2)*****

(3)*****

(4)*****

(5)*****

(6)*****

4.其他

10.Scribe的扩展:存在的问题

虽然scribe系统是如此的优秀,但是也存在着一些不足和问题,针对存在的问题我们对scribe进行扩展。我们发现scribe存在的主要问题如下:

1、单点故障问题

有三个地方存在单点故障:

(1)中心服务器

(2)本地服务器

(3)收集日志的客户端程序

2、日志丢失问题

当日志文件发生切分的时候可能导致日志丢失

3、历史日志收集问题

4、scribe服务器挂了没有及时通知

11.Scribe的扩展:问题解决方案

针对上面我们提出的问题,主要提供如下相应的解决方案:

1.中心服务器单点故障

可以部署多个中心服务器,然后本地服务器通过配置文件可以自动在这些服务器之间进行切换

2.其余的问题我们都是通过自己写的python客户端解决的

python客户端我们是基于一个开源的项目进行二次开发的,因为开源的python客户端功能很简单,只是跟踪一个日志文件并把日志文件的数据读取导入到scribe本地服务器

12.Scribe的扩展:python客户端

我们开发的python客户端主要实现了如下功能:

1、解决本地scribe服务器的单点故障

我们可以通过配置多个本地scribe服务器(通过配置文件配置,相当的灵活),python脚本会根据配置的这些服务器自动切换(当一个scribe挂掉之后自动切换,如果挂掉本地scribe服务器重新启动以后又会自动切换回去。

2、解决日志丢失的问题

开源的python客户端是按照固定的时间间隔扫描日志文件是否有变化,如果在这个时间段内发生日志切换会导致日志丢失。我们同样是采用这个方式去检测日志文件,不过我们在发生日志切分的时候会再次去检测被切分走的日志文件是否已经收集完毕。

3、解决历史日志收集

如果在我们运行python客户端以前已经产生了日志,这部分的日志收集也是我们新增的一个功能

4、解决自身的单点故障问题

不排除我们的python客户端也会挂掉的时候,当我们下次启动怎样保证我们收集的日志不重复不丢失是需要解决的问题。我们的解决方案就是对已经收集的日志文件的各种信息做序列化(主要是已经收集日志文件的位置)

5、收集日志文件怎样保证按照日志生成的顺序收集

日志的生成顺序就是跟他们文件的建立时间是相关的,通过这一点我们可以实现。

6、及时通知机制

为了及时的通知到scrib服务器挂掉的信息到相关人员,我们开发了邮件通知机制,就是当某一个本地scribe服务器挂掉以后会触发邮件发送

13.Scribe研究体会

怎样从我们工作的内容深入学习?

1.每个人在公司负责开发的内容都是很有限的,怎样从我们开发的内容入手深入研究和学习更多的知识?

2.Scribe研究的例子!

14.总结:以上内容有一些是来自互联网,在加入了自己的一些理解,希望对需要的人有所帮助!

LogDevice:Facebook开源的分布式日志数据存储系统

日志是记录有序可变记录序列并且把他们可靠存储下来的最简单方法。日志可以被视为面向记录的数据库,且仅支持附加和修剪的文件。

面向记录意味着数据以不可分割的记录写入日志,而不是单个字节。更重要的是,记录是最小的寻址单位:读取时总是从特定记录(或从附加到日志的下一条记录)开始读取,并一次接收一个或多个记录的数据。更重要的是,记录编号不能保证是连续的。编号序列中可能存在间隙,并且日志写入时事先不知道在成功写入时其记录的日志序号。

日志天然是附加的。不支持或提供修改现有记录的支持。

在删除日志之前,日志应该存在相对较长的时间。7天,几周,几个月甚至几年。日志的主要空间回收机制是根据基于时间或空间的保留策略进行修剪或删除最老的记录。

日志在现代以数据为导向的企业中至关重要,企业BI、大数据系统其最原始数据来源都是其业务日志。甚至很多在线决策服务也都依赖于企业日志数据。处理日志数据的管理和处理一般都面临着同样的窘迫需求:

怎么保证从日志从收集(INPUT)到消费(OUTPUT)全数据栈流程不会因为流量超控而被限制,保证不会数据丢失。

让一个阶段写入日志,另一个阶段从中读取。

如何维护日志数据的索引?如何让索引服务按正确的顺序读取更新日志并在所有应用中更改,并且能满足其后有一系列需要按特定顺序执行的工作项?先将它们写入日志,并会在后面一定时间内才会消费。

具有足够容量来订购所有写入的日志使它们成为可能。

数据耐用性问题?

怎么使用预写日志。

和大多数企业一样,社交巨头Facebook公司也遭遇着同样的问题,在脸书超大规模的日志数据面前,所有这些说起来容易做起来难。而其中需要满足的两个难以大规模实现的重要保证:高可用性和持久性记录存储,以及这些记录的可重复总顺序。 为了满足这两个个保证和上面提到的种种难题,脸书开发了分布式日志系统LogDevice。目前该系统已经在github开源(github: /facebookincubator/LogDevice),本文虫虫就给大家介绍脸书的分布式日志存储系统LogDevice,一个专为日志设计的分布式数据存储。

LogDevice是一个可扩展且容错的分布式日志系统。 当文件系统存储和提供组织为文件的数据时,日志系统存储和传输组织为日志的数据。

LogDevice从头开始设计,可以提供大规模的高可靠性和高效率的多种日志。还支持高度可调性,允许对每个用例进行优化,以便在耐久性效率和一致性可用性空间中进行正确的权衡取舍。

工作量和性能要求

脸书拥有各种日志记录工作负载,其性能,可用性和延迟要求各不相同。LogDevice设计为可动态调整所有这些冲突参数的目标,而不是一个通用的解决方案。

大多数日志记录应用程序的共同点是要求高写入可用性。即使是几分钟,记录器也没有任何地方可以存放数据。 LogDevice必须提供高可用写入。

耐久性要求也是普遍的。与任何文件系统一样,没有人希望听到他们的数据在收到成功追加日志的确认后便丢失。LogDevice的客户端每个日志启动至少一个读取器,用于记录几小时甚至几天的记录。那些读者随后从那一点开始阅读每个日志中的所有内容。

能够应对单个日志的写入负载中的峰值也很重要。LogDevice将记录顺序与记录存储分开,并使用记录的非确定性放置来提高写入可用性,并更好地容忍由此类峰值引起的临时负载不平衡。

一致性保证

LogDevice日志提供的一致性保证是人们对文件的期望,尽管是一个面向记录的文件。多个写入器可以同时将记录追加到同一个日志中。所有这些记录将以相同的顺序传递给日志的所有读取者,即其LSN的顺序,具有可重复的读取一致性。如果将记录传送给一个读取者,它也将被传送给遇到该LSN的所有读者,除非导致丢失所有记录副本的灾难性故障。LogDevice提供内置的数据丢失检测和报告功能。如果发生数据丢失,所有丢失记录的LSN将报告给尝试读取受影响的日志和LSN范围的每个读取者。没有为不同日志的记录提供订购保证。来自不同日志的记录的LSN不具有可比性。

设计和实施不确定的记录放置

为记录副本提供大量放置选项可提高分布式存储群集中的写入可用性。与许多其他分布式存储系统类似,LogDevice通过在不同的机器上存储每个记录(通常为两个或三个)的几个相同副本来实现持久性。对于这些副本有许多放置选项,即使群集中的许多存储节点停机或运行缓慢,也可以完成写入,只要启动的群集部分仍可以处理负载。

许多成功的分布式文件系统都采用了最大化传入数据的放置选项的原则。例如,在Apache HDFS中,数据块可以放置在集群中的任何存储节点上,受限于称为名称节点的集中式元数据存储库强制执行的跨机架和空间约束。在Red Hat Ceph中,数据放置由多值散列函数控制。散列函数生成的值为传入数据项提供多个放置选项。这消除了对名称节点的需要,但无法达到相同级别的放置灵活性。

LogDevice专注于日志存储,采用了不同的方法来记录位置。它提供了与名称节点相同的放置灵活性级别,而实际上并不需要名称节点。

LogDevice日志记录的顺序与记录副本的实际存储分开。对于LogDevice集群中的每个日志,LogDevice运行一个sequencer对象,其唯一的工作是在记录附加到该日志时发出单调递增的序列号。定序器可以在任何方便的地方运行:在存储节点上,或在为排序保留的节点上,以及追加不存储的执行。

节点集允许LogDevice集群独立于读取器数量进行扩展。客户端联系的节点通过尽可能快地将它们推送到TCP连接来向其传送记录副本。当然,每个记录的标题包括其序列号。

LogDevice客户端库执行必要的记录的重新排序和偶尔重复数据删除,以确保记录按其LSN的顺序传送到读取器应用程序。

序号

如上图所示,LogDevice中记录的序列号不是整数,而是整数对。该对的第一个组件称为epoch数,第二个组件在epoch内偏移。通常的元组比较规则适用。在LSN中使用时期是另一种可用性优化。当sequencer节点崩溃或以其他方式变为不可用时,LogDevice必须为所有受影响的日志调出替换sequencer对象。每个新的序列发生器开始发出的LSN必须严格大于已为该日志写入的所有记录的LSN。

epoch存储充当持久计数器的存储库,每个日志一个,很少增加并且保证永不退化。目前是使用Apache Zookeeper作为LogDevice的epoch存储。

多对多的重建

驱动器失败。电源故障。机架开关失灵。当这些故障发生时,某些或所有记录的可用副本数量会减少。在数次连续失败后,该数字降至零,就会丢失数据或至少丢失一些记录的读取可用性。这是LogDevice设计尽可能避免的情形。在一次或多次失败后,重建会为已复制不足(具有少于目标份数R的记录)的记录创建更多副本。

为了有效,重建必须快速。它必须在下一次失败之前完成一些失败记录的最后一个副本。与HDFS类似,LogDevice实现的重建是多对多的。所有存储节点都充当记录副本的发送者和接收者。整个集群的资源都会用于重建,允许LogDevice以每秒5-10GB的速率完全恢复受故障影响的所有记录的复制因子。重建协调是完全分布式的,并通过事件日志的内部元数据执行。

本地日志存储LogsDB

排序和存储的分离有助于分配集群的聚合CPU和存储资源,以匹配不断变化的,有时尖锐的工作负载。但是,分布式数据存储的每节点效率很大程度上取决于其本地存储层。最后,必须将多个记录副本保存在非易失性设备上,例如硬盘驱动器或SSD。当以每个节点100MBps +存储数小时的记录时,仅RAM存储是不切实际的。当积压持续时间以天为单位(在Facebook上不是一个不常见的要求)时,硬盘驱动器比闪存更具成本效益。所以设计LogDevice的本地存储组件,不仅在具有巨大IOPS容量的闪存上,而且在硬盘上也能很好地运行。企业级硬盘驱动器可以推动相当数量的顺序写入和读取(100-200MBps),但最高可达100-140随机IOPS。

LogDevice LogsDB的本地日志存储,是一个写优化数据存储,旨在保持磁盘搜索的数量小和受控,并且存储设备上的写和读IO模式大多是顺序的。LogsDB是RocksDB之上的一个层,是一个基于LSM树的有序持久键值数据存储。 LogsDB是RocksDB列族的按时间排序的集合,是完全成熟的RocksDB实例,共享一个共同的预写日志。每个RocksDB实例称为LogsDB分区。所有日志的所有新写入,无论是一个日志还是一百万,都会进入最新的分区,按照(log id,LSN)对它们进行排序,并在一系列大型已排序的不可变文件(称为SST文件)中保存在磁盘上。

用例和展望

LogDevice目前是脸书各种日志记录工作负载的通用解决方案。比如Scribe用的就是LogDevice,总吞吐量超过每秒摄取数TB的峰值,可靠地传输并且可以重放;TAO数据的二级索引也用的LogDevice,其吞吐量虽没有Scribe大,但每个日志的严格记录排序很重要,预期的端到端延迟大约为10毫秒;还有机器学习管道,它使用LogDevice将相同的事件流提供给多个ML模型训练服务。

LogDevice更多功能正在积极开发中。它用C++编写的,几乎没有外部依赖。目前正在探索的新领域包括集群分解,其中存储和CPU密集型任务由具有不同硬件配置文件的服务器处理,支持非常高容量的日志,以及通过应用程序提供的密钥对记录进行高效的服务器端过滤。这些功能将共同提高LogDevice集群的硬件效率,并为高吞吐量数据流的用户提供可扩展的负载分配机制。

目前脸书已经将LogDevice基于BSD协议开源,你可以通过github cone这个项目,并获取其完整的文档,该项目还提供了Docker容器镜像,你可以使用Docker快速安装并试用。

未经允许不得转载: CIFCOM跨境电商 » facebook的数据收集

相关文章

themebetter

contact