Big SQL 是 IBM® SQL 接口,可用于其基于 Hadoop 的平台,即 InfoSphere® BigInsights™。Big SQL 被封装到 InfoSphere BigInsights 2.1.2 中。
InfoSphere BigInsights Quick Start Edition 是一个免费的、可下载的 InfoSphere BigInsights 版本,是 IBM 基于 Hadoop 的产品。使用 Quick Start Edition,您可以尝试 IBM 为了提高开源 Hadoop 的价值而构建的特性,比如 Big SQL、文本分析和 BigSheets。为了让您的体验尽可能顺利,我们提供了引导式学习,包括分步的自学教程和视频,帮助您开始让 Hadoop 为您工作。没有时间或数据的限制,您可以自己选择时间使用大量数据进行实验。观看视频,遵循这些教程(PDF),并立即 下载 BigInsights Quick Start Edition 。
Hadoop 框架允许使用 MapReduce 编程范式的计算机分布式处理大型数据集。Hadoop 框架接受来自客户机的 MapReduce 任务,然后创建所需数量的 map 和 reduce 任务。这些任务的运行非常接近数据(而不是将数据移动到计算中)。任务的输出将进行汇总,最终结果被返回到客户机。
Big SQL 为客户机提供了一个到 Hadoop 的 SQL 接口。Big SQL 对查询进行了优化,从而可以利用可用内存降低 I/O。对于某些 SQL 查询,Big SQL 消除了整个 reduce 任务。Big SQL 还允许您控制某些参数来进一步调优任务。本文将介绍一些与内存相关的参数以及如何配置它们。您可以在两个层面配置内存,以便获得更好的性能:
Big SQL 服务器作为单独进程运行在安装有 Hadoop 框架的集群上。Big SQL 服务器将查询转换为经过优化的查询方案,并根据方案生成一个 MapReduce 任务。
提供给 Big SQL 服务器的内存的数量取决于以下条件:
select col1 from tab1
)更多的内存。 在默认情况下,Big SQL 服务器最初会分配 1 GB 的内存堆,最高内存消耗会占到系统内存的三分之一。您还可以利用环境变量(如清单 1 所示)对这些限制进行修改。在启动 Big SQL 服务器之前,要先设置这些变量。(了解有关配置 Big SQL)的更多信息。
清单 1. 为 Big SQL 服务器配置初始堆大小和最大堆大小
export BIGSQL_CONF_INSTANCE_INITIAL_MEM=1024m export BIGSQL_CONF_INSTANCE_MAX_MEM=2048m
有时,Big SQL 会在本地模式运行查询,也就是说不会创建任何 MapReduce 任务。当必须在小数据集上运行查询时,这一特性非常有用。您可以在 $BIGSQL_HOME/conf 目录的 bigsql-site.xml 配置文件中利用 bigsql.localmode.size
参数配置数据集的大小。
如果查询中引用的所有表的大小的乘积小于 bigsql.localmode.size
参数指定的值,那么该参数标志着 Big SQL 在本地模式下自动运行查询。默认值为 200 MB。为该参数指定的值是查询中每个步骤的大小限制值。对于查询的每一步骤,Big SQL 都将针对这一具体步骤重新评估输入数据的大小,并决定是否在本地模式运行这一查询步骤。如果多个 Big SQL 连接提交查询,并且同时访问满足大小限制的表,那么 Big SQL 服务器中累积的内存堆消耗将增加,具体值为 200 MB 乘以并发连接的数量。
例如,如果 10 个查询中引用的表大小的乘积小于 bigsql.localmode.size
参数的值,那么所有 10 个查询都在本地模式运行。因此,它们占用的内存空间就等于 Big SQL 服务器堆中指定的 bigsql.localmode.size
值的 10 倍。
注意:您需要重启 Big SQL 服务器,以便让对配置文件的更改生效。为了避免服务器重启,可以发出 SET
命令为会话定义参数。
回页首
Big SQL 层可创建经过优化的 MapReduce 任务,并和其他 MapReduce 任务一样在 Hadoop 框架内运行。Hadoop 对每个 map 任务和 reduce 任务启动了一个 Java Virtual Machine (JVM)。Hadoop 提供了参数,可为这些任务配置内存限制。(了解有关这些参数以及最优值 的更多信息)。请注意,需要提供足够的内存来支持必要的数据处理。
配置如下参数,这些参数位于 InfoSphere BigInsights 的 $BIGINSIGHTS_HOME/hadoop-conf/mapred-site.xml 文件中。
mapred.child.java.opts
:同时控制 map 任务和 reduce 任务的内存堆大小 mapreduce.map.child.java.opts
:只控制 map 任务的堆大小 mapreduce.reduce.child.java.opts
:只控制 reduce 任务的堆大小 设置的参数值将应用于 InfoSphere BigInsights 集群内运行的所有任务。如果只针对 Big SQL 任务修改任务堆大小,可以在 $BIGSQL_HOME/conf/bigsql-site.xml 文件中为前面的参数提供覆盖值( mapred.child.java.opts
、 mapreduce.map.child.java.opts
和 mapreduce.reduce.child.java.opts
)。对该文件作出的修改将影响所有与 Big SQL 服务器的连接。您还可以使用 SET
命令为每个会话或连接设置任务堆大小(或者在任务配置中设置参数值)。
SET mapred.child.java.opts="-Xmx2048m"
注意:在 bigsql-site.xml 文件中设置的值或使用 SET
命令设置的值对于非 Big SQL 任务并不起作用。因此,在混合工作负载环境中,可以多调配一些内存。
在配置这些参数时,需要认真评估 SQL 查询的内存需求。下面这些小技巧可帮助您判断如何根据 SQL 查询来提高或降低内存限制。
select with predicate queries
之类的查询可能不需要 reduce 任务。 select count(*) queries
之类的查询在 map 任务中处理的数据要多于在 reduce 任务中的数据。 您可以在 bigsql-site.xml 文件中设置以下与内存有关的配置参数。根据您的工作负载对它们进行调优。
jaql.combine.split.size
: 在将数据发送给 map 任务之前,应当控制 HDFS 数据块的数量,使它们能够捆绑在一起。默认情况下,参数值为 2x
,这表示在一个 map 任务中有两个 HDFS 块组合在一起。参数值大于 1x
会导致创建的 map 任务的数量减少;因此,Hadoop 需要启动更少的 JVM,从而缩短 JVM 启动时间。 bigsql.memoryjoin.size
: 表示 Big SQL 服务器选择使用一个内存联接(在 map 任务中)。如果表大小的字节数小于参数值的话,该联接会在每个 map 任务中将两个小表放到一个内存散列(hash)表中。 adaptivemr.combine.size
: 表示Adaptive MapReduce 使用的存储桶(bucket)的数量。如果 adaptivemr.combine.size
被设置为 0,那么 Adaptive MapReduce 将处于关闭状态。 回页首
在默认情况下,Big SQL 将在内部对某些重要参数自动计算值。以下参数值将会影响性能,即使在已开启自动计算特性的情况下,也可以手动配置这些参数。
io.sort.mb
: map 任务将会处理数据并汇总输出,然后将输出发送给 reduce 任务进行进一步处理。这种分组是在一个循环内存缓冲区内执行的。当缓冲区内容达到某个阈值后,缓冲器内容将溢出到磁盘。这种操作对于大量溢出的情况有显著的性能影响。 jaql.combine.split.size
也会影响溢出。随着 jaql.combine.split.size
值的增加,每个 map 任务完成的工作量也会增加,因此 map 任务内的排序溢出或内存使用也可能会增加。大多数情况下,如果增加 jaql.combine.split.size
的值,则需要增加 map 任务的 JVM 内存堆(使用 mapred.child.java.opts
或 mapreduce.map.child.java.opts
参数),并增加 Hadoop 排序缓冲区大小(使用 io.sort.mb
等参数)。默认情况下,Big SQL 将 jaql.combine.split.size
参数设置为 2x
,这一数值适用于大部分查询。对于某些查询,将该值降低到 1x
有助于提高性能。通过查看任务跟踪器中的 MapTask 日志条目,您可以判断发生的溢出的数量。如清单 2 所示。
清单 2. 在任务跟踪器中检查 shuffle 期间的溢出
org.apache.hadoop.mapred.MapTask: Finished spill 0 org.apache.hadoop.mapred.MapTask: Spilling map output: record full = true org.apache.hadoop.mapred.MapTask: bufstart = 3670016; bufend = 7340018; bufvoid = 99614720 org.apache.hadoop.mapred.MapTask: kvstart = 262144; kvend = 196607; length = 327680
如果您发现这些条目在 MapTask 日志中频繁出现,那么可以增加 io.sort.mb
的值来提高性能。要配置 io.sort.mb
参数,可设置 io.sort.mb.pct
的值。该值可确定内存堆大小的百分比。这个百分比是在 mapred.map.child.java.opts
参数或分配给 io.sort.mb
的 mapred.child.java.opts
参数中指定的。
在启用自动计算功能后,Big SQL 服务器会让 io.sort.mb 大小保持为 map 任务堆大小的 25% 到 50%。要将 io.sort.mb 大小设置为 map 任务堆大小的 40%,可以使用命令 SET io.sort.mb.pct=".40"
。
jaql.group.input.default
: 控制 reduce 任务中的每个输入在内存中缓存的记录的数量。要配置 jaql.group.input.default
,设置 jaql.group.input.default.per.mb
的值。该值可确定 mapred.reduce.child.java.opts
或 mapred.child.java.opts
的记录的数量(每兆字节)。例如,使用命令 SET jaql.group.input.default.per.mb="16.0"
。 您可以通过两种方式关闭自动计算功能:使用 SET
命令,或在 bigsql-site.xml 文件中将 bigsql.autocalculate.memory
参数设置为 false。在关闭自动计算功能后,可以直接设置 io.sort.mb
和 jaql.combine.split.size
参数,不需要使用参数 io.sort.mb.pct
和 jaql.group.input.default.per.mb
间接设置这些值。
回页首
本文介绍了如何在 Big SQL 中设置与内存相关的参数。利用本文提到的概念,您可以根据自己的数据和工作负载设置这些参数,从而提高 Big SQL 服务器的性能。