spark本地运行的错误 java.net.URISyntaxException: Relative path in absolute URI:

本文记录了一次使用Apache Spark处理数据时遇到的任务失败问题及其解决过程。主要错误为相对路径出现在绝对URI中,导致任务反复失败。通过调整配置,正确设置输入文件路径解决了此问题。

20/12/03 20:24:03 INFO DAGScheduler: ShuffleMapStage 0 (map at WordCount.scala:24) failed in 2.446 s due to Job aborted due to stage failure: Task 1 in stage 0.0 failed 4 times, most recent failure: Lost task 1.3 in stage 0.0 (TID 5, 192.168.20.167, executor 1): java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: D:%5Ctmp%5Chadoop%5CHamlet.txt
    at org.apache.hadoop.fs.Path.initialize(Path.java:205)
    at org.apache.hadoop.fs.Path.<init>(Path.java:171)
    at org.apache.hadoop.util.StringUtils.stringToPath(StringUtils.java:245)
    at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:411)
    at org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$30.apply(SparkContext.scala:1038)
    at org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$30.apply(SparkContext.scala:1038)
    at org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:171)
    at org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:171)
    at scala.Option.foreach(Option.scala:257)
    at org.apache.spark.rdd.HadoopRDD.getJobConf(HadoopRDD.scala:171)
    at org.apache.spark.rdd.HadoopRDD$$anon$1.<init>(HadoopRDD.scala:207)
    at org.apache.spark.rdd.HadoopRDD.compute(HadoopRDD.scala:203)
    at org.apache.spark.rdd.HadoopRDD.compute(HadoopRDD.scala:94)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)
    at org.apache.spark.scheduler.Task.run(Task.scala:108)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:335)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.URISyntaxException: Relative path in absolute URI: D:%5Ctmp%5Chadoop%5CHamlet.txt
    at java.net.URI.checkPath(URI.java:1823)
    at java.net.URI.<init>(URI.java:745)
    at org.apache.hadoop.fs.Path.initialize(Path.java:202)
    ... 30 more
 

解决办法:

.setJars(List("D:\\code\\Test\\TestSpark\\out\\artifacts\\TestSpark_jar\\TestSpark.jar"))
### Java中 `java.net.URISyntaxException` 异常解决方案 #### 问题分析 当程序抛出 `java.net.URISyntaxException: Relative path in absolute URI` 的异常时,通常表示在解析URI字符串的过程中遇到了非法字符或者逻辑冲突。具体来说,在构建绝对URI时包含了相对路径的部分,这违反了URI的标准定义。 此问题可能由以下几个原因引起: 1. **占位符未被正确替换**:某些配置文件中的变量(如 `${system:java.io.tmpdir}` 或 `${system:user.name}`)未能成功解析为实际值。 2. **驱动加载机制问题**:如果依赖的JAR包路径设置不当,可能导致无法找到资源文件或类。 3. **Hive或其他框架的配置错误**:例如Hive的 `hive-site.xml` 文件中可能存在不合法的临时目录路径配置[^3]。 --- #### 解决方案 ##### 方法一:检查并修正配置文件中的占位符 对于涉及动态占位符的场景(如`${system:...}`),需确保这些占位符能够被正确解析为具体的值。以下是针对不同情况的具体操作: - 如果是在Hive环境中遇到该问题,则可以修改 `hive-site.xml` 配置文件中的相关属性。例如将以下字段中的占位符替换为固定路径[^3]: ```xml <property> <name>hive.exec.local.scratchdir</name> <value>/tmp/hive-${system:user.name}</value> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/tmp/${hive.session.id}_resources</value> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/tmp/operation_logs</value> </property> ``` 将其中的 `${system:user.name}` 和其他类似的占位符替换成固定的用户名或系统参数的实际值。 ##### 方法二:验证外部JAR包的加载方式 如果是由于第三方库(如神通数据库驱动)引起的异常,则需要确认其加载方式是否存在问题。根据引用描述[^2],可以通过以下两种方式进行排查和修复: 1. 使用Maven命令手动安装驱动JAR至本地仓库后再引入; 2. 替换为更兼容版本的驱动JAR包。 此外还可以尝试调整POM文件中对本地JAR的引用方式,如下所示: ```xml <dependency> <groupId>com.example</groupId> <artifactId>shentong-driver</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/shentong.jar</systemPath> </dependency> ``` 注意这里的路径应指向确切存在的位置,并且建议采用绝对路径而非相对路径来减少潜在风险。 ##### 方法三:编码层面规避非法URI构造 无论何种上下文下都可能发生此类异常,因此开发者应在代码层面上做好防护措施。比如创建URI对象之前先打印调试日志查看待处理字符串的内容;另外也可以利用正则表达式过滤掉不符合标准格式的部分。下面给出一段示范性的Java代码用于安全地生成URI实例: ```java public static URI createSafeUri(String uriString) throws URISyntaxException { if (uriString == null || uriString.isEmpty()) { throw new IllegalArgumentException("Invalid input string"); } String sanitizedUri = uriString.replaceAll("%7B", "{").replaceAll("%7D", "}"); // 去除转义字符干扰 try { return new URI(sanitizedUri); } catch (URISyntaxException e) { System.err.println("Failed to parse URI from [" + sanitizedUri + "]"); throw e; } } ``` --- ### 总结 综上所述,要彻底解决 `java.net.URISyntaxException: Relative path in absolute URI` 这一类问题,可以从三个方面入手——即合理配置环境变量、优化外部依赖管理以及加强源码健壮性设计。每一步都需要细致入微的操作才能达到预期效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值