RuntimeError: Невозможно запустить JVM из-за устаревшего: convertStrings - PullRequest
3 голосов
/ 25 июня 2019

Я запускаю автоматизированное задание Python в кластере EMR, который обновляет таблицы Amazon Athena.

Он работал хорошо до нескольких дней назад (на python 2.7 и 3.7).Вот сценарий:

from pyathenajdbc import connect
import yaml

config = yaml.load(open('athena-config.yaml', 'r'))
statements = config['statements']
staging_dir = config['staging_dir']

conn = connect(s3_staging_dir=staging_dir, region_name='eu-west-1')

try:
    with conn.cursor() as cursor:
        for statement in statements:
            cursor.execute(statement)
finally:
    conn.close()

В athena-config.yaml есть промежуточный каталог и несколько операторов Athena.

Вот ошибка:

You are using pip version 9.0.3, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Unrecognized option: -server
create_tables.py:5: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  config = yaml.load(open('athena-config.yaml', 'r'))
/mnt/conda/lib/python3.7/site-packages/jpype/_core.py:210: UserWarning: 
-------------------------------------------------------------------------------
Deprecated: convertStrings was not specified when starting the JVM. The default
behavior in JPype will be False starting in JPype 0.8. The recommended setting
for new code is convertStrings=False.  The legacy value of True was assumed for
this session. If you are a user of an application that reported this warning,
please file a ticket with the developer.
-------------------------------------------------------------------------------

  """)
Traceback (most recent call last):
  File "create_tables.py", line 10, in <module>
    region_name='eu-west-1')
  File "/mnt/conda/lib/python3.7/site-packages/pyathenajdbc/__init__.py", line 69, in connect
    driver_path, log4j_conf, **kwargs)
  File "/mnt/conda/lib/python3.7/site-packages/pyathenajdbc/connection.py", line 68, in __init__
    self._start_jvm(jvm_path, jvm_options, driver_path, log4j_conf)
  File "/mnt/conda/lib/python3.7/site-packages/pyathenajdbc/util.py", line 25, in _wrapper
    return wrapped(*args, **kwargs)
  File "/mnt/conda/lib/python3.7/site-packages/pyathenajdbc/connection.py", line 97, in _start_jvm
    jpype.startJVM(jvm_path, *args)
  File "/mnt/conda/lib/python3.7/site-packages/jpype/_core.py", line 219, in startJVM
    _jpype.startup(jvmpath, tuple(args), ignoreUnrecognized, convertStrings)
RuntimeError: Unable to start JVM
    at loadJVM(native/common/jp_env.cpp:169)
    at loadJVM(native/common/jp_env.cpp:179)
    at startup(native/python/pyjp_module.cpp:159)

AsНасколько я понимаю, проблема в convertStrings устарела.Может кто-нибудь помочь мне решить это?Я не могу понять, почему этот """) предшествует трассировке, и что изменилось в прошлые дни, чтобы сломать код.Спасибо!

Ответы [ 2 ]

4 голосов
/ 25 июня 2019

Сегодня такая же проблема.Попробуйте понизить JPype1 до 0.6.3.JPype1 выпустил сегодня 0.7.0, который не совместим со старыми интерфейсами.

0 голосов
/ 27 июня 2019

Проблема заключается в том, что пакет вызывает JVM с нераспознанным аргументом -server. Предыдущая версия игнорировала ошибки такого рода, позволяя продолжить работу. Чтобы получить то же поведение с 0.7.0, флаг ignoreUnrecognized должен быть установлен на True. Скорее всего, это нужно отправить на pyathenajdbc, чтобы исправить дефект, который поставил фиктивный аргумент в startJVM.

Глядя на источник, -server жестко запрограммирован в модуле.

if not jpype.isJVMStarted():
            _logger.debug('JVM path: %s', jvm_path)
            args = [
                '-server',
                '-Djava.class.path={0}'.format(driver_path),
                '-Dlog4j.configuration=file:{0}'.format(log4j_conf)
            ]
            if jvm_options:
                args.extend(jvm_options)
            _logger.debug('JVM args: %s', args)
            jpype.startJVM(jvm_path, *args)
            cls.class_loader = jpype.java.lang.Thread.currentThread().getContextClassLoader()

Предполагается, что конкретная JVM принимает -server в качестве аргумента.

...