Попытка получить доступ к 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.