Как зафиксировать 404 ошибки в urllib.urlretrieve

По умолчанию Hive (Context) использует встроенное Derby как метастор. Он предназначен в основном для тестирования и поддерживает только одного активного пользователя. Если вы хотите поддерживать несколько запущенных приложений, вы должны настроить автономный метастар. В данный момент Hive поддерживает PostgreSQL, MySQL, Oracle и MySQL. Сведения о конфигурации зависят от бэкэнд и опции (локальный / удаленный), но в общем случае вам понадобится:

  • работающий сервер RDBMS
  • база данных метасторе, созданная с использованием предоставил скрипты
  • правильную конфигурацию Hive

Cloudera предоставляет исчерпывающее руководство, которое может оказаться полезным: Настройка Hive Metastore .

Теоретически также возможно создать отдельные метастабильные Derby с надлежащей конфигурацией (см. Руководство администратора Hive - локальная / встроенная база данных метастор ) или использовать Derby в режиме сервера .

Для разработки вы можете запускать приложения в разных рабочих каталогах. Это создаст отдельный metastore_db для каждого приложения и позволит избежать проблемы с несколькими активными пользователями. Предоставление отдельной конфигурации Hive также должно работать, но менее полезно в разработке:

Когда этот параметр не настроен с помощью hive-site.xml, контекст автоматически создает metastore_db в текущем каталоге

28
задан Sridhar Ratnakumar 20 August 2009 в 20:14
поделиться

3 ответа

Метод «retreive» объекта URL Opener поддерживает reporthook и создает исключение для 404.

http://docs.python.org/library/urllib.html#url-opener-objects

2
ответ дан Mark 14 October 2019 в 11:18
поделиться

Посмотрите полный код urllib.urlretrieve :

def urlretrieve(url, filename=None, reporthook=None, data=None):
  global _urlopener
  if not _urlopener:
    _urlopener = FancyURLopener()
  return _urlopener.retrieve(url, filename, reporthook, data)

Другими словами, вы можете использовать urllib.FancyURLopener (это часть общедоступный urllib API). Вы можете переопределить http_error_default для обнаружения ошибок 404:

class MyURLopener(urllib.FancyURLopener):
  def http_error_default(self, url, fp, errcode, errmsg, headers):
    # handle errors the way you'd like to

fn, h = MyURLopener().retrieve(url, reporthook=my_report_hook)
28
ответ дан 28 November 2019 в 03:24
поделиться

Вы должны использовать:

import urllib2

try:
    resp = urllib2.urlopen("http://www.google.com/this-gives-a-404/")
except urllib2.URLError, e:
    if not hasattr(e, "code"):
        raise
    resp = e

print "Gave", resp.code, resp.msg
print "=" * 80
print resp.read(80)

Изменить: Обоснование здесь состоит в том, что если вы не ожидаете исключительного состояния, это исключение, которое может произойти, и вы, вероятно, даже не думали об этом - поэтому вместо этого Чтобы ваш код продолжал выполняться, пока он был неудачным, поведение по умолчанию - вполне разумно - препятствовать его выполнению.

14
ответ дан 28 November 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: