这是一个相对广泛的问题,我知道可能需要使用这样的工具(例如Spark,Kafka和Hadoop),但我正在从经验丰富的专业人员的角度寻找具体的愿景< / p>
这是眼前的问题:
我们正在使用Google Analytics(分析)之类的服务,该服务向我们发送了一系列事件。事件是在页面上执行的操作。可能是单击按钮,鼠标移动,页面滚动或我们定义的自定义事件。
{
"query_params":[
],
"device_type":"Desktop",
"browser_string":"Chrome 47.0.2526",
"ip":"62.82.34.0",
"screen_colors":"24",
"os":"Mac OS X",
"browser_version":"47.0.2526",
"session":1,
"country_code":"ES",
"document_encoding":"UTF-8",
"city":"Palma De Mallorca",
"tz":"Europe/Madrid",
"uuid":"A37F2D3A4B99FF003132D662EFEEAFCA",
"combination_goals_facet_term":"c2_g1",
"ts":1452015428,
"hour_of_day":17,
"os_version":"10.11.2",
"experiment":465,
"user_time":"2016-01-05T17:37:10.675000",
"direct_traffic":false,
"combination":"2",
"search_traffic":false,
"returning_visitor":false,
"hit_time":"2016-01-05T17:37:08",
"user_language":"es",
"device":"Other",
"active_goals":[
1
],
"account":196,
"url”:”http://someurl.com”,
“action”:”click”,
"country":"Spain",
"region":"Islas Baleares",
"day_of_week":"Tuesday",
"converted_goals":[
],
"social_traffic":false,
"converted_goals_info":[
],
"referrer”:”http://www.google.com”,
"browser":"Chrome",
"ua":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36",
"email_traffic":false
}
现在,我们需要构建一个解决方案来分析此数据。我们需要建立一个可以对数据进行汇总,过滤,切片和切块的报告平台。
我们需要构建的报告的一个示例是
告诉我所有来自美国,正在使用Chrome浏览器并且正在使用iPhone上的浏览器的用户。
或
向我显示来自referrer =“ http://www.google.com”,来自印度且正在使用桌面的所有用户在特定按钮上的点击总和。 这项服务有一天在一天中发出数百万个此类事件,相当于每天GB的数据。
这是我的具体疑问
答案 0 :(得分:2)
让我尝试一个答案,我最清楚的是使用Hadoop,Kafka和Spark。
我们应该如何存储大量数据:它是实时数据。因此,您可以直接通过Kafka将其流式传输到HDFS。更多关于第(4)点的见识
我们应该如何使自己能够实时分析数据。-学习Spark。如您所说的以TB为单位的大小,请确保您的集群中包含大量数据节点。此外,如果可以,请分别设置火花群集。 Spark Dstream
在分析实时数据馈送方面非常出色。此外,它可以轻松处理此类json数据。
查询系统在这里应该如何工作- spark SQLcontext
可以让您在用例的半结构化数据之上编写类似查询的简单SQL。就像SQL一样简单。
如果我们要维护大约4 TB的数据(我们估计将在3个月内累积),那么应该采取什么策略来保留这些数据。我们什么时候以及如何删除它? 我建议您在累积和分析大约10天的数据后,将数据从HDFS移至更大的仓库,然后重复此备份过程。否则,如果您能为您的Hadoop购买硬件,那就好了。将其存储在HDFS本身中。
只要您用几行火花就可以轻松处理上面提到的任何指标。相信我,它像SQL一样简单。此外,对于仪表板,您可以将数据发送到qlikview前端。
答案 1 :(得分:2)
使用其中一个云存储提供商(link)根据日期和小时(日期= 2018-11-25 / hour = 16)对数据进行分区,这将减少每个查询读取的数据量。以镶木地板或ORC等二进制格式之一存储数据,将为您提供更好的性能和压缩率。
您可以运行多个应用程序,以监听kakfa主题。首先使用带有连续模式应用程序(link)的Spark结构流2.3将事件存储到存储中。这将使您可以选择查询和分析历史数据并根据需要重新处理事件。您在这里有两个选择:
存储在hdfs / s3 / gcp存储等中。在存储的数据上构建配置单元目录以获取事件的实时视图。可以使用spark / hive / presto查询数据。注意:如果正在生成小文件,则需要压缩。
存储在诸如Cassandra或HBase之类的宽列存储中。 link对于此用例,我希望使用此选项。
并行运行另一个spark应用程序进行实时分析,如果您知道必须聚合数据的维度和指标,请使用带有窗口的spark结构化流。您可以每隔5分钟或每5分钟对列和窗口进行分组,然后存储在可以实时查询的上述存储提供程序之一中。 link
如答案3所述,在存储的数据上构建配置单元目录以获取事件的实时视图。出于报告目的,请使用spark / hive / presto查询数据。 如果要查询实时数据,请使用Cassandra或HBase作为低延迟系统。
如果已正确划分数据,则可以根据定期存档规则将数据存档到冷备份。例如,可以维护从事件生成的维度和指标,并可以在1个月后归档事件。
答案 2 :(得分:0)
您可以使用云提供商来存储您的数据或将其从Kafka流传输到Rockset。请参阅here,了解如何建立连接
Rockset连续地将来自Kafka的数据流式传输到一个集合中,并允许您使用API端点对实时数据执行完整的SQL。
Rockset索引您的数据(也可以深度嵌套JSON),让您执行快速毫秒级的SQL。
Rockset还允许您设置数据保留,这对于像您这样的实时流非常有用。
披露:我在@Rockset工作。