一、以为服务器内存不敷
修改了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设置中添加如下设置
发现有日志中新错误:
Caused by: org.apache.spark.SparkUpgradeException: You may get a different result due to the upgrading of Spark 3.0: writing dates before 1582-10-15 or timestamps before 1900-01-01T00:00:00Z into Parquet INT96 files can be dangerous, as the files may be read by Spark 2.x or legacy versions of Hive later, which uses a legacy hybrid calendar that is different from Spark 3.0+'s Proleptic Gregorian calendar. See more details in SPARK-31404. You can set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'LEGACY' to rebase the datetime values w.r.t. the calendar difference during writing, to get maximum interoperability. Or set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'CORRECTED' to write the datetime values as it is, if you are 100% sure that the written files will only be read by Spark 3.0+ or other systems that use Proleptic Gregorian calendar.
赤色部分为错误
- 错误如下:由于 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 及以上版本中使用,且你盼望确保日期的准确性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |