我正在使用ConfigParser来读取传递给我的pyspark程序的键值。当我从Hadoop集群的边缘节点执行时,代码工作正常,配置文件在边缘节点的本地目录中。如果配置文件上传到 hdfs 路径并且我尝试使用解析器访问相同的路径,则不会这样做。
配置文件 para.conf 包含以下内容
[tracker]
port=9801
在本地客户端模式下,在本地目录中使用 para.conf,以访问我正在使用的值。
from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
parser.read("para.conf")
myport = parser.get('tracker', 'port')
以上工作正常...
在 Hadoop 集群上: 已将 para.conf 文件上传到 hdfs 目录路径 bdc/para.conf
parser.read("hdfs://clusternamenode:8020/bdc/para.conf")
这不会返回任何薄值,下面的转义也不会返回。
parser.read("hdfs:///clusternamenode:8020//bdc//para.conf")
虽然使用 sqlCOntext,但我可以读取返回有效 rdd 的文件。
sc.textFile("hdfs://clusternamenode:8020/bdc/para.conf")
虽然我不确定使用 configParser 是否可以从中提取键值。
任何人都可以建议配置解析器是否可用于从hdfs读取文件吗?还是有其他选择?
我已经复制了您在注释中提供的大部分代码。你真的很接近解决方案。您的问题是sc.textFile在rdd中为每个换行符生成一行。当你调用 .collect() 时,你会得到文档每一行的字符串列表。StringIO 不需要列表,而是需要字符串,因此您必须从列表中恢复以前的文档结构。请参阅下面的工作示例:
import ConfigParser
import StringIO
credstr = sc.textFile("hdfs://clusternamenode:8020/bdc/cre.conf").collect()
buf = StringIO.StringIO("n".join(credstr))
parse_str = ConfigParser.ConfigParser()
parse_str.readfp(buf)
parse_str.get('tracker','port')
输出:
'9801'