Spark写入Hive报错Mkdir failed on :com.alibaba.jfs.JindoRequestPath

news2024/9/21 20:31:59

1. 报错内容

23/05/31 14:32:13 INFO [Driver] FsStats: cmd=mkdirs, src=oss://sync-to-bi.[马赛克].aliyuncs.com/tmp/hive, dst=null, size=0, parameter=FsPermission:rwx-wx-wx, time-in-ms=32, version=3.5.0
23/05/31 14:32:13 ERROR [Driver] ApplicationMaster: User class threw exception: org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.io.IOException: Mkdir failed on :com.alibaba.jfs.JindoRequestPath@7b61ed9f;
org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.io.IOException: Mkdir failed on :com.alibaba.jfs.JindoRequestPath@7b61ed9f;
        at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:111)
        at org.apache.spark.sql.hive.HiveExternalCatalog.databaseExists(HiveExternalCatalog.scala:223)
        at org.apache.spark.sql.internal.SharedState.externalCatalog$lzycompute(SharedState.scala:138)
        at org.apache.spark.sql.internal.SharedState.externalCatalog(SharedState.scala:122)
        at org.apache.spark.sql.internal.SharedState.globalTempViewManager$lzycompute(SharedState.scala:165)
        at org.apache.spark.sql.internal.SharedState.globalTempViewManager(SharedState.scala:160)
        at org.apache.spark.sql.hive.HiveSessionStateBuilder$$anonfun$2.apply(HiveSessionStateBuilder.scala:55)
        at org.apache.spark.sql.hive.HiveSessionStateBuilder$$anonfun$2.apply(HiveSessionStateBuilder.scala:55)
        at org.apache.spark.sql.catalyst.catalog.SessionCatalog.globalTempViewManager$lzycompute(SessionCatalog.scala:91)
        at org.apache.spark.sql.catalyst.catalog.SessionCatalog.globalTempViewManager(SessionCatalog.scala:91)
        at org.apache.spark.sql.catalyst.catalog.SessionCatalog.isTemporaryTable(SessionCatalog.scala:782)
        at org.apache.spark.sql.internal.CatalogImpl.tableExists(CatalogImpl.scala:260)
        at com.tcl.task.terminalmanage.TerminalManageUtils$.saveDataFrame2Hive(TerminalManageUtils.scala:148)
        at com.tcl.task.terminalmanage.warehouse.ods.Ods_Nps_Stability_Crash_Dropbox$.execute(Ods_Nps_Stability_Crash_Dropbox.scala:47)
        at com.tcl.task.terminalmanage.CommonMain.main(CommonMain.scala:28)
        at com.tcl.task.terminalmanage.warehouse.ods.Ods_Nps_Stability_Crash_Dropbox.main(Ods_Nps_Stability_Crash_Dropbox.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:685)
Caused by: java.lang.RuntimeException: java.io.IOException: Mkdir failed on :com.alibaba.jfs.JindoRequestPath@7b61ed9f
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:606)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:544)
        at org.apache.spark.sql.hive.client.HiveClientImpl.newState(HiveClientImpl.scala:199)
        at org.apache.spark.sql.hive.client.HiveClientImpl.<init>(HiveClientImpl.scala:129)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.apache.spark.sql.hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:284)
        at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:386)
        at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:288)
        at org.apache.spark.sql.hive.HiveExternalCatalog.client$lzycompute(HiveExternalCatalog.scala:67)
        at org.apache.spark.sql.hive.HiveExternalCatalog.client(HiveExternalCatalog.scala:66)
        at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$databaseExists$1.apply$mcZ$sp(HiveExternalCatalog.scala:224)
        at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$databaseExists$1.apply(HiveExternalCatalog.scala:224)
        at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$databaseExists$1.apply(HiveExternalCatalog.scala:224)
        at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:102)
        ... 20 more
Caused by: java.io.IOException: Mkdir failed on :com.alibaba.jfs.JindoRequestPath@7b61ed9f
        at com.alibaba.jfs.OssFileletSystem.mkdir(OssFileletSystem.java:184)
        at com.aliyun.emr.fs.internal.ossnative.OssNativeStore.mkdirs(OssNativeStore.java:521)
        at com.aliyun.emr.fs.oss.JindoOssFileSystem.mkdirsCore(JindoOssFileSystem.java:194)
        at com.aliyun.emr.fs.common.AbstractJindoShimsFileSystem.mkdirs(AbstractJindoShimsFileSystem.java:389)
        at org.apache.hadoop.hive.ql.exec.Utilities.createDirsWithPermission(Utilities.java:3385)
        at org.apache.hadoop.hive.ql.session.SessionState.createRootHDFSDir(SessionState.java:705)
        at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:650)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:582)
        ... 36 more
Caused by: java.io.IOException: ErrorCode : 403 , ErrorMsg: HTTP/1.1 403 Forbidden: <?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>You have no right to access this object because of bucket acl.</Message>
  <RequestId>6[马赛克]5</RequestId>
  <HostId>sync-to-bi.[马赛克].aliyuncs.com</HostId>
  <EC>0003-00000001</EC>
</Error>
 ERROR_CODE : 1010
        at com.alibaba.jboot.JbootFuture.get(JbootFuture.java:145)
        at com.alibaba.jfs.OssFileletSystem.mkdir(OssFileletSystem.java:178)
        ... 43 more

2. 报错程序

package com.tcl.task.terminalmanage.warehouse.ods

import com.tcl.task.terminalmanage.{CommonMain, TerminalManageUtils}
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._


object Ods_Nps_Stability_Crash_Dropbox extends CommonMain {
  val HiveDatabase = "te[马赛克]"
  val HiveTableName = "ods_[马赛克]_di"
  val ck_Table = "ods_[马赛克]_cluster"

  val colNames = Array("[马赛克]", "[马赛克]","[反正就是一些字段名]")

  override def execute(spark: SparkSession, calcDate: String): Unit = {
      spark.sql("set spark.sql.caseSensitive=true")
      val sc = spark.sparkContext
      val logPath = "oss://[马赛克]@sync-to-bi.[马赛克]/" + dateConverYYmm(calcDate) + "*"

      if (!Mutils.isPathExistTest(logPath, sc)) {
        return
      }
      var df = spark.read.json(logPath)

      for (col <- colNames) {
        if (!df.columns.contains(col)) {
          df = df.withColumn(col, lit(""))
        }
      }

    val result = df.withColumn("recordDate",lit(calcDate))
      .select("[马赛克]", "[马赛克]","[反正就是一些字段名]","recordDate")

    TerminalManageUtils.saveDataFrame2Hive(spark,result,HiveDatabase,HiveTableName,calcDate,0)
  }

  //2022-10-15
  def dateConverYYmm(date: String) = {
    val str1 = date.substring(0, 4)
    val str2 = date.substring(5, 7)
    val str3 = date.substring(8, 10)
    str1 + str2 + str3
  }

}

        程序很简单,就是数仓ODS层计算逻辑,直接从阿里云OSS读取数据,补充上一些必要的列,最后数据落盘到hive表。

3. 问题分析

3.1 分析报错内容

        根据下面两段报错提示可以得出:Spark Driver在写入Hive时,试图在oss://sync-to-bi.[马赛克].aliyuncs.com/tmp/hive这个路径下创建目录。但是sync-to-bi这个是数据源桶,只有读权限,没有写权限,自然会AccessDenied。

      

        问题的关键在于:为什么Spark Driver要在写入Hive时,往数据源的/tmp/hive创建目录?

/tmp/hive目录存放的是Hive的临时操作目录比如插入数据,insert into插入Hive表数据的操作,Hive的操作产生的操作临时文件都会存储在这里,或者比如在${HIVE_HOME}/bin下执行,sh hive,进入Hive的命令行模式,都会在这里/tmp/hive目录下产生一个Hive当前用户名字命名的临时文件夹,这个文件夹权限是700,默认是hadoop的启动用户,我的hadoop用户是hadoopadmin,所以名字是hadoopadmin的文件夹  

-- Hive的/tmp/hive以及/user/hive/warehouse目录对Hive的影响 | 码农家园

        如果像上面说的,insert into操作会在tmp/hive产生临时文件。那为什么不是在目标OSS创建临时文件,而是在源数据的OSS创建?我能在代码中指定产生临时文件的位置吗?

3.2 根据猜想进行尝试

        尝试修改默认fs,指向目标OSS,即hive表location所在的OSS

         再次运行代码,竟然真的成功了!但是进一步思考,在父类CommonMain中本就是有默认fs的配置

         那么,为什么父类中的配置没有生效?

3.3 添加日志分析父类fs配置不生效的原因

package com.tcl.task.terminalmanage.warehouse.ods

import com.tcl.task.terminalmanage.{CommonMain, TerminalManageUtils}
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._


object Ods_Nps_Stability_Crash_Dropbox extends CommonMain {
  private val logger = LoggerFactory.getLogger("Luo")
  val HiveDatabase = "te[马赛克]"
  val HiveTableName = "ods_[马赛克]_di"
  val ck_Table = "ods_[马赛克]_cluster"

  val colNames = Array("[马赛克]", "[马赛克]","[反正就是一些字段名]")

  override def execute(spark: SparkSession, calcDate: String): Unit = {
      logger.info("-------1--------" + spark.sparkContext.hadoopConfiguration.get("fs.defaultFS"))
      spark.sql("set spark.sql.caseSensitive=true")
      val sc = spark.sparkContext
      val logPath = "oss://[马赛克]@sync-to-bi.[马赛克]/" + dateConverYYmm(calcDate) + "*"

      logger.info("-------2--------" + spark.sparkContext.hadoopConfiguration.get("fs.defaultFS"))
      if (!Mutils.isPathExistTest(logPath, sc)) {
        return
      }

      logger.info("-------3--------" + spark.sparkContext.hadoopConfiguration.get("fs.defaultFS"))
      var df = spark.read.json(logPath)
      logger.info("-------4--------" + spark.sparkContext.hadoopConfiguration.get("fs.defaultFS"))

      for (col <- colNames) {
        if (!df.columns.contains(col)) {
          df = df.withColumn(col, lit(""))
        }
      }

    val result = df.withColumn("recordDate",lit(calcDate))
      .select("[马赛克]", "[马赛克]","[反正就是一些字段名]","recordDate")

  logger.info("-------5--------" + spark.sparkContext.hadoopConfiguration.get("fs.defaultFS"))
   TerminalManageUtils.saveDataFrame2Hive(spark,result,HiveDatabase,HiveTableName,calcDate,0)
  }

  //2022-10-15
  def dateConverYYmm(date: String) = {
    val str1 = date.substring(0, 4)
    val str2 = date.substring(5, 7)
    val str3 = date.substring(8, 10)
    str1 + str2 + str3
  }

}

        日志结果:

Luo: -------1--------oss://data[马赛克]
Luo: -------2--------oss://data[马赛克]
Luo: -------3--------oss://[马赛克]@sync-to-bi.[马赛克].aliyuncs.com
Luo: -------4--------oss://[马赛克]@sync-to-bi.[马赛克].aliyuncs.com
Luo: -------5--------oss://[马赛克]@sync-to-bi.[马赛克].aliyuncs.com

        谁承想,问题竟然出现在了一个路径是否存在的分支判断。

        由于很明显程序运行不会进入这个if分支,所以它自动被忽略了。分支不会执行,但判断条件一定是会执行的。 而越容易出问题的,往往就是在这种非常容易被忽略的地方。

4. 总结

        如果程序出现了一些“灵异”现象,很有可能,问题出现在你一开始就忽略的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

八大技术架构——升级之路

目录 一、单机架构 简介 工作原理 架构优缺点 相关软件 二、应用数据分离架构 简介 工作原理 架构优缺点 三、应用服务集群架构 简介 出现原因 工作原理 架构优缺点 相关软件 四、读写分离/主从分离架构 简介 工作原理 架构优缺点 相关软件 五、冷热分离架…

JMeter数据库性能测试指南:全面掌握基础操作

1.网络请求时间 2.数据库查询的时间 数据库性能指标 TPS:每秒事务数&#xff08;一秒钟服务器处理的事务数&#xff0c;事务指&#xff0c;请求出去到响应回来的整个过程的时间&#xff09; QPS:每秒查询量&#xff08;就是数据库每秒执行的SQL数量&#xff0c;包含insert/…

239:设置extent:bbox,限制瓦片图的加载范围,不加载空白瓦片

第239个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载geoserver发布的数据,这里主要介绍extent,设置bbox附加载layer上,目的是bbox在可视范围内才加载瓦片,否则不加载,好处是不用加载空白的瓦片数据。 直接复制下面的 vue+openlayers源代码,操作…

Odoo 16的docker部署以及vscode环境配置

之前一直使用Odoo源码配置开发环境&#xff0c;安装的步骤比较多&#xff0c;费时。趁着升级到16版本的机会&#xff0c;尝试使用docker快速配置Odoo的VSCode开发环境。 1 系统环境 &#xff08;1&#xff09;操作系统&#xff1a;ubuntu 20.04 Alternative downloads | Ubu…

Eclipse 教程 完结中

Eclipse 快捷键 关于快捷键 Eclipse 的很多操作都提供了快捷键功能&#xff0c;我们可以通过键盘就能很好的控制 Eclipse 各个功能&#xff1a; 使用快捷键关联菜单或菜单项使用快捷键关联对话窗口或视图或编辑器使用快捷键关联工具条上的功能按钮 Eclipse 快捷键列表可通过…

可节省60% MCU开发成本的NV080D-S8,单片机语音芯片在恒温碗上的应用

社会在不断进步&#xff0c;科技在不断发展&#xff0c;如今的恒温碗不仅带有温度显示功能&#xff0c;更附带有语音播报&#xff0c;能更好地知晓当前饭菜&#xff0c;变凉或过烫的情况&#xff0c;有效避免伤害宝宝脆弱的肠胃&#xff1b; 广州九芯电子推出了一款&#xff0c…

dynamic-datasource动态数据源学习

学习链接 spring整合mybatis的核心思路 & 数据源动态切换 & 多数据源事务控制 - 自己的链接&#xff08;本篇文章的上篇&#xff09; Mybatisplus生成代码配置 & p6spy打印sql & mybatis日志打印 & mybatisplus用法 dynamic-datasource-spring-boot-sta…

LabVIEWCompactRIO 开发指南第六章44 同步模块

同步模块 某些应用&#xff08;如振动或声音测量&#xff09;需要通道之间的高电平&#xff08;低于100nS&#xff09;同步。本节讨论基于增量Σ的模块和扫描&#xff08;SAR&#xff09;模块的时序和同步。任何未被归类为三角积分的NIC系列I/O模块都被归类为SAR。 同步增量西…

ThreadLocal源码

介绍 ThreadLocal是一个线程的本地变量&#xff0c;也就意味着这个变量是线程独有的&#xff0c;是不能与其他线程共享的。这样就可以避免资源竞争带来的多线程的问题。 但是&#xff0c;这种解决多线程安全问题的方式和加锁方式&#xff08;synchronized、Lock) 是有本质的区…

过来人建议:强烈安利本科生都去学Java编程!现在转行还不晚!

为什么标题这么说呢&#xff0c;因为Java的工资香啊&#xff0c;刚入门的小白就有 1w&#xff0c;转正后更多&#xff0c;而且越老越吃香&#xff01; 我们学一门技术在身&#xff0c;走到哪里都不怕&#xff0c;java是技术岗&#xff0c;不带销售性质&#xff0c;加班要分公司…

unity与oculus quest开发设置流程

目录 预准备quest项目的构建PC运行参考文章 版本&#xff1a; unity&#xff1a;2021 adb&#xff08;保证用USB连接PC和头显的时候能允许调试和数据访问&#xff09; macOS 当USB连接之后&#xff0c;需要带上头显将是否允许数据调试和访问的对话框选择允许。 文件中assets放…

2.6 Hello World 及简单语法规则

2.6 Hello World 及简单语法规则 新建文件夹&#xff0c;用于存放代码 新建一个Java文件 早期我们只是会建立txt文本文件&#xff0c;或者word&#xff0c;Java文件的后缀名是.java 新建Hello.java文件 // 输入Java代码public class Hello{public static void main(String[…

Vue3 小兔鲜:Pinia入门

Vue3 小兔鲜&#xff1a;Pinia入门 Date: May 11, 2023 Sum: Pinia概念、实现counter、getters、异步action、storeToRefs保持响应式解构 什么是Pinia Pinia 是 Vue 的专属状态管理库&#xff0c;可以实现跨组件或页面共享状态&#xff0c;是 vuex 状态管理工具的替代品&…

PHP7 连接数据库 MySQL8.0 报错 Call to undefined function mysqli_connect() 的解决方法

前提 如题所示使用的是PHP7的版本&#xff0c;连接MYSQL8.0数据库遇到的问题&#xff0c;提供我个人的解决办法。 我的报错是&#xff1a;Call to undefined function mysqli_connect() 首先明确 保证PHP与MySQL可以正常使用 访问localhost:80【或者你设置的端口号】是有页面…

shell编程之SNAT与DNAT的应用

SNAT与DNAT的应用 一、SNAT的介绍1.SNAT概述2.SNAT源地址转换过程二、SNAT转换 三、DNAT的介绍1.DNAT概述2.DNAT转换前提条件 四、DNAT的转换五、防火墙规则的备份和还原六、tcpdump抓包工具的运用 一、SNAT的介绍 SNAT&#xff08;SNAT&#xff09;一般指源地址转换 1.SNAT概…

VMware安装Centos7图形化GUI系统全过程

1、打开vmware&#xff0c;点击文件然后新建虚拟机 2、然后自定义直接下一步 3、下一步 4、这里我们稍后安装操作系统&#xff0c;继续下一步 5、随后选择Centos7 64位&#xff0c;继续下一步 6、选择你所需要安装的虚拟机存放的位置&#xff0c;虚拟机名字看自己来设置&#x…

docker-安装minio集群

目录 1.服务器列表 2.NTP时间同步 1.服务端 minio_01配置 2.客户端配置-minio_02、minio_03、minio_04配置 3.Minio集群 1.在对应的主机执行对应的语句 2.创建文件夹 3.创建容器 4.访问 5.查看集群 4.nginx代理集群192.168.1.3 1.nginx安装 2.访问代理 1.服务器列…

[web]关于过滤器Filter

前言 为了避免在没有登录的情况下也可以通过路径访问到所有页面&#xff0c; 如果在每一个需要请求的资源里面都通过Session去判断有没有登录的用户对象就需要书写大量的判断代码&#xff0c;此时就可以用到Filter过滤器 作用 让请求的某些资源在之前或之后经过过滤器&#xff…

uni-app路由配置使用和页面跳转传参

uni-app路由配置使用和页面跳转传参 uni-app路由配置使用和页面跳转传参 文章目录 uni-app路由配置使用和页面跳转传参前言一、组件式路由跳转传参二、函数式路由跳转传参总结 前言 UNI-APP学习系列之路由配置使用和页面跳转传参 一、组件式路由跳转传参 组件式路由跳转 示例…

Java设计模式(一)

系列文章目录 单一职责原则 接口隔离原则 依赖倒转原则 文章目录 系列文章目录前言一、单一职责原则1.单一职责原则注意事项和细节 二、接口隔离原则1.接口隔离原则基本介绍(Interface Segregation Principle)2.应传统方法的问题和使用接口隔离原则改进 三、依赖倒转原则1.依赖…