我是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中不推荐的数据并给出缓慢的响应,因此您必须将Tez
或Spark
设置为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;
如果您喜欢我的答案,请添加评论!