我是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并没有针对小任务进行优化,但这看起来很荒谬。
这里是各种文件: 蜂房-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>
芯-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>
答案 0 :(得分:0)
使用beeline shell,不推荐使用配置单元。
答案 1 :(得分:0)
您的配置单元正在使用Map Reduce
来处理Hive2中不推荐使用的数据,并且响应速度很慢,因此您必须将Tez
或Spark
设置为您的配置单元执行引擎更快的结果。
根据我的经验,我建议您必须使用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
答案 2 :(得分:0)
您在查询中使用'order by',按顺序强加所有结果的总顺序,因此必须有单个reducer 来对最终输出进行排序。
虽然在这种情况下记录的数量较少,但由于两个阶段(Map和Reduce)和磁盘I / O,查询需要时间来处理。如果输出中的行数太大,则单个减速器可能需要很长时间才能完成。
建议您在Tez 或Spark引擎上运行 Hive,并且除非确实需要,否则不要运行需要完整扫描表的查询。
答案 3 :(得分:0)
您可以做两件事来更快地运行查询: 1.使用 DISTRIBUTE BY 和 SORT BY 的组合。 DISTRIBUTE BY将确保具有特定值的所有密钥最终都在同一数据节点上。然后,SORT BY将对每个节点上的数据进行排序。 2.在执行查询之前将执行引擎设置为Tez。
设置hive.execution.engine = tez;
我认为这肯定会使您的查询运行得更快。
答案 4 :(得分:0)
Set hive.fetch.task.conversion=none;
设置此属性并再次运行
答案 5 :(得分:0)
在配置单元查询开始时使用以下命令:
-- 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;
如果您喜欢我的回答,请添加评论!