Ошибка при загрузке пользовательского файла синонимов в Elasticsearch

Я использую Rails, Tire и Elasticsearch на одном сервере EC2, без сегментирования или репликации (это Jenkins CI Server). С пользовательским инициализатором как таковым:

analysis:
  filter:        
    name_synonyms:
      type: synonym
      synonyms_path: <%= Rails.root.join("config", "synonyms", "name_synonyms.txt") %>

Этот файл проходит через Erubis, и путь синонимов преобразуется примерно так:

/root/workspace/project-project-0f317744a1870b4baf61bbaeb390ebe1/config/synonyms/term_synonyms.txt

Когда я перечисляю файлы на сервере, я вижу следующее:

root@ip-XX-XXX-XX-XXX:~/workspace/project-project-0f317744a1870b4baf61bbaeb390ebe1/config/synonyms# ls -la
total 20
drwxr-xr-x 2 root root 4096 Feb 11 18:25 .
drwxr-xr-x 7 root root 4096 Feb 11 18:25 ..
-rw-r--r-- 1 root root 3117 Feb 11 18:25 location_synonyms.txt
-rw-r--r-- 1 root root 3999 Feb 11 18:25 name_synonyms.txt
-rw-r--r-- 1 root root 2144 Feb 11 18:25 term_synonyms.txt

Это именно то, что я ожидаю, однако я вижу следующую ошибку при запуске rake spec

500 : {"error":"IndexCreationException[[test_facilities] failed to create index]; nested: FailedToResolveConfigException[Failed to resolve config path [/root/workspace/project-project-0f317744a1870b4baf61bbaeb390ebe1/config/synonyms/term_synonyms.txt], tried file path [/root/workspace/project-project-0f317744a1870b4baf61bbaeb390ebe1/config/synonyms/term_synonyms.txt], path file [/etc/elasticsearch/root/workspace/project-project-0f317744a1870b4baf61bbaeb390ebe1/config/synonyms/term_synonyms.txt], and classpath]; ","status":500}

Мне кажется, что Elasticsearch не может загружать файлы, хотя путь правильный, может быть проблема с порядком загрузки, я действительно не слишком уверен.


person brupm    schedule 11.02.2013    source источник
comment
Сколько узлов у вас в кластере? Этот файл существует на всех узлах?   -  person imotov    schedule 11.02.2013
comment
Это один экземпляр EC2. Это экземпляр CI, на котором работает Jenkins. Так что технически он должен знать только о себе. @имотов   -  person brupm    schedule 11.02.2013
comment
Оказывается, это связано с правами на чтение/выполнение файлов и родительских папок.   -  person brupm    schedule 08.05.2014
comment
Просто была такая же проблема, chmod o+x $HOME сделал свое дело. Режим по умолчанию для домашних папок — 0700, что не позволяет пользователю elasticsearch войти в вашу домашнюю папку для чтения файла конфигурации.   -  person Rodrigo Kochenburger    schedule 08.05.2014


Ответы (2)


Вы должны посмотреть файлы журналов elasticsearch. В моем случае /var/log/elasticsearch/elasticsearch.log

В моем случае у меня было так:

    [2016-02-26 10:28:26,321][WARN ][cluster.action.shard     ] [Batragon] [myindex-1][2] received shard failed for [myindex-1][2], node[mynode], [P], v[1223], s[INITIALIZING], a[id=myid], unassigned_info[[reason=ALLOCATION_FAILED], at[2016-02-26T09:28:26.168Z], details[failed to create index, failure IndexCreationException[failed to create index]; nested: AccessControlException[access denied ("java.io.FilePermission" "/home/myuser/elasticsearch/my_synonyms.txt" "read")]; ]], indexUUID [haZBzLsuSmmxteIq-1K0vw], message [failed to create index], failure [IndexCreationException[failed to create index]; nested: AccessControlException[access denied ("java.io.FilePermission" "/home/myuser/elasticsearch/my_synonyms.txt" "read")]; ]
[myindex-1] IndexCreationException[failed to create index]; nested: AccessControlException[access denied ("java.io.FilePermission" "/home/myuser/elasticsearch/my_synonyms.txt" "read")];
  at org.elasticsearch.indices.IndicesService.createIndex(IndicesService.java:360)
  at org.elasticsearch.indices.cluster.IndicesClusterStateService.applyNewIndices(IndicesClusterStateService.java:307)
  at org.elasticsearch.indices.cluster.IndicesClusterStateService.clusterChanged(IndicesClusterStateService.java:176)
  at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:494)
  at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231)
  at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  at java.lang.Thread.run(Thread.java:745)
  Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "/home/myuser/elasticsearch/my_synonyms.txt" "read")
  ...

Я решил это, предоставив права на чтение файлу java.policy (в моем случае /usr/lib/jvm/java-7-oracle/jre/lib/security/java.policy):

grant {
    permission java.io.FilePermission "/home/myuser/elasticsearch/my_synonyms.txt", "read";
};

и перезапустить службу elasticsearch.

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

    grant {
    permission java.io.FilePermission "/home/myuser/current/config/elasticsearch/-", "read";
    permission java.io.FilePermission "/home/myuser/current/config/elasticsearch/", "read";
};

Также необходимы разрешения на выполнение на всем пути до файла. В моем случае: current и current/config

person jogaco    schedule 26.02.2016

Путь к файлу включен в сопоставления индекса ES. Ожидается, что сам файл будет находиться на сервере ES при создании индекса, но вы определили путь к этому файлу относительно вашего приложения Rails.

person Mike Herold    schedule 09.02.2016