#java #gcloud #bigtable
#java #gcloud #bigtable
Вопрос:
Недавно я пытаюсь разработать что-то, используя эмулятор Bigtable с java (Spring Boot) в IntelliJ IDEA tool.
Что я сделал:
-
Эмулятор Bigtable хорошо работает на моем компьютере (macOS 10.15.6).
-
«cbt» нормально работает с эмулятором Bigtable, работающим на моем Mac, как что-то вроде этого.
Я проверил, что для запуска эмулятора Bigtable не требуются реальные учетные данные gcloud.
- Я пишу модульный тест на 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
инструкцию и передать параметры способом, предложенным в приведенной выше документации?