分享

Impala性能调整二

52Pig 2014-10-7 15:25:14 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 10432
本帖最后由 pig2 于 2014-10-14 09:15 编辑
阅读导读:
1.如何测试Impala性能?
2.EXPLAIN计划?







在 Impala 使用表和列统计信息的例子
下面的例子通过一系列的 SHOW TABLE STATS, SHOW COLUMN STATS, ALTER TABLE, SELECT , INSERT 语句来演示了 Impala 如何使用统计信息帮助优化查询的各个方面。
这一例子展示了 STORE 表的表和列的统计信息,这个表使用的是 TPC-DS 决策支持系统基准测试中的表。这是一个只有 12 行数据的小表。最初,在使用 COMPUTE STATS 采集统计信息之前,大多数数字列显示占位符 -1,表示这一数字是未知的。这一待填充的数值是容易在物理层计量或推断出的,如文件个数,文件的总数据大小,以及对具有固定大小如 INT,FLOAT,TIMESTAMP 等数据类型的最大和平均大小(Thefigures that are filled in are values that are easily countable or deducible atthe physical level, such as the number of files, total data size of the files,and the maximum and average sizes for data types that have a constant size suchas INT, FLOAT, and TIMESTAMP)。
  1. [localhost:21000] > show table statsstore;
  2. +-------+--------+--------+--------+
  3. | #Rows | #Files | Size   | Format |
  4. +-------+--------+--------+--------+
  5. | -1    | 1      | 3.08KB | TEXT   |
  6. +-------+--------+--------+--------+
  7. Returned 1 row(s) in 0.03s
  8. [localhost:21000] > show column stats store;
  9. +--------------------+-----------+------------------+--------+----------+----------+
  10. | Column             | Type     | #Distinct Values | #Nulls | Max Size | Avg Size |
  11. +--------------------+-----------+------------------+--------+----------+----------+
  12. | s_store_sk         | INT      | -1               |-1     | 4        | 4       |
  13. | s_store_id         | STRING    |-1               | -1    | -1       | -1      |
  14. | s_rec_start_date   | TIMESTAMP | -1              | -1     | 16      | 16       |
  15. | s_rec_end_date     | TIMESTAMP | -1              | -1     |16       | 16       |
  16. | s_closed_date_sk   | INT       | -1              | -1    | 4        | 4       |
  17. | s_store_name       | STRING    | -1              | -1    | -1       | -1      |
  18. | s_number_employees | INT       | -1              | -1     |4        | 4       |
  19. | s_floor_space      | INT       |-1               | -1    | 4        | 4       |
  20. | s_hours            | STRING   | -1               |-1     | -1       | -1      |
  21. | s_manager          | STRING    | -1              | -1    | -1       | -1      |
  22. | s_market_id        | INT      | -1               |-1     | 4        | 4       |
  23. | s_geography_class  | STRING    | -1              | -1     |-1       | -1       |
  24. | s_market_desc      | STRING    | -1              | -1    | -1       | -1      |
  25. | s_market_manager   | STRING    | -1              | -1     |-1       | -1       |
  26. | s_division_id      | INT       |-1               | -1    | 4        | 4       |
  27. | s_division_name    | STRING    | -1              | -1     |-1       | -1       |
  28. | s_company_id       | INT       |-1               | -1    | 4        | 4       |
  29. | s_company_name     | STRING    | -1              | -1    | -1       | -1      |
  30. | s_street_number    | STRING    | -1              | -1     |-1       | -1       |
  31. | s_street_name      | STRING    | -1              | -1    | -1       | -1      |
  32. | s_street_type      | STRING    | -1              | -1    | -1       | -1      |
  33. | s_suite_number     | STRING    | -1              | -1    | -1       | -1      |
  34. | s_city             | STRING   | -1               |-1     | -1       | -1      |
  35. | s_county           | STRING   | -1               |-1     | -1       | -1      |
  36. | s_state            | STRING   | -1               |-1     | -1       | -1      |
  37. | s_zip              |STRING    | -1              | -1     | -1      | -1       |
  38. | s_country          | STRING    |-1               | -1    | -1       | -1      |
  39. | s_gmt_offset       | FLOAT     |-1               | -1    | 4        | 4       |
  40. | s_tax_precentage   | FLOAT     | -1              | -1    | 4        | 4       |
  41. +--------------------+-----------+------------------+--------+----------+----------+
  42. Returned 29 row(s) in 0.04s
复制代码


使用 Hive ANALYZETABLE 语句采集列的统计信息,你必须指定要采集统计信息的每一个列。而 Impala COMPUTESTATS 语句自动采集所有列的统计信息,因为它较快的读取整个表并高效的计算所有列的值。下面例子展示了执行COMPUTE STATS 语句之后,表和所有列的统计信息都被填充:
  1. [localhost:21000] > compute statsstore;
  2. +------------------------------------------+
  3. | summary                                |
  4. +------------------------------------------+
  5. | Updated 1 partition(s) and 29 column(s). |
  6. +------------------------------------------+
  7. Returned 1 row(s) in 1.88s
  8. [localhost:21000] > show table stats store;
  9. +-------+--------+--------+--------+
  10. | #Rows | #Files | Size   | Format |
  11. +-------+--------+--------+--------+
  12. | 12    | 1      | 3.08KB | TEXT   |
  13. +-------+--------+--------+--------+
  14. Returned 1 row(s) in 0.02s
  15. [localhost:21000] > show column stats store;
  16. +--------------------+-----------+------------------+--------+----------+-------------------+
  17. | Column             | Type     | #Distinct Values | #Nulls | Max Size | Avg Size         |
  18. +--------------------+-----------+------------------+--------+----------+-------------------+
  19. | s_store_sk         | INT      | 12               |0      | 4        | 4                |
  20. | s_store_id         | STRING    |6                | 0     | 16       | 16               |
  21. | s_rec_start_date   | TIMESTAMP | 4               | 0      | 16      | 16               |
  22. | s_rec_end_date     | TIMESTAMP | 3               | 6      |16       | 16               |
  23. | s_closed_date_sk   | INT       | 3               | 9     | 4        | 4                |
  24. | s_store_name       | STRING    | 8               | 0     | 5        | 4.25             |
  25. | s_number_employees | INT       | 9               | 0      |4        | 4                |
  26. | s_floor_space      | INT       |10               | 0     | 4        | 4                |
  27. | s_hours            | STRING   | 2                |0      | 8        |7.083300113677979 |
  28. | s_manager          | STRING    |7                | 0     | 15       | 12               |
  29. | s_market_id        | INT      | 7                |0      | 4        | 4                |
  30. | s_geography_class  | STRING    | 1               | 0      |7        | 7                |
  31. | s_market_desc      | STRING    | 10              | 0     | 94       | 55.5             |
  32. | s_market_manager   | STRING    | 7               | 0      | 16      | 14               |
  33. | s_division_id      | INT       |1                | 0     | 4        | 4                |
  34. | s_division_name    | STRING    | 1               | 0      |7        | 7                |
  35. | s_company_id       | INT       |1                | 0     | 4        | 4                |
  36. | s_company_name     | STRING    | 1               | 0     | 7        | 7                |
  37. | s_street_number    | STRING    | 9               | 0      |3        | 2.833300113677979 |
  38. | s_street_name      | STRING    | 12              | 0     | 11       | 6.583300113677979 |
  39. | s_street_type      | STRING    | 8               | 0     | 9        | 4.833300113677979|
  40. | s_suite_number     | STRING    | 11              | 0     | 9        | 8.25             |
  41. | s_city             | STRING   | 2                |0      | 8        | 6.5              |
  42. | s_county           | STRING   | 1                |0      | 17       | 17               |
  43. | s_state            | STRING   | 1                |0      | 2        | 2                |
  44. | s_zip              |STRING    | 2               | 0      | 5       | 5                |
  45. | s_country          | STRING    |1                | 0     | 13       | 13               |
  46. | s_gmt_offset       | FLOAT     |1                | 0     | 4        | 4                |
  47. | s_tax_precentage   | FLOAT     | 5               | 0     | 4        | 4                |
  48. +--------------------+-----------+------------------+--------+----------+-------------------+
  49. Returned 29 row(s) in 0.04s
复制代码


下面的例子展示了分区表中统计信息如何表示。这时,我们设置了一个存放世界上最琐碎的户籍数据的表,包含一个 STRING 字段,根据 YEAR 列进行分区。表统计信息中每一个分区都包含一个单独的实体,再加上最终的总数。对于分区列,列统计信息中包含一些容易推断的事实,如不同值的个数(分区子目录的个数) 和 NULL 值的个数(分区列中不可能出现)。
  1. [localhost:21000] > describe census;
  2. +------+----------+---------+
  3. | name | type     | comment |
  4. +------+----------+---------+
  5. | name | string   |         |
  6. | year | smallint |         |
  7. +------+----------+---------+
  8. Returned 2 row(s) in 0.02s
  9. [localhost:21000] > show table stats census;
  10. +-------+-------+--------+------+---------+
  11. | year  | #Rows | #Files | Size | Format  |
  12. +-------+-------+--------+------+---------+
  13. | 2000  | -1    | 0      | 0B  | TEXT    |
  14. | 2004  | -1    | 0      | 0B  | TEXT    |
  15. | 2008  | -1    | 0      | 0B  | TEXT    |
  16. | 2010  | -1    | 0      | 0B  | TEXT    |
  17. | 2011  | 0     | 1      |22B  | TEXT    |
  18. | 2012  | -1    | 1      |22B  | TEXT    |
  19. | 2013  | -1    | 1      | 231B |PARQUET |
  20. | Total | 0     | 3      | 275B |        |
  21. +-------+-------+--------+------+---------+
  22. Returned 8 row(s) in 0.02s
  23. [localhost:21000] > show column stats census;
  24. +--------+----------+------------------+--------+----------+----------+
  25. | Column | Type     | #Distinct Values | #Nulls | Max Size| Avg Size |
  26. +--------+----------+------------------+--------+----------+----------+
  27. | name   | STRING   | -1              | -1     | -1      | -1       |
  28. | year   | SMALLINT | 7               | 0      | 2       | 2        |
  29. +--------+----------+------------------+--------+----------+----------+
  30. Returned 2 row(s) in 0.02s
复制代码
下面的例子演示了在 Impala 中执行 COMPUTE STATS 语句后统计信息是如何填充的。
  1. [localhost:21000] > compute statscensus;
  2. +-----------------------------------------+
  3. | summary                               |
  4. +-----------------------------------------+
  5. | Updated 3 partition(s) and 1 column(s). |
  6. +-----------------------------------------+
  7. Returned 1 row(s) in 2.16s
  8. [localhost:21000] > show table stats census;
  9. +-------+-------+--------+------+---------+
  10. | year  | #Rows | #Files | Size | Format  |
  11. +-------+-------+--------+------+---------+
  12. | 2000  | -1    | 0      | 0B  | TEXT    |
  13. | 2004  | -1    | 0      | 0B  | TEXT    |
  14. | 2008  | -1    | 0      | 0B  | TEXT    |
  15. | 2010  | -1    | 0      | 0B  | TEXT    |
  16. | 2011  | 4     | 1      |22B  | TEXT    |
  17. | 2012  | 4     | 1      |22B  | TEXT    |
  18. | 2013  | 1     | 1      |231B | PARQUET |
  19. | Total | 9     | 3      | 275B |        |
  20. +-------+-------+--------+------+---------+
  21. Returned 8 row(s) in 0.02s
  22. [localhost:21000] > show column stats census;
  23. +--------+----------+------------------+--------+----------+----------+
  24. | Column | Type     | #Distinct Values | #Nulls | Max Size| Avg Size |
  25. +--------+----------+------------------+--------+----------+----------+
  26. | name   | STRING   | 4               | 1      | 5       | 4.5      |
  27. | year   | SMALLINT | 7               | 0      | 2       | 2        |
  28. +--------+----------+------------------+--------+----------+----------+
  29. Returned 2 row(s) in 0.02s
复制代码
关于在统计信息可用时,演示一些查询工作方式不同的例子,参见 Examples of Join Order Optimization。在采集统计信息之前和之后,观察EXPLAIN 的输出,你可以看到 Impala 使用不同方式执行同一个查询。对比之前和之后的查询时间,检查之前和之后 PROFILE 输出的吞吐量的值, to verify how muchthe improved plan speeds up performance.
Impala 查询基准测试
与其他 Hadoop 组件类似,因为 Impala 是设计用来处理分布式环境中大量数据的,所以应使用真实的数据和集群配置进行性能测试。使用多节点的集群而不是单节点的;对包含 TB 数据的表进行查询而不是几十G的。Impala所有使用的并行处理技术最适合用于超出了单个服务器容量的负载。
当你执行查询返回大量的行,打印输出结果所花费的 CPU 时间是巨大的,为实际查询时间添加了不准确的度量(the CPUtime to pretty-print the output can be substantial, giving an inaccuratemeasurement of the actual query time)。请考虑在 impala-设立了 命令中使用 -B 选项关闭打印结果,而可选的 -o 选项可以保存查询结果到一个文件而不是打印到屏幕上。参见 impala-shellCommand-Line Options 了解详细信息。
控制资源使用
通过为 impalad 守护进程指定 -mem_limits 选项,你可以限制查询执行时 Impala 使用的内存量。参见 ModifyingImpala Startup Options 了解详细信息。这一限制仅对查询直接消耗的内存有效;Impala 在启动时保留了额外的内存,例如用于缓存元数据。
对于生产部署,Cloudera 推荐使用如 cgroups 机制实现资源隔离,可以在 Cloudera Manager 中配置。参见 ManagingClusters with Cloudera Manager 了解详细信息。
当你结合 CDH 5 使用 Impala 时,你可以像在 UsingResource Management with Impala (CDH 5 Only) 中描述的那样使用 YARN 资源管理框架。目前 CDH 5 仍是 beta 版;用于CDH 5 beta 版的对应 Impala 版本是1.2.0。
理解 EXPLAIN 计划
EXPLAIN 语句提供查询将要执行的逻辑步骤的大纲,例如工作在节点之间如何分布,以及中间结果如何组合产生最终结果集。你可以在实际执行查询之前看到这些详细信息。你可以使用这些信息来检查查询是否使用一些非常意外的或低效的方式执行。
在查询 profile 报告的开始部分,EXPLAIN 计划同样被打印出来,以便于检查查询的逻辑和物理的各个方面。
EXPLAIN 输出的细节的数量由 EXPLAIN_LEVEL 查询选项控制。当性能调整时复核表和列的统计信息时,或与 CDH5 中资源管理功能联合评估查询资源使用情况时(or when estimating query resource usage in conjunctionwith the resource management features in CDH 5),通常从 normal 修改为 verbose (或 0 到 1)。
理解查询 Profile
PROFILE 语句在 impala-shell 中可用,产生一个最近执行语句的详细的底层报告。 不像在 Understandingthe EXPLAIN Plan 中描述的 EXPLAIN 那样,这一信息仅当查询执行完成后可用。它展示了物理细节如每一节点读取的字节数,最大内存使用等等信息。你可以使用这些信息确定查询是 I/O 密集(I/O-bound)还是CPU 密集(CPU-bound),是否一些网络条件达到瓶颈,是否一台放缓影响到了部分节点而不影响另一部分(whether a slowdown is affecting some nodes but not others),并检查推荐配置如 short-circuit local reads 是否生效。
EXPLAINplan 同样被打印在查询 profile 报告的开始,以便于检查查询的逻辑和物理的各个方面。在 EXPLAIN_LEVEL 中描述的 EXPLAIN_LEVEL 查询选项,同样对控制 PROFILE 命令中产生的 EXPLAIN 输出打印的详细程度有效。
测试 Impala 性能
测试以确保 Impala 为性能进行了最优配置。假如你没有使用 Cloudera Manager 安装的 Impala,完成本主题中描述的内容以帮助确认已经合适的配置。即使你使用Cloudera Manager 安装的 Impala,已经自动应用合适的配置,这一过程可以检验 Impala 设置是否正确。
检查 Impala 配置值
你可以使用浏览器连接到 Impala 服务器检查 Impala 的配置值:
检查Impala 配置值:
1.使用浏览器连接到你的环境中运行 impalad进程的主机之一。使用类似格式连接 http://hostname:port/varz
  Note: 在前面的例子中,替换 hostname 和 port 为你的 Impala 的名称和端口。默认端口是 25000
2.查看已配置的值
例如,检查你的系统是否启用了本地块跟踪信息(block locality tracking information),应检查dfs.datanode.hdfs-blocks-metadata.enabled 的值是否为 true
检查数据本地化(data locality):
1.在多个节点上都可用的数据集上执行查询。例如,对具有合理机会传播到多个数据节点上表 MyTable 进行查询:
  1. [impalad-host:21000] > SELECT COUNT(*) FROM MyTable
复制代码
2.当查询完成后,检查 Impala 日志的内存。你可能会发现类似下面的消息:
  1. Total remote scan volume = 0
复制代码
远程扫描的存在标识 impalad 没有运行在正确的节点上。当一些数据节点上没有运行 impalad 或无法运行,因为启动查询的 impalad 实例无法连接到一个或多个 impalad 实例(This can be because some DataNodes do not have impalad running or it can be because the impalad instance that is starting thequery is unable to contact one or more of the impalad instances)。
理解这些问题的原因:
连接到调试web服务器。默认的,服务器运行在 25000 端口。这一页面列出了你集群中所有在运行的 impalad 实例。假如列出的实例少于你的预期,这通常表明一些 DataNode 没有运行 impalad。请确保所有 DataNode 都启动了 impalad假如你使用多宿主(multi-homed)主机,请确保 Impala 守护进程的主机名解析到运行的 impalad(If you areusing multi-homed hosts, ensure that the Impala daemon's hostname resolvesto the interface on which impalad is running)。Impala在启动 impalad 时显示主机名。假如需要明确设置主机名,请使用 --hostname 标志
检查 statestored 是否正常运行。复查 state store 日志的内容以确保所有的 impalad 实例别列为连接到 state store
复查 Impala 日志
你可以复查 Impala 日志的内容,查找短路读取(short-circuit reads)或块本地跟踪(block location tracking)没有正常运行的标志。在检查日志之前,对一个小的 HDFS 数据集执行一个简单的查询。完成一个查询任务使用当前设置产生日志信息。启动 Impala 和执行查询的信息可以在 Starting Impala 和 Using the Impala Shell 找到。登录信息可以在 Using Impala Logging 中找到。日志信息和对应的描述如下:
  1. Unknown disk id. This will negativelyaffect performance. Check your hdfs settings to enable block location metadata
  2. Tracking block locality 未启用
  3. Unable to load native-hadoop library for your platform... using builtin-javaclasses where applicable
复制代码
相关内容:






已有(2)人评论

跳转到指定楼层
韩克拉玛寒 发表于 2014-10-8 09:20:15
楼主很细分,菜鸟我给分享了。
回复

使用道具 举报

hb1984 发表于 2014-10-9 23:39:38

谢谢楼主分享。         
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条