Я использую 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 может извлечь из этого значения ключа.
Кто-нибудь может посоветовать, можно ли использовать configParser для чтения файлов из hdfs? Или есть какая-то альтернатива?
read_string не вариант, так как я использую Python 2.7+. Пробовал использовать, как предложено в stackoverflow.com/questions/21766451/… buf = StringIO.StringIO(s_config) config = ConfigParser.ConfigParser() config.readfp(buf) Но это дает ошибку отсутствия раздела!
Не могли бы вы расширить свой вопрос, указав код, который вы использовали, и полное сообщение об ошибке, которое вы получили?
Используя опцию read_string import ConfigParser credstr = sc.textFile("hdfs://clusternamenode:8020/bdc/cre.conf").collect() parse_str=ConfigParser.ConfigParser() parse_str.read_string(credstr) Получена ошибка: AttributeError : экземпляр ConfigParser не имеет атрибута «read_string»
Использование опции буфера файла `import ConfigParser import StringIO credstr = sc.textFile("hdfs://clusternamenode:8020/bdc/cre.conf").collect() buf = StringIO.StringIO(credstr) parse_str = ConfigParser.ConfigParser () parse_str.readfp(buf) parse_str.get('tracker','port') ` Получена ошибка :- поднять NoSectionError(section) ConfigParser.NoSectionError: Нет раздела: 'tracker'
Я скопировал большую часть кода, который вы предоставили в комментариях. Вы были очень близки к разгадке. Ваша проблема заключалась в том, что 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'
Потрясающий ! это работает :) Я нашел довольно плохое решение, взяв элементы списка и подстроку, чтобы получить свое значение ....! Теперь воспользуюсь этим.. спасибо!..
Проблема в том, что ConfigParser не может обрабатывать пути к файлам hdfs. Что вы можете сделать, так это реализовать свой собственный configreader или читать с помощью
bla = sc.textFile("hdfs://clusternamenode:8020/bdc/para.conf").collect()
, который дает вам список строк. Программа чтения конфигурации может обрабатывать строки с read_string.