有啥技巧可以让 Hive 在 Hadoop 上运行得更快?

Posted

技术标签:

【中文标题】有啥技巧可以让 Hive 在 Hadoop 上运行得更快?【英文标题】:Any tips for making Hive run faster on Hadoop?有什么技巧可以让 Hive 在 Hadoop 上运行得更快? 【发布时间】:2017-12-05 01:44:58 【问题描述】:

我是 Hive 和 Hadoop 的新手。我已将 Hadoop 配置为具有一个数据节点和一个名称节点的伪分布式操作,所有这些都在 localhost 上。

我有一个包含 4 条记录的普通员工表。我可以在合理的时间内选择记录,但除此之外的任何事情都需要很长时间。例如:

0: jdbc:hive2://localhost:10000> select * from emp;
+------------+------------+-------------+-------------+------------+
| emp.empno  | emp.ename  |   emp.job   | emp.deptno  | emp.etype  |
+------------+------------+-------------+-------------+------------+
| 7369       | SMITH      | CLERK       | 10          | PART_TIME  |
| 7400       | JONES      | ENGINEER    | 10          | FULL_TIME  |
| 7500       | BROWN      | NIGHTGUARD  | 20          | FULL_TIME  |
| 7510       | LEE        | ENGINEER    | 20          | FULL_TIME  |
+------------+------------+-------------+-------------+------------+
4 rows selected (0.643 seconds)
0: jdbc:hive2://localhost:10000> select * from emp order by empno;
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
+------------+------------+-------------+-------------+------------+
| emp.empno  | emp.ename  |   emp.job   | emp.deptno  | emp.etype  |
+------------+------------+-------------+-------------+------------+
| 7369       | SMITH      | CLERK       | 10          | PART_TIME  |
| 7400       | JONES      | ENGINEER    | 10          | FULL_TIME  |
| 7500       | BROWN      | NIGHTGUARD  | 20          | FULL_TIME  |
| 7510       | LEE        | ENGINEER    | 20          | FULL_TIME  |
+------------+------------+-------------+-------------+------------+
4 rows selected (225.852 seconds)

这么长的时间在做什么?是否有可以减少的投票周期?我知道 Hive 没有针对小任务进行优化,但这似乎很荒谬。

以下是各种文件: hive-site.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>hive.mapred.mode</name>
    <value>nostrict</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:derby:;databaseName=metastore_db;create=true</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>org.apache.derby.jdbc.EmbeddedDriver</value>
  </property>
  <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/home/hadoop/tmp</value>
  </property>
  <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/home/hadoop/tmp/$hive.session.id_resources</value>
  </property>
  <property>
    <name>hive.querylog.location</name>
    <value>/home/hadoop/tmp</value>
  </property>
  <property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/home/hadoop/tmp/operation_logs</value>
  </property>
</configuration>

hdfs.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>
   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
   </property>
   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
   </property>
</configuration>

核心站点.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000</value>
   </property>
   <property>
      <name>hadoop.proxyuser.hive.groups</name>
      <value>*</value>
   </property>
   <property>
      <name>hadoop.proxyuser.hive.hosts</name>
      <value>*</value>
   </property>
   <property>
      <name>hadoop.proxyuser.hadoop.hosts</name>
      <value>*</value>
   </property>
   <property>
      <name>hadoop.proxyuser.hadoop.groups</name>
      <value>*</value>
   </property>
</configuration>

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

yarn-site.xml

<?xml version="1.0"?>
<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>

【问题讨论】:

您为 Hadoop 守护进程提供了哪些 Java 内存属性?你安装 Hadoop 的环境有多少内存?内存交换了吗?默认的嵌入式 derby 数据库并不意味着很快 另外,选择纯文本比 ORC 或 Parquet 慢,但是对于阅读 4 行,我认为还有其他问题 您可以使用 tez 代替 map reduce。只需运行命令 set hive.execution.engine=tez; 【参考方案1】:

使用beeline shell,不推荐使用hive。

【讨论】:

【参考方案2】:

您在查询中使用“order by”,order by 强制所有结果的总顺序,因此必须有 single reducer 来对最终输出进行排序。

虽然在这种情况下记录的数量较少,但由于两个阶段(Map 和 Reduce)和磁盘 I/O,查询需要时间来处理。如果输出中的行数太大,单个减速器可能需要很长时间才能完成。

建议您在 Tez 或 Spark 引擎上运行 Hive,除非确实需要,否则不要运行需要完整扫描表的查询。

【讨论】:

【参考方案3】:

您的 Hive 正在使用 Map Reduce 处理 Hive2 中已弃用的数据,并且响应速度也很慢,因此您必须将 TezSpark 设置为您的 Hive 执行引擎,这样可以更快地获得结果。

根据我的经验,我建议您必须使用 Tez 作为执行引擎以获得最佳性能。对于设置Hive-Tez,请发送此文档。 https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.2/bk_command-line-installation/content/ref-d677ca50-0a14-4d9e-9882-b764e689f6db.1.html

【讨论】:

【参考方案4】:

您可以做两件事来更快地运行您的查询: 1. 使用 DISTRIBUTE BYSORT BY 的组合。 DISTRIBUTE BY 将确保所有具有特定值的键最终都在同一个数据节点上。 SORT BY 然后将对每个节点上的数据进行排序。 2. 在执行查询之前将执行引擎设置为 Tez。

设置 hive.execution.engine=tez;

我认为这肯定会使您的查询运行得更快。

【讨论】:

【参考方案5】:
Set hive.fetch.task.conversion=none;

设置此属性并再次运行它

【讨论】:

【参考方案6】:

在 hive 查询的开头使用以下内容:

-- use cost-based query optimization
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;

-- use dynamic hive partition
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;

如果你喜欢我的回答,请添加 cmets!

【讨论】:

以上是关于有啥技巧可以让 Hive 在 Hadoop 上运行得更快?的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Hive 中轻松生存的12个技巧

hadoop和hive之间有啥关系?

学习用Apache Hive的12个简单的步骤

hive和hbase有啥关系和区别

初识Hive:3张图了解Hive的数据类型架构图!

初识Hive:3张图了解Hive的数据类型架构图!