【问题标题】:How would you approach this data processing task? [closed]您将如何处理此数据处理任务? [关闭]
【发布时间】:2008-10-20 17:20:48
【问题描述】:

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

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

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

等等等等

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

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

任何关于什么是有效的,什么是应该避免的,我们将不胜感激。

【问题讨论】:

    标签: database data-processing


    【解决方案1】:

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

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

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

    已编辑:

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

    【讨论】:

    • 关于规范化的重要说明!
    • 标准化并不总是意味着更好的性能(需要存储的数据更少——是的)。请参阅 highscalability.com/…kottke.org/04/10/normalized-data 。值得称赞的是,您符合“可能会获得更好的表现”的资格。
    • 在这种情况下,我猜一个好的归一化确实有助于提高性能,因为它可以将大多数分类任务变成整数比较。
    【解决方案2】:

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

    【讨论】:

      【解决方案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 文件并包含图形。深度分析和选项有很多种。有些是非常可定制的,有些则不是。您会发现商业产品和开源产品。

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

      【讨论】:

      • 关于经常读/很少写的模式,MySQL 真的是文件。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

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

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

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

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    猜你喜欢
                    • 2014-11-21
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-04-16
                    • 1970-01-01
                    • 2014-11-13
                    • 1970-01-01
                    • 2015-01-07
                    • 1970-01-01
                    相关资源
                    最近更新 更多