如何使pyspark和sparksql在spark上执行配置单元?

nfzehxib  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(315)

我已经安装和设置了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 / SparkSQLHive 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 执行引擎?
我用错配料了吗?还是不可能?

sg3maiej

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的跛脚(或缺失)部分;但这一具体发展显然并不好。

相关问题