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