我已经安装和设置了Spark纱连同集成与Hive表Spark。通过使用 spark-shell
/ pyspark
,我还按照简单的教程和实现创建配置单元表,加载数据,然后正确选择。
然后我进入下一步,将Hive设置为spark。通过使用 hive
/ beeline
,我还实现了创建配置单元表,加载数据,然后正确选择。在Yarn/Spark上正确执行Hive。我怎么知道它有用?这个 hive
shell显示以下内容:-
hive> select sum(col1) from test_table;
....
Query Hive on Spark job[0] stages: [0, 1]
Spark job[0] status = RUNNING
--------------------------------------------------------------------------------------
STAGES ATTEMPT STATUS TOTAL COMPLETED RUNNING PENDING FAILED
--------------------------------------------------------------------------------------
Stage-0 ........ 0 FINISHED 3 3 0 0 0
Stage-1 ........ 0 FINISHED 1 1 0 0 0
--------------------------------------------------------------------------------------
STAGES: 02/02 [==========================>>] 100% ELAPSED TIME: 55.26 s
--------------------------------------------------------------------------------------
Spark job[0] finished successfully in 55.26 second(s)
OK
6
Time taken: 99.165 seconds, Fetched: 1 row(s)
资源管理器ui还显示 RUNNING
应用程序为 Hive on Spark (sessionId = ....)
我可以参观 ApplicationMaster
用于查找详细信息查询。
目前我还无法实现的步骤是整合 pyspark
/ SparkSQL
到 Hive on Spark
.
我在尝试什么。
编辑 $SPARK_HOME/conf/hive-site.xml
作为 hive.execution.engine=spark
.
<property>
<name>hive.execution.engine</name>
<value>spark</value>
<description>
Expects one of [mr, tez, spark].
</description>
</property>
使用登录pyspark bin/pyspark
并检查 hive.execution.engine
.
>>> spark.sql("set spark.master").show()
+------------+-----+
| key|value|
+------------+-----+
|spark.master| yarn|
+------------+-----+
>>> spark.sql("set spark.submit.deployMode").show()
+--------------------+------+
| key| value|
+--------------------+------+
|spark.submit.depl...|client|
+--------------------+------+
>>> spark.sql("set hive.execution.engine").show()
+--------------------+-----------+
| key| value|
+--------------------+-----------+
|hive.execution.en...|<undefined>|
+--------------------+-----------+
因为,没有任何价值 hive.execution.engine
(相当惊讶!我已经设置了hive-site.xml!),我决定手动设置为following:-
>>> spark.sql("set hive.execution.engine=spark")
>>> spark.sql("set hive.execution.engine").show()
+--------------------+-----+
| key|value|
+--------------------+-----+
|hive.execution.en...|spark|
+--------------------+-----+
使用sparksql从配置单元中选择数据
>>> spark.sql("select sum(col1) from test_table").show()
+---------+
|sum(col1)|
+---------+
| 6|
+---------+
即使显示结果,但在资源管理器中也没有显示应用程序。我明白 SparkSQL
不使用 Hive On Spark
. 我对此一无所知。
问题是
我怎么才能做这个 pyspark
/ SparkSQL
使用 Hive on Spark
?
这样做是否适合提速和远离地面 mr
执行引擎?
我用错配料了吗?还是不可能?
1条答案
按热度按时间sg3maiej1#
“hiveonspark”是“hiveserver2默认使用spark执行引擎”的缩写。
高铁2号的客户有哪些?将hive视为常规数据库的应用程序,通过jdbc(java/scala应用程序,如
beeline
)或odbc(r脚本、windows应用程序)或dbi(python应用程序和脚本),并提交sql查询这适用于Spark工作吗?不。。。!spark想要原始访问数据文件。实际上,spark是自己的数据库引擎;甚至还有spark thriftserver可以作为hs2的(原油)替代品。
当spark构建为与hive v1或hive v2交互时,它只与metastore服务交互——即元数据目录,使多个系统(hiveserver2/presto/impala/spark jobs/spark thriftserver/etc)可以共享“数据库”和“表”的相同定义,包括数据文件的位置(即hdfs目录/s3伪目录/etc)
但是每个系统都有自己的库可以读写到“表”中——hiveserver2使用Yarn作业(可以选择mapreduce、tez、spark等执行引擎); Impala 和普雷斯托有自己的执行引擎运行以外的Yarn;spark有自己的执行引擎在Yarn内部或外部运行。
不幸的是,尽管metastore提供了一个api来管理zookeeper中的读/写锁,但这些系统并不协调它们的读/写操作,这可能是一个真正的混乱(即,由于spark作业在重建分区时刚刚删除了一个文件,hive select查询可能会崩溃,反之亦然)。显然,只有hs2支持这个api,而且它在默认情况下甚至不处于活动状态。
ps:HiveLLAP是另一个系统,它使用yarn和tez(没有其他选项),但是有一个额外的持久性层和一个用于缓存的内存网格——也就是说,不是常规的hiveserver2,而是hortonworks作为impala和presto的竞争对手引入的一个进化。
当spark与hive v3“hortonworks风格”交互时,有一个陷阱:
默认情况下,hiveserver2使用spark不支持的特定数据格式(orc变体)管理“acid表”
默认情况下,metastore通过为hs2和spark使用不同的名称空间来防止spark知道任何hiveserver2表——这实际上否定了拥有单个共享目录的目的。。。!!
因此,horton为spark提供了一个专用的“连接器”,以便通过hs2访问配置单元表——这否定了使用spark执行引擎的目的。。。!!
由于horton已被cloudera吸收,spark与metastore的集成前景尚不明朗。霍顿发行版的大部分好的部分正在替换cloudera的跛脚(或缺失)部分;但这一具体发展显然并不好。