任何使Hive在Hadoop上更快运行的技巧



我是Hive和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>

core-site.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>

纱线site.xml

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

使用beeline shell,hive被弃用。

您在查询中使用'订单',订购所有结果的总顺序,因此必须有单个还原对最终输出进行排序。

尽管在这种情况下,记录的数量较少,因为两个阶段(地图和降低)和磁盘I/O,但查询需要时间来处理。如果输出中的行数太大,则单个还原器可能需要很长时间才能完成。

建议您在tez 上运行 hive或火花引擎,并且不运行需要完整扫描表的查询。

您的Hive使用Map Reduce来处理在Hive2中不推荐的数据并给出缓慢的响应,因此您必须将TezSpark设置为HIVE执行引擎,从而为您提供更快的结果。<<<<<<<<<<<<<<<<<<<<

根据我的经验,我建议您必须将Tez用作执行引擎才能获得最佳性能。对于设置Hive-Tez,请浏览此文档。https://docs.hortonworks.com/hdpdocuments/hdp2/hdp-2.6.2/bk_command-line-line-installation/content/ref-d677ca50-0a14-4d9e-9882-b764e64e64e689f6db.1.html

>

您可以做两件事以更快地运行查询:1.使用的组合通过进行分配。通过分发将确保所有具有一定值的键最终都会在相同的数据节点上。然后,将每个节点上的数据排序。2.在执行查询之前将执行引擎设置为TEZ。

设置hive.execution.engine = tez;

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

Set hive.fetch.task.conversion=none;

设置此属性并再次运行

在蜂巢查询开始时使用以下内容:

-- 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;

如果您喜欢我的答案,请添加评论!

最新更新