Эмулятор Bigtable. Не найти подходящий конструктор

#java #gcloud #bigtable

#java #gcloud #bigtable

Вопрос:

Недавно я пытаюсь разработать что-то, используя эмулятор Bigtable с java (Spring Boot) в IntelliJ IDEA tool.

Что я сделал:

  1. Эмулятор Bigtable хорошо работает на моем компьютере (macOS 10.15.6). введите описание изображения здесь

  2. «cbt» нормально работает с эмулятором Bigtable, работающим на моем Mac, как что-то вроде этого.

введите описание изображения здесь
Я проверил, что для запуска эмулятора Bigtable не требуются реальные учетные данные gcloud.

  1. Я пишу модульный тест на IEDA, как это работает нормально. Я добавил переменную среды в настройку, подобную этой:

введите описание изображения здесь Мой модульный тестовый код:

I. Подключите инициализацию:

 Configuration conf;
Connection connection = null;
conf = BigtableConfiguration.configure("fake-project", "fake-instance");

String host = "localhost";
String port = "8086";

  

II. Постоянные данные будут записываться в таблицу.

 final byte[] TABLE_NAME = Bytes.toBytes("Hello-Bigtable");
final byte[] COLUMN_FAMILY_NAME = Bytes.toBytes("cf1");
final byte[] COLUMN_NAME = Bytes.toBytes("greeting");

final String[] GREETINGS = {
        "Hello World!", "Hello Cloud Bigtable!", "Hello!!"
};

  


III. Подключение: (Дублируется на I.Подключите инициализацию.)

 Configuration conf;
Connection connection = null;
conf = BigtableConfiguration.configure("fake-project", "fake-instance");
String host = "localhost";
String port = "8086";
  

III. Подключение: (Отредактировано)

 if(!Strings.isNullOrEmpty(host)){
    conf.set(BigtableOptionsFactory.BIGTABLE_HOST_KEY, host);
    conf.set(BigtableOptionsFactory.BIGTABLE_PORT_KEY,port);
    conf.set(BigtableOptionsFactory.BIGTABLE_USE_PLAINTEXT_NEGOTIATION, "true");
}
connection = BigtableConfiguration.connect(conf);

  

IV. Запись и чтение данных:

 
Admin admin = connection.getAdmin();
Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
if(!admin.tableExists(TableName.valueOf(TABLE_NAME))){
    HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
    descriptor.addFamily(new HColumnDescriptor(COLUMN_FAMILY_NAME));
    System.out.print("Create table "   descriptor.getNameAsString());
    admin.createTable(descriptor);
}
for (int i = 0; i < GREETINGS.length; i  ) {
    String rowKey = "greeting"   i;

    Put put = new Put(Bytes.toBytes(rowKey));
    put.addColumn(COLUMN_FAMILY_NAME, COLUMN_NAME, Bytes.toBytes(GREETINGS[i]));
    table.put(put);
}
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
for (Result row : scanner) {
    byte[] valueBytes = row.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME);
    System.out.println('t'   Bytes.toString(valueBytes));
}

  

V. Вывод

     Hello World!
    Hello Cloud Bigtable!
    Hello!!
  

Проблема возникла после того, как я получил этот код в свой проект.
Когда я использую ‘debug’ введите описание изображения здесьдля запуска кода.

Я получаю что-то подобное, когда он пытается подключить bigtable: введите описание изображения здеськажется, что он не может создать новый экземпляр на основе конфигурации, которую я создаю.

В конце концов, он показывает мне ошибку типа

 Could not find an appropriate constructor for com.google.cloud.bigtable.hbase1_x.BigtableConnection
  

PS Я попытался использовать команду, запускающую IntelliJ IDEA. Причина, по которой я это делаю, заключается в том, что мне не хватает переменной среды при использовании модульного теста.
В моем .zshrc:

введите описание изображения здесь

Мой инструмент CMD — это iTerm2 с oh-myzsh.

Что угодно — это помощь!!!!

Большое спасибо.

Ответ №1:

Кажется, вам не хватает конструктора для BigtableConnection: BigtableConnection(org.apache.hadoop.conf.Configuration conf)

Я бы посоветовал вам попытаться создать Connection объект, выполнив шаги, упомянутые в документации Google

 private static Connection connection = null;
   
public static void connect() throws IOException {
    Configuration config = BigtableConfiguration.configure(PROJECT_ID, INSTANCE_ID);
    // Include the following line if you are using app profiles.
    // If you do not include the following line, the connection uses the
    // default app profile.
    config.set(BigtableOptionsFactory.APP_PROFILE_ID_KEY, APP_PROFILE_ID);
    connection = BigtableConfiguration.connect(config);
}
  

Комментарии:

1. Спасибо за ваш ответ! Я обнаружил, что у меня дублированный код в моем вопросе. Шаг, о котором вы упомянули, я сделал это в своем коде @@

2. Я отредактировал свой вопрос, отметив дублированный код как удаленный.

3. Возможно, некоторые параметры передаются неправильно config.set() . Не могли бы вы прокомментировать if инструкцию и передать параметры способом, предложенным в приведенной выше документации?