一、以为服务器内存不足
修改了hadoop的yarn-site.xml
<!-- 表示该节点上YARN可使用的物理内存总量,默认是8192MB -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<!-- 表示该节点服务器上yarn可以使用的虚拟CPU个数,默认是8 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
</property>
<!-- 单个任务可申请的最多物理内存量,默认是8192MB -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
PS:若你运行后没有报错那就最好,若运行后还是报一样的错误,下拉日志再看有什么其他的错误提醒。
二、在SparkSeesion配置中添加如下配置
发现有日志中新错误:
红色部分为错误
- 错误如下:由于 Spark 3.0 的升级,您可能会得到不同的结果:将 1582-10-15 之前的日期或 1900-01-01T00:00:00Z 之前的时间戳写入 Parquet INT96 文件可能很危险,因为这些文件可能会稍后被 Spark 2.x 或旧版本的 Hive 读取,后者使用不同于 Spark 3.0+ 的 Proleptic 公历的旧版混合日历。
-
错误原因:源表中timestamp类型数据出现了1582-10-15之前的数据或1900-01-01之前的数据
绿色部分为解决方式
- 方式如下:可以将 spark.sql.legacy.parquet.int96RebaseModeInWrite 设置为 'LEGACY',以在写入过程中根据日历差异重新设置日期时间值的基数,从而获得最大的互操作性。或者,如果您 100% 确定写入的文件只能由 Spark 3.0+ 或其他使用前公历的系统读取,或者将 spark.sql.legacy.parquet.int96RebaseModeInWrite 设置为 'CORRECTED' 以按原样写入日期时间值。
-
添加配置:
val spark = SparkSession.builder()
.master("local[*]")
.appName("test")
.config("spark.sql.legacy.parquet.int96RebaseModeInWrite", "LEGACY") //添加时间戳处理配置
.config("hive.exec.dynamic.partition.mode", "nonstrict")
.enableHiveSupport()
.getOrCreate()
三、模式'LEGACY'与模式'CORRECTED'的选择以区别
1. LEGACY 模式
- 定义:在该模式下,Spark 使用旧版行为来处理 INT96 格式的日期和时间戳。
- 处理方式:日期和时间戳会基于旧的 Hybrid Calendar 进行处理。这意味着写入的日期和时间戳值会被调整以适应旧版本 Hive 或 Spark 的要求。
- 适用场景:如果你需要与使用较旧版本的 Spark 或 Hive 的系统进行交互,并且希望保持最大程度的兼容性,则应使用此模式。
2. CORRECTED 模式
- 定义:在该模式下,Spark 使用新的 Proleptic Gregorian Calendar 处理日期和时间戳,保持当前行为。
- 处理方式:日期和时间戳将被直接写入 Parquet 文件,不会进行任何调整。此模式假定所有读取文件的系统都是使用 Spark 3.0 或更高版本。
- 适用场景:如果你确定将来不会再与旧版的 Spark 或 Hive 进行交互,且希望获得更准确的日期和时间戳处理,则应使用此模式。
总结
- 选择 LEGACY:兼容旧版本的 Spark 或 Hive,且对日期的准确性要求不高。
- 选择 CORRECTED:若数据只会在 Spark 3.0 及以上版本中使用,且你希望确保日期的准确性。