Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在不使用HDP3.1中的仓库连接器的情况下从spark向hive写入表_Apache Spark_Hive_Apache Spark Sql_Hdp_Hadoop3 - Fatal编程技术网

Apache spark 如何在不使用HDP3.1中的仓库连接器的情况下从spark向hive写入表

Apache spark 如何在不使用HDP3.1中的仓库连接器的情况下从spark向hive写入表,apache-spark,hive,apache-spark-sql,hdp,hadoop3,Apache Spark,Hive,Apache Spark Sql,Hdp,Hadoop3,当尝试使用HDP 3.1上的spark 2.3在没有仓库连接器的情况下直接将数据写入配置单元表到配置单元架构时,请使用: spark-shell --driver-memory 16g --master local[3] --conf spark.hadoop.metastore.catalog.default=hive val df = Seq(1,2,3,4).toDF spark.sql("create database foo") df.write.saveAsTable("foo.my

当尝试使用HDP 3.1上的spark 2.3在没有仓库连接器的情况下直接将数据写入配置单元表到配置单元架构时,请使用:

spark-shell --driver-memory 16g --master local[3] --conf spark.hadoop.metastore.catalog.default=hive
val df = Seq(1,2,3,4).toDF
spark.sql("create database foo")
df.write.saveAsTable("foo.my_table_01")
在以下情况下失败:

Table foo.my_table_01 failed strict managed table checks due to the following reason: Table is marked as a managed table but is not transactional
但是a:

val df = Seq(1,2,3,4).toDF.withColumn("part", col("value"))
df.write.partitionBy("part").option("compression", "zlib").mode(SaveMode.Overwrite).format("orc").saveAsTable("foo.my_table_02")
使用
Spark.sql(“从foo.my_table_02中选择*).show
可以很好地工作。 现在进入蜂箱/直线:

0: jdbc:hive2://hostname:2181/> select * from my_table_02;
Error: java.io.IOException: java.lang.IllegalArgumentException: bucketId out of range: -1 (state=,code=0)
A

返回

 +-----------------------------+----------------------------------------------------+----------+
|          col_name           |                     data_type                      | comment  |
+-----------------------------+----------------------------------------------------+----------+
| value                       | int                                                |          |
| part                        | int                                                |          |
|                             | NULL                                               | NULL     |
| # Partition Information     | NULL                                               | NULL     |
| # col_name                  | data_type                                          | comment  |
| part                        | int                                                |          |
|                             | NULL                                               | NULL     |
| Detailed Table Information  | Table(tableName:my_table_02, dbName:foo, owner:hive/bd-sandbox.t-mobile.at@SANDBOX.MAGENTA.COM, createTime:1571201905, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:value, type:int, comment:null), FieldSchema(name:part, type:int, comment:null)], location:hdfs://bd-sandbox.t-mobile.at:8020/warehouse/tablespace/external/hive/foo.db/my_table_02, inputFormat:org.apache.hadoop.hive.ql.io.orc.OrcInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.ql.io.orc.OrcSerde, parameters:{path=hdfs://bd-sandbox.t-mobile.at:8020/warehouse/tablespace/external/hive/foo.db/my_table_02, compression=zlib, serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[FieldSchema(name:part, type:int, comment:null)], parameters:{numRows=0, rawDataSize=0, spark.sql.sources.schema.partCol.0=part, transient_lastDdlTime=1571201906, bucketing_version=2, spark.sql.create.version=2.3.2.3.1.0.0-78, totalSize=740, spark.sql.sources.schema.numPartCols=1, spark.sql.sources.schema.part.0={\"type\":\"struct\",\"fields\":[{\"name\":\"value\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}},{\"name\":\"part\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}}]}, numFiles=4, numPartitions=4, spark.sql.partitionProvider=catalog, spark.sql.sources.schema.numParts=1, spark.sql.sources.provider=orc, transactional=true}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE, rewriteEnabled:false, catName:hive, ownerType:USER, writeId:-1) |
如何使用spark写入hive而不使用warehouse connector,但仍然写入同一个metastore(稍后可由hive读取)? 据我所知,应该可以使用外部表(您的表不是托管的,不是ACID的,不是事务性的),但我不知道如何告诉
saveAsTable
如何处理这些表

编辑 相关问题:

    • 设置答案中建议的属性并不能解决我的问题
  • 似乎也是一个bug:
可能是一个类似的解决办法,但我不喜欢在我还没有看到任何大规模性能测试的地方使用更多的管道胶带。此外,这意味着改变所有现有的spark工作

事实上,报告了大型数据帧和仓库连接器的问题

编辑 我刚找到

以及:

execute()与executeQuery()的比较

ExecuteQuery()将始终使用Hiveserver2交互/LLAP作为它的 使用快速箭头协议。当JDBCURL指向 非LLAP Hiveserver2将产生错误

Execute()使用JDBC,不依赖于LLAP,但有 内置限制,最多只返回1.000条记录,但对于大多数 查询(插入到…选择、计数、求和、平均值)不是 问题

但这不会扼杀hive和spark之间的高性能互操作性吗?特别是当没有足够的LLAP节点可用于大规模ETL时

事实上,这是真的。可以在配置此设置,但我不确定增加此值对性能的影响

您尝试过吗

data.write\
.mode(“追加”)\
.insertInto(“表名”)

在Ambari内部,只需在默认情况下禁用创建事务表的选项即可解决我的问题

设置为false两次(tez,llap)


如果需要,可以在每个
表属性中手动启用(使用事务表)。

创建外部表(作为解决方法)似乎是我的最佳选择。 这仍然需要HWC注册列元数据或更新分区信息

大致如下:

val df:DataFrame = ...
val externalPath = "/warehouse/tablespace/external/hive/my_db.db/my_table"
import com.hortonworks.hwc.HiveWarehouseSession
val hive = HiveWarehouseSession.session(spark).build()
dxx.write.partitionBy("part_col").option("compression", "zlib").mode(SaveMode.Overwrite).orc(externalPath)
val columns = dxx.drop("part_col").schema.fields.map(field => s"${field.name} ${field.dataType.simpleString}").mkString(", ")
val ddl =
      s"""
         |CREATE EXTERNAL TABLE my_db.my_table ($columns)
         |PARTITIONED BY (part_col string)
         |STORED AS ORC 
         |Location '$externalPath'
       """.stripMargin

hive.execute(ddl)
hive.execute(s"MSCK REPAIR TABLE $tablename SYNC PARTITIONS")
不幸的是,这带来了:

java.sql.SQLException: The query did not generate a result set!
来自HWC

“我如何使用spark在不使用warehouse连接器的情况下写入hive,但仍要写入hive稍后可以读取的同一元存储?”

我们正在使用相同的设置(HDP 3.1和Spark 2.3)。使用下面的代码,我们得到的错误消息与您得到的“bucketId超出范围:-1”相同。解决方案是运行
sethive.fetch.task.conversion=none

不使用HWC将数据写入配置单元的代码:

val warehouseLocation=新文件(“spark warehouse”).getAbsolutePath
案例类记录(键:Int,值:String)
val spark=SparkSession.builder()
.master(“纱线”)
.appName(“SparkHiveExample”)
.config(“spark.sql.warehouse.dir”,warehouseLocation)
.enableHiveSupport()
.getOrCreate()
sql(“使用数据库名”)
val recordsDF=spark.createDataFrame((1到100).map(i=>Record(i,s“val_$i”))
recordsDF.write.mode(SaveMode.Overwrite).format(“orc”).saveAsTable(“sparkhive_记录”)

[举例自https://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html]

否,因为该表尚不存在,我想使用spark.may.be.mode(“覆盖”)创建它?。通常情况下,saveAsTable工作正常,但不确定上述错误的原因。您指的是正常情况下的HDP 2.x还是3.x?您是否尝试将表存储格式显式设置为Hive ACID不支持的非默认格式(即非ORC),因此不应干扰新的ACID默认设置?像拼花地板、AVRO、CSV等等,最好的解决方法是在Ambari中禁用新的“默认酸性”设置。如果需要ACID,请在Hive中的
CREATE TABLE
中显式显示它——就像HDP2.x中那样,这听起来非常合理。你知道在哪里更改它/这个属性的键吗?这只适用于拼花地板,不适用于兽人。在后一种情况下:
java.lang.IllegalArgumentException:bucketId超出范围:-1(状态=,代码=0)
仍保留。这也可以修复吗?这是一个新的兽人表,没有事务道具创建?或者现有的ORC表(事务性的无法恢复,曾经…)?当然,你重启了Metastore服务吗?一个新的。我显式地重新启动了spark shell并删除了现有的表。ambari重新启动了所有受影响的服务。您是否尝试切换
spark.sql.orc.impl
?在2.3和2.4+>>中,默认情况下应为
hive
,另外,您是否检查了新表是否确实创建为“非事务性”表?当您从hive本身创建表时,是否为“事务性”表?如果没有,那么诀窍是将适当的配置单元属性注入Spark上下文中配置单元Metastore客户端使用的配置中。可以通过类路径中的目录中的自定义
hive site.xml
(这就是Hadoop libs搜索配置的方式)或通过自定义
spark.Hadoop.
属性传递给spark,然后自动注入Hadoop道具,覆盖默认配置文件。不过,我更喜欢(Samson Scharfrichter建议)重新配置配置配置单元,使其在默认情况下不放置
事务性属性。
val df:DataFrame = ...
val externalPath = "/warehouse/tablespace/external/hive/my_db.db/my_table"
import com.hortonworks.hwc.HiveWarehouseSession
val hive = HiveWarehouseSession.session(spark).build()
dxx.write.partitionBy("part_col").option("compression", "zlib").mode(SaveMode.Overwrite).orc(externalPath)
val columns = dxx.drop("part_col").schema.fields.map(field => s"${field.name} ${field.dataType.simpleString}").mkString(", ")
val ddl =
      s"""
         |CREATE EXTERNAL TABLE my_db.my_table ($columns)
         |PARTITIONED BY (part_col string)
         |STORED AS ORC 
         |Location '$externalPath'
       """.stripMargin

hive.execute(ddl)
hive.execute(s"MSCK REPAIR TABLE $tablename SYNC PARTITIONS")
java.sql.SQLException: The query did not generate a result set!