解决使用Pyspark进行读取HDFS上的文件时的报错

1. 先说一下我遇到的问题

  • 在学习Spark过程中,需求,将HDFS上的文件使用pyspark进行读取下来,转化为RDD过程中,出现了问题。

下面放上 python代码

from pyspark import SparkContext
sc = SparkContext()
# 将hdfs上的数据转化为rdd
rdd = sc.textFile('hdfs:///data/data.txt')
res = rdd.collect()
print(res)
  • 我的HDFS上的数据,当然此时的Hadoop集群肯定是开着的在这里插入图片描述

2. 报错信息

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: java.io.IOException: Incomplete HDFS URI, no host: hdfs:/data/data.txt
	at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:170)
	at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3303)
	at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:124)
	at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3352)
	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3320)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:479)
	at org.apache.hadoop.fs.Path.getFileSystem(Path.java:361)
	at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:268)
	at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:239)
	at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:325)
	at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:205)
	at org.apache.spark.rdd.RDD.$anonfun$partitions$2(RDD.scala:300)
	at scala.Option.getOrElse(Option.scala:189)
	at org.apache.spark.rdd.RDD.partitions(RDD.scala:296)
	at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49)
	at org.apache.spark.rdd.RDD.$anonfun$partitions$2(RDD.scala:300)
	at scala.Option.getOrElse(Option.scala:189)
	at org.apache.spark.rdd.RDD.partitions(RDD.scala:296)
	at org.apache.spark.SparkContext.runJob(SparkContext.scala:2261)
	at org.apache.spark.rdd.RDD.$anonfun$collect$1(RDD.scala:1030)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
	at org.apache.spark.rdd.RDD.withScope(RDD.scala:414)
	at org.apache.spark.rdd.RDD.collect(RDD.scala:1029)
	at org.apache.spark.api.python.PythonRDD$.collectAndServe(PythonRDD.scala:180)
	at org.apache.spark.api.python.PythonRDD.collectAndServe(PythonRDD.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 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
	at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
	at py4j.Gateway.invoke(Gateway.java:282)
	at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
	at py4j.commands.CallCommand.execute(CallCommand.java:79)
	at py4j.GatewayConnection.run(GatewayConnection.java:238)
	at java.lang.Thread.run(Thread.java:750)


进程已结束,退出代码为 1

3. 问题原因和解决方案

  • 出现报错之后,我首先看了一下报错信息(虽然我的英语不是很好,甚至于可以用令人头大来形容),我注意到有一个关键的语句
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: java.io.IOException: Incomplete HDFS URI, no host: hdfs:/data/data.txt

在这里插入图片描述如图所示,大概意思就是URL不完整,然后看了一下短短几行的代码,有关URL的地方就一个,就是写HDFS上文件的路径,老师也是这样写的啊,不应该错误啊?
正当我疑惑不解的时候,上网搜了一大堆资料,发现网上说的要么驴头不对马嘴,要么就是抄来抄去,根本解决不了问题,没有办法,只能从报错信息入手。

报错信息提示我URL不对,我就报着试试的心态,将HDFS上文件的路径加上了主机名和端口号。终于问题解决

附上解决之后的python代码

from pyspark import SparkContext
sc = SparkContext()
# 将hdfs上的数据转化为rdd  : 注意需要保证端口
rdd = sc.textFile('hdfs://node1:8020/data/data.txt')
res = rdd.collect()
print(res)

结果完美解决。
注意解决的关键之处在于:
rdd = sc.textFile(‘hdfs://node1:8020/data/data.txt’)

4.总结与反思

  1. 求人不如求己。无论学习还是生活,在遇到Bug和问题的时候,我们总是习惯的去寻找帮助,却少有静下心来,自己尝试去解决。比如,我写代码遇到问题总是第一时间百度,却少有去分析报错原因,只想着赶紧解决这个Bug。但今天来看,网上的文章几乎抄来抄去(当然高质量的文章仍然不少),不如自己去认真反思一下Bug或者问题的原因来一步步的去思考,去尝试,最终解决。独立解决问题的能力十分重要!
  2. 学习不能一味一知半解。有时候,你可能会觉得你在课堂上或书本上学到的知识无法应用到实际项目中。这可能是因为实际项目需要考虑更多的因素,如用户界面设计、数据持久化、网络通信等。为了解决这个问题,你可以尝试找一些实际的项目来实践,或者参加一些实际的开发团队,这样可以帮助你将所学知识应用到实际中。
  3. 永远保持虚心。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zh_19995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值