По умолчанию Hive (Context) использует встроенное Derby как метастор. Он предназначен в основном для тестирования и поддерживает только одного активного пользователя. Если вы хотите поддерживать несколько запущенных приложений, вы должны настроить автономный метастар. В данный момент Hive поддерживает PostgreSQL, MySQL, Oracle и MySQL. Сведения о конфигурации зависят от бэкэнд и опции (локальный / удаленный), но в общем случае вам понадобится:
Cloudera предоставляет исчерпывающее руководство, которое может оказаться полезным: Настройка Hive Metastore .
Теоретически также возможно создать отдельные метастабильные Derby с надлежащей конфигурацией (см. Руководство администратора Hive - локальная / встроенная база данных метастор ) или использовать Derby в режиме сервера .
Для разработки вы можете запускать приложения в разных рабочих каталогах. Это создаст отдельный metastore_db
для каждого приложения и позволит избежать проблемы с несколькими активными пользователями. Предоставление отдельной конфигурации Hive также должно работать, но менее полезно в разработке:
Когда этот параметр не настроен с помощью hive-site.xml, контекст автоматически создает metastore_db в текущем каталоге
Метод «retreive» объекта URL Opener поддерживает reporthook и создает исключение для 404.
http://docs.python.org/library/urllib.html#url-opener-objects
Посмотрите полный код 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)
Вы должны использовать:
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)
Изменить: Обоснование здесь состоит в том, что если вы не ожидаете исключительного состояния, это исключение, которое может произойти, и вы, вероятно, даже не думали об этом - поэтому вместо этого Чтобы ваш код продолжал выполняться, пока он был неудачным, поведение по умолчанию - вполне разумно - препятствовать его выполнению.