Попытка получить доступ к HBase Java API с помощью JRuby on Rails/ Тринидад

Я пытаюсь использовать HBase Java API с Trinidad в приложении Rails 3.2. Все работает нормально, когда я помещаю все файлы jar в Rails.root / lib / jars, который является предпочтительной *.jar-папкой Тринидада.

Когда я пытаюсь отделить jar-файлы от проекта через файл инициализатора java.rb (в config / initializer), он не будет работать правильно. (С WebBrick все работает гладко, но мы не можем использовать его в производстве.)

java.rb:

require 'java'

Dir['/var/apps/jars/*.jar'].each do |jar|
  require jar
end

Тринидад запускается без проблем, но как только запрос попадает в контроллер, использующий класс HBaseConfiguration, выдается следующая ошибка:

Java::JavaLang::RuntimeException (hbase-default.xml file seems to be for and old version of HBase (null), this version is 0.90.6-cdh3u4):

Кажется, что hbase-default.xml входит в файл hbase-0.90.6-cdh3u4.jar, но не может быть найден классом HBaseConfiguration.

У вас есть идеи, как это исправить?

1 ответ

Решение

Это, вероятно, не будет "правильным" ответом, но вы можете настроить путь к банкам Тринидада, чтобы он указывал на /var/apps/jars для вашего приложения (с помощью командной строки или с конфигурацией trinidad.yml)

чем настроить инициализатор таким образом, чтобы при запуске на веб-сервере Java он не загружал файлы jar (Webrick - это веб-сервер ruby, который работает нормально с JRuby, как он написан на чистом Ruby), например:

Dir['/var/apps/jars/*.jar'].each do |jar|
  require jar
end unless defined?($servlet_context)

Что касается проблемы, с которой вы столкнулись, то, скорее всего, она специфична для hbase.jar и / или hadoop.jar (загрузчики классов будут выглядеть по-разному в простом приложении jruby и в приложении сервлета jruby), трудно сказать без некоторой дополнительной информации, такой как трассировка стека, версии jar и, что самое важное, некоторое понимание конфигурации / загрузки ресурсов hadoop.

Другие вопросы по тегам