处理MapReduce中的报错Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntax

本文分享了在使用Hadoop MapReduce进行离线代码编写时遇到的路径配置错误及解决方案。作者最初将输入输出路径设置为本地路径,导致程序无法在Hadoop集群上正确运行。通过调整代码,将路径更改为HDFS上的绝对路径,成功解决了问题。

写好MapReduce线下代码后,生成 example-mr-1.2.jar包上传并解压运行,如下:
[root@bigdata01 ~]# hadoop jar example-mr-1.2.jar
Exception in thread “main” java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: D:%5Cinput

认真看了报错后,发现,错误来自MAIN方法中的本地路径无法读取,查看代码后,发现WordCountClient文件中:
FileInputFormat.addInputPath(job, new Path(“D:\input”));
FileOutputFormat.setOutputPath(job, new Path(“D:\output”));
里面的代码被我写到了本地路径,所以hadoop无法读取,于是修改如下:
FileInputFormat.addInputPath(job, new Path("/wordcount/input"));
FileOutputFormat.setOutputPath(job, new Path("/wordcount/output"));
恢复后重新打开maven建包,然后上传输入:
hadoop jar example-mr-1.2.jar;
这次果然成功!

Logging initialized using configuration in jar:file:/opt/modules/hive/lib/hive-common-1.2.2.jar!/hive-log4j.properties Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522) at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677) at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621) 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:483) at org.apache.hadoop.util.RunJar.run(RunJar.java:221) at org.apache.hadoop.util.RunJar.main(RunJar.java:136) Caused by: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D at org.apache.hadoop.fs.Path.initialize(Path.java:205) at org.apache.hadoop.fs.Path.<init>(Path.java:171) at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:563) at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:508) ... 8 more Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D 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) ... 11 more
最新发布
11-20
Exception in thread "main" java.lang.IllegalArgumentException: java.net.UnknownHostException: nodes at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:406) at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:310) at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:176) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:749) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:680) at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:158) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2816) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:98) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2853) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2835) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:387) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296) at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPaths(FileInputFormat.java:507) at cn.edu.abtu.job.WordCountJob.main(WordCountJob.java:31) 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.hadoop.util.RunJar.run(RunJar.java:221) at org.apache.hadoop.util.RunJar.main(RunJar.java:136) Caused by: java.net.UnknownHostException: nodes ... 20 more
04-30
### 解决 `java.lang.ClassNotFoundException: hadoop.mapreduce.WordCountDriver` 的问题 在 Hadoop MapReduce 程序中,当运行时出现 `java.lang.ClassNotFoundException` 时,通常是因为类路径配置不正确或驱动类未被正确加载。以下是解决该问题的详细方法: #### 1. 配置 Hadoop 类路径 确保 Hadoop 的类路径已正确设置。可以通过修改 `$HBase_HOME/etc/hadoop/hadoop-env.sh` 文件来配置 `HADOOP_CLASSPATH`,以包含所有必要的 JAR 文件[^1]。例如: ```bash export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/to/your/jars/* ``` 此外,在运行 MapReduce 任务时,可以使用以下命令动态添加类路径: ```bash hadoop classpath ``` #### 2. 设置 MapReduce 应用程序类路径 如果运行自带的 WordCount 示例时出现 `ClassNotFoundException`,需要在 `mapred-site.xml` 中配置 `mapreduce.application.classpath` 参数,指定执行 MapReduce 时搜索的类路径[^2]。示例配置如下: ```xml <property> <name>mapreduce.application.classpath</name> <value>/path/to/your/jars/*</value> </property> ``` #### 3. 明确指定 JAR 文件 在提交 MapReduce 作业时,确保明确指定了包含驱动类的 JAR 文件。可以通过以下代码设置: ```java configuration.set("mapreduce.job.jar", "path/to/your/mapreduce.jar"); ``` 或者在命令行中指定 JAR 文件: ```bash hadoop jar path/to/your/mapreduce.jar com.example.WordCountDriver input output ``` #### 4. 检查驱动类是否打包 确保驱动类(如 `WordCountDriver`)已正确打包到 JAR 文件中。可以使用以下命令检查 JAR 文件的内容: ```bash jar tf path/to/your/mapreduce.jar ``` 如果未找到驱动类,则需要重新构建项目并确保所有相关类均被打包。 #### 5. 处理 YARN 相关异常 如果日志中还包含 `YarnRuntimeException` 的错误信息,则可能需要检查 YARN 的类路径配置[^4]。确保所有必要的 Hadoop 和 YARN JAR 文件均已正确加载。 #### 6. Spark 集成中的 LZO 支持 如果在 Spark 中处理 LZO 压缩文件时遇到类似问题,可以尝试设置 `SPARK_CLASSPATH` 环境变量[^5]。例如: ```bash export SPARK_CLASSPATH=$SPARK_CLASSPATH:/path/to/hadoop-lzo.jar ``` ### 示例代码 以下是一个完整的 WordCount 示例,包括驱动类和配置: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: WordCountDriver <input path> <output path>"); System.exit(-1); } Configuration conf = new Configuration(); conf.set("mapreduce.job.jar", "path/to/your/mapreduce.jar"); Job job = Job.getInstance(conf, "Word Count"); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值