我是Cognos的新手,正在尝试使用Hive JDBC驱动程序在Hadoop之上创建报告。我能够通过JDBC连接到Hive并能够生成报告,但是这里的报告运行非常慢。在连接DB2时,我做了相同的工作,并且数据与Hadoop中的数据相同。与Hive之上的报表相比,报表的运行速度非常快。我在Hadoop和DB2中都使用相同的数据集,但无法弄清楚为什么基于Hadoop的报告非常慢。我以伪分布式模式安装了Hadoop,并通过JDBC连接。

我安装了以下使用的软件版本,

  • 带有修订包11的IBM Cognos 10.2.1
  • Apache Hadoop 2.7.2,
  • Apache Hive 0.12。

  • 两者都安装在不同的系统中,Windows 7之上的Cognos和Red-Hat之上的Hadoop。

    谁能告诉我在设置Cognos或Hadoop时我可能出错的地方。有什么方法可以加快Hadoop之上的Cognos中的报表运行时间。

    最佳答案

    当您说以伪分布式模式安装Hadoop时,是说您仅在单个服务器上运行它吗?如果是这样,它将永远不会比DB2快。 Hadoop和Hive旨在在集群上运行并可扩展。使3或4台服务器在集群中运行,您应该发现可以开始看到大型数据集上令人印象深刻的查询速度。

    检查您是否已允许Cognos Query Service访问超过其Java堆(http://www-01.ibm.com/support/docview.wss?uid=swg21587457)的默认内存量,我目前运行的初始大小为8Gb,最大为12Gb,但偶尔还是会遇到问题。

    您将遇到的下一个问题是Cognos不了解Hive SQL的特定信息(或我正在使用的Impala)。这意味着任何非基本查询都将被转换为select或group by的选择。丢失的最大部分将是where子句,这意味着Cognos将尝试从Hive表中吸取所有数据,然后在Cognos中进行过滤,而不是将其传递给它所属的Hive。 Cognos知道如何编写DB2 SQL及其所有细节,因此它可以传递该工作负载。

    更复杂的查询或任何平台特定的函数等通常不会传递给Hive(日期函数,分析函数等),因此请尝试构建数据和查询的结构,以便过滤器中需要它们。

    使用Hive查询日志来监视Cognos正在运行的查询。还可以尝试在查询中添加字段,然后将该字段拖到过滤器中,而不是直接从模型中直接输入到过滤器中。我发现这可以帮助Cognos将过滤器包括在where子句中。

    另一个选择是在Report Studio中使用直通SQL查询,然后将其全部写入Hive的SQL中。我刚刚针对一组仪表板执行了此操作,这些仪表板需要具有500万行的事实表中的前5位堆栈。对于5行,Cognos将提取所有500万行,然后在Cognos中对其进行排名。多次执行此操作,突然之间Cognos就会挣扎。通过直通查询,我可以使用Impala Rank()函数,并且仅获得5行,这比DB2看到我在适当的(但很小的)集群上运行时要快得多,而且要快得多。

    Hive的另一个考虑因素是您是在Map Reduce上使用Hive还是在TEZ上使用Hive。根据同事的发现,在Cognos运行的查询类型上,TEZ上的Hive比Map Reduce上的Hive快得多。

    08-25 04:19