[英]How would you approach this data processing task? [closed]
我有一个包含2.5亿个网站URL的文件,每个URL都有IP地址,页面标题,国家名称,服务器横幅(例如“Apache”),响应时间(以毫秒为单位),图像数量等等。 目前,这些记录是25GB的平面文件。
我有兴趣从这个文件生成各种统计数据,例如:
等等
我的问题是,你将如何实现这种类型和规模的处理,以及你使用的平台和工具(在合理的时间内)?
我对所有的建议都持开放态度,从Windows上的MS SQL到Solaris上的Ruby,所有建议:-) DRY的奖励积分(不要重复自己),我不希望每次不同的时候都不写新程序需要。
任何关于什么有效以及应该避免什么的评论都将非常感激。
步骤1:将数据导入可处理数据量的DBMS。 指数恰当。
第2步:使用SQL查询来确定感兴趣的值。
您仍然需要为要回答的每个单独问题编写新查询。 但是,我认为这是不可避免的。 它可以节省你复制其余的工作。
编辑:
请注意,虽然您可以简单地上传到单个表中,但如果在将数据加载到单个表后对数据进行规范化,则可能会从查询中获得更好的性能。 这不是完全无关紧要的,但可能会减少数据量。 确保您有一个良好的过程(可能不是存储过程)来规范化数据将有所帮助。
将数据加载到SQL Server(或任何其他主流数据库)数据库中的表中,然后编写查询以生成所需的统计信息。 您不需要除数据库本身以外的任何工具以及用于与数据交互的任何UI(例如SQL Server Management Studio for SQL Server,TOAD或SqlDeveloper for Oracle等)。
如果您碰巧使用Windows,请查看Log Parser 。 它可以作为独立下载找到,也包含在IIS Reource Kit中 。
Log Parser可以读取您的日志并将其上传到数据库。
数据库考虑因素:
对于您的数据库服务器,您将需要快速的东西(Microsoft SQL Server,IBM的DB2,PostgreSQL或Oracle)。 mySQL也可能有用,但我没有使用大型数据库的经验。
您将需要所有可以承受的记忆。 如果您将定期使用数据库,我至少会说4 GB。 它可以少花钱完成,但你会注意到性能上的巨大差异。
此外,如果您能负担得起,请使用多核/多CPU服务器,如果您将定期使用此数据库,请再次使用。
另一个建议是分析您将要进行的查询之王并相应地规划索引。 请记住:您创建的每个索引都需要额外的存储空间。
当然,在主动数据加载操作之前关闭索引甚至销毁de索引。 这将使负载更快。 在数据加载操作后重新索引或重新创建索引。
现在,如果此数据库将是一个持续的操作(即不仅仅是调查/分析某些内容然后丢弃它),您可能需要设计一个包含目录和详细信息表的数据库模式。 这称为数据库规范化,您需要的规范化的确切数量取决于使用模式(数据加载操作与查询操作)。 如果此数据库将持续使用并具有性能要求,则必须具备经验丰富的DBA。
PS
我会冒风险在这里加入明显的东西,但......
我想您可能对Log Analyzer感兴趣。 这些是从Web Server日志文件生成统计信息的计算机程序(有些还可以分析ftp,sftp和邮件服务器日志文件)。
Web日志分析器生成包含统计信息的报告。 通常,报告生成为HTML文件并包含图形。 深度分析和选项有很多种。 有些是非常可定制的,有些则不是。 你会发现商业产品和开源。
对于您将要管理的数据量,请仔细检查每个候选产品,并仔细查看速度和处理能力。
在导入数据时要记住的一件事是尝试创建索引,以便您可以执行您想要执行的各种查询。 考虑一下您将查询哪些字段以及这些查询可能是什么样子。 这应该可以帮助您确定所需的索引。
25GB的平面文件。 我不认为自己编写任何组件来阅读这个文件将是一个好主意。
我建议您应该进行SQL导入并将所有数据都带到SQL Server。 我同意在SQL Server中获取这些数据需要很长时间,但是一旦它存在,你可以用这些数据做任何你想做的事情。
我希望一旦你将这些数据放入数据库,之后所有你将得到的信息增量不是25 GB的平面文件。
您还没有说明平面文件中的数据是如何组织的。 RDBMS建议是明智的,但假设您的平面文件以某种分隔方式格式化,并且db导入是一个相对简单的任务。 如果情况并非如此,那么您首先要完成一项艰巨的任务,即将数据干净地反编译为一组字段,您可以在其中进行分析。
我将假设你的数据不是一个很好的CSV或TXT文件,因为你没有说过任何一种方式,没有其他人已经回答了这部分问题。
如果数据具有常规结构,即使没有漂亮的干净字段分隔符,您也可以将ETL工具转换为作业,例如Informatica 。 既然你是一个技术人员,这是一个一次性的工作,你一定要考虑编写自己的一些代码进行一些正则表达式比较,以提取你想要的部分,并吐出一个文件,然后你可以加载到数据库。 无论哪种方式,您都必须在解析和清理数据方面投入大量精力,因此不要将此视为一项简单的任务。
如果您确实编写了自己的代码,那么我建议您选择一种编译语言,并确保一次处理一行数据(或者以一种将读取缓冲为可管理块的方式)。
无论哪种方式,您都要做一个非常重要的工作,确保应用于数据的任何进程的结果始终如一,您不希望IP地址在计算中以十进制数字形式出现。 在该规模的数据上,很难检测到这样的故障。
一旦解析了它,我认为RDBMS是存储和分析数据的正确选择。
这是一次性的事情,还是每天都在处理事情? 无论哪种方式检查vmarquez的答案我听说过logparser的好东西。 另请查看http://awstats.sourceforge.net/这是一个完整的网络统计应用程序。
SQL Server Analysis Services旨在完成该类型的数据分析。 学习曲线有点陡峭,但是一旦设置了模式,您就可以非常快速地进行任何类型的横切查询。
如果您有多台计算机可供使用,这对MapReduce来说是一个完美的工作。
对我来说听起来像perl的工作。 只需记住你想要的统计数据。 使用正则表达式来解析该行。 解析该大小文件可能不到10分钟。 我的计算机使用perl在大约45秒内读取2 gig文件(1300万行)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.