Не удалось загрузить накопительное ограничение, ошибка UnsatisfiableConstraint

Я пытался работать над пользовательским ограничением в Accumulo. Я создал ограничение, внедрив org.apache.accumulo.core.constraints.Constraint .

Но при применении его к таблице я получаю следующую ошибку

Ошибки ограничения: ConstraintViolationSummary (constrainClass: org.apache.accumulo.tserver.constraints.UnsatisfiableConstraint, violationCode: -1, ViolationDescription: не удалось загрузить ограничения, не принимая мутации., numberOfViolatingMutations: 1)

ниже мой фрагмент кода

 package samplepackageforconstraints;

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;

    import org.apache.accumulo.core.constraints.Constraint;
    import org.apache.accumulo.core.data.ColumnUpdate;
    import org.apache.accumulo.core.data.Mutation;

public class LengthConstraintsTest implements Constraint{

    private static final short NOT_ENOUGH_LENGTH = 1;

    @Override
    public List<Short> check(Environment env, Mutation mutation) {
        List<Short> violations = null;
        Collection<ColumnUpdate> updates = mutation.getUpdates();

        for (ColumnUpdate columnUpdate : updates) {

            if (!isLessThanThree(columnUpdate.getValue()))
                violations = addViolation(violations, NOT_ENOUGH_LENGTH);

        }
        return violations;
    }

    @Override
    public String getViolationDescription(short violationCode) {
         switch (violationCode) {
          case NOT_ENOUGH_LENGTH:
            return "Value should be more than 3 character";
        }
        return null;
    }

    private List<Short> addViolation(List<Short> violations, short violation) {
        if (violations == null) {

            violations = new ArrayList<Short>();
            violations.add(violation);
        } else if (!violations.contains(violation)) {

            violations.add(violation);
        }
        return violations;
    }

    private boolean isLessThanThree(byte[] value) {
        if(value.length <3)
        return false;
        else
            return true;
    }
}

Я выполнил шаги, указанные в руководстве пользователя accumulo версии 1.7, а также cloudera для загрузки ограничения

Я использую версию: 1.6.0-cdh5.1.4 accumulo

Заранее спасибо :)


person Supriti    schedule 20.07.2015    source источник


Ответы (1)


Когда ограничение не может быть загружено, это означает, что возникла проблема с загрузкой класса из пути к классам (обычно) или (что менее вероятно) класс не соответствует интерфейсу Constraint.

Вам нужно добавить банку, содержащую ваше пользовательское ограничение, в путь к классам каждого планшетного сервера.

Вы можете дополнительно отладить это, проверив журналы tserver на узле, вызвавшем это исключение.

person Christopher    schedule 22.07.2015
comment
Спасибо, Кристофер :) Есть ли способ зарегистрировать мутацию, которая не соответствует ограничениям? - person Supriti; 23.07.2015
comment
@Supriti В настоящее время это не регистрируется, потому что нет разумного способа идентифицировать мутацию, кроме как по ее содержимому ... которое может быть большим, не уникальным, загрязнять журналы сервера пользовательскими данными и, в целом, не очень бесполезно . Лучший способ определить мутацию, вызвавшую проблему, — это в клиенте повторить все мутации, одну за другой, с момента последней успешной очистки. Вышеупомянутая ошибка была общей ошибкой, связанной с загрузкой ограничений, и могла произойти с любой/каждой отправленной мутацией. - person Christopher; 24.07.2015
comment
Теоретически ваша мутация может регистрировать более конкретные сведения о проблемах в мутациях, которые она проверяет, прежде чем она вернется из своего метода check, но это не требуется в интерфейсе, и это будет полностью поведение для каждого ограничения. - person Christopher; 24.07.2015
comment
Ok . Я буду помнить об этом и попытаюсь реализовать некоторую логику на стороне клиента. Спасибо еще раз. это очень помогает - person Supriti; 27.07.2015