4

我有一个包含 2.5 亿个网站 URL 的文件,每个 URL 都有一个 IP 地址、页面标题、国家名称、服务器横幅(例如“Apache”)、响应时间(以毫秒为单位)、图像数量等。目前,这些记录在一个 25GB 的平面文件中。

我有兴趣从此文件生成各种统计信息,例如:

  • 每个国家/地区代表的 IP 地址数
  • 每个国家/地区的平均响应时间
  • 图像数量 v 响应时间

等等等等

我的问题是,您将如何实现这种类型和规模的处理,以及您将使用哪些平台和工具(在合理的时间内)?

我对所有建议持开放态度,从 Windows 上的 MS SQL 到 Solaris 上的 Ruby,所有建议 :-) DRY 的奖励积分(不要重复自己),我不希望每次不同的削减都编写新程序是必需的。

任何关于什么有效和应该避免什么的评论将不胜感激。

4

10 回答 10

7

第 1 步:将数据放入可以处理数据量的 DBMS。适当索引。

第 2 步:使用 SQL 查询来确定感兴趣的值。

您仍然需要为要回答的每个单独问题编写一个新查询。但是,我认为这是不可避免的。它应该可以节省您复制其余工作的时间。

编辑:

请注意,尽管您可能可以将简单的上传到单个表中,但如果您在将数据加载到单个表中后对其进行规范化,则可能会从查询中获得更好的性能。这并非完全无关紧要,但可能会减少数据量。确保您有一个用于规范化数据的良好过程(可能不是存储过程)会有所帮助。

于 2008-10-20T17:33:28.477 回答
4

将数据加载到 SQL Server(或任何其他主流 db)数据库中的表中,然后编写查询以生成所需的统计信息。除了数据库本身以及用于与数据交互的任何 UI(例如用于 SQL Server 的 SQL Server Management Studio、用于 Oracle 的 TOAD 或 SqlDeveloper 等)之外,您不需要任何工具。

于 2008-10-20T17:28:20.313 回答
3

如果您碰巧使用 Windows,请查看Log Parser。它可以作为独立下载找到,也可以作为IIS Reource Kit的一部分。

Log Parser 可以读取您的日志并将它们上传到数据库。


数据库注意事项:

对于您的数据库服务器,您将需要一些快速的东西(Microsoft SQL Server、IBM 的 DB2、PostgreSQL 或 Oracle)。mySQL 可能也很有用,但我没有使用大型数据库的经验。

你会想要你能负担得起的所有内存。如果您将定期使用数据库,我会说至少 4 GB。它可以用更少的东西完成,但你会注意到性能上有很大的不同。

此外,如果您负担得起,请选择多核/多 cpu 服务器,并且再次,如果您将定期使用此数据库。

另一个建议是分析您将要执行的查询之王并相应地规划索引。请记住:您创建的每个索引都需要额外的存储空间。

当然,在大量数据加载操作之前,关闭索引甚至销毁 de 索引。这将使负载更快。数据加载操作后重新索引或重新创建索引。

现在,如果这个数据库将是一个持续的操作(即不仅仅是调查/分析某些东西然后丢弃它),您可能需要设计一个包含目录和详细信息表的数据库模式。这称为数据库规范化,您需要的规范化的确切数量取决于使用模式(数据加载操作与查询操作)。如果要持续使用此数据库并且有性能要求,则必须有经验丰富的 DBA。


附言

我会冒险在这里包含一些明显的东西,但是......

我想您可能对Log Analyzer感兴趣。这些是从 Web 服务器日志文件生成统计信息的计算机程序(有些还可以分析 ftp、sftp 和邮件服务器日志文件)。

Web 日志分析器生成带有统计信息的报告。通常,报告生成为 HTML 文件并包含图形。深度分析和选项有很多种。有些是非常可定制的,有些则不是。您将找到商业产品和开源产品。

对于您将要管理的数据量,请仔细检查每个候选产品,并仔细查看处理速度和能力。

于 2008-10-20T17:56:09.290 回答
1

导入数据时要记住的一件事是尝试创建允许您执行您想要执行的各种查询的索引。考虑一下您将查询哪些类型的字段以及这些查询可能是什么样子。这应该可以帮助您决定需要什么索引。

于 2008-10-20T17:35:28.287 回答
0

25GB 的平面文件。我不认为自己编写任何组件来读取此文件是一个好主意。

我建议您应该进行 SQL 导入并将所有数据带到 SQL Server。我同意在 SQL Server 中获取这些数据需要很长时间,但是一旦有了,你就可以用这些数据做任何你想做的事情。

我希望一旦您将这些数据放入数据库中,之后您将获得信息增量而不是 25 GB 的平面文件。

于 2008-10-20T17:28:41.170 回答
0

对我来说听起来像是 perl 的工作。只需计算您想要的统计数据即可。使用正则表达式解析行。解析该大小的文件可能需要不到 10 分钟的时间。我的计算机使用 perl 在大约 45 秒内读取了一个 2 gig 文件(1300 万行)。

于 2008-10-21T00:09:43.920 回答
0

您还没有说明平面文件中的数据是如何组织的。RDBMS 建议是明智的,但假设您的平面文件以某种分隔方式格式化,并且 db 导入是一项相对简单的任务。如果不是这种情况,那么您首先要做的是将数据干净地反编译成一组您可以进行分析的字段的艰巨任务。

我假设您的数据不是一个好的 CSV 或 TXT 文件,因为您没有说任何一种方式,也没有其他人回答这部分可能的问题。

如果数据具有规则结构,即使没有漂亮的干净字段分隔符,您也可以将 ETL 工具用于工作,例如Informatica。由于您是技术人员并且这是一次性工作,因此您绝对应该考虑编写一些自己的代码,这些代码会进行一些正则表达式比较以提取您想要的部分并吐出一个文件,然后您可以将其加载到数据库中. 无论哪种方式,您都必须投入大量精力来解析和清理数据,所以不要认为这是一件容易的事。

如果您确实编写了自己的代码,那么我建议您选择一种编译语言并确保一次处理一行数据(或以一种将读取缓冲成可管理块的方式)。

无论哪种方式,您都将完成一项相当大的工作,以确保您应用于数据的任何过程的结果都得到一致执行,您不希望 IP 地址在计算中显示为十进制数字。在这种规模的数据上,很难检测到这样的故障。

一旦你解析了它,我认为 RDBMS 是存储和分析数据的正确选择。

于 2008-10-20T19:17:23.027 回答
0

这是一次性的事情还是你会每天、每周处理事情?无论哪种方式,请查看 vmarquez 的回答,我听说过有关 logparser 的好消息。还可以查看http://awstats.sourceforge.net/,它是一个成熟的网络统计应用程序。

于 2008-10-20T19:28:56.700 回答
0

SQL Server Analysis Services专为进行这种类型的数据分析而设计。学习曲线有点陡峭,但是一旦设置了模式,您将能够非常快速地执行任何类型的横切查询。

于 2008-10-20T21:10:10.613 回答
0

如果您有不止一台计算机可供使用,那么这对于MapReduce来说是一项完美的工作。

于 2008-10-20T21:19:30.860 回答