Exemplo: ambiente padrão do Java App Engine

Este exemplo é uma aplicação do App Engine, escrita em Java, que escreve algumas saudações "Olá mundo" numa tabela do Bigtable e lê-as novamente. A aplicação é executada Google Cloud no ambiente padrão do App Engine. A aplicação usa o tempo de execução do Java 8. O código desta aplicação encontra-se no repositório do GitHub GoogleCloudPlatform/java-docs-samples, no diretório appengine-java8/bigtable.

Vista geral do exemplo de código

O exemplo de código inclui as seguintes classes:

BigtableHelper

BigtableHelper fornece um método para criar uma ligação ao Bigtable. Também coloca a ligação em cache e fornece um método que vai obter a ligação em cache, se existir. A criação de uma ligação é uma operação relativamente dispendiosa, pelo que, como prática recomendada, deve sempre criar uma única ligação e reutilizá-la.

public static void connect() throws IOException {

  if (PROJECT_ID == null || INSTANCE_ID == null) {
    if (sc != null) {
      sc.log("environment variables BIGTABLE_PROJECT, and BIGTABLE_INSTANCE need to be defined.");
    }
    return;
  }

  connection = BigtableConfiguration.connect(PROJECT_ID, INSTANCE_ID);
}

/**
 * Get the shared connection to Cloud Bigtable.
 *
 * @return the connection
 */
public static Connection getConnection() {
  if (connection == null) {
    try {
      connect();
    } catch (IOException e) {
      if (sc != null) {
        sc.log("connect ", e);
      }
    }
  }
  if (connection == null) {
    if (sc != null) {
      sc.log("BigtableHelper-No Connection");
    }
  }
  return connection;
}

BigtableHelloWorld

BigtableHelloWorld é usado para escrever uma série de saudações para o Bigtable, ler as saudações e, em seguida, apresentá-las. A classe obtém uma ligação ao Bigtable a partir de BigtableHelper, usa a ligação para obter um objeto Table, que lhe permite ler e escrever valores, e, em seguida, usa o objeto Table para escrever e ler a partir da tabela.


/**
 * A minimal application that connects to Cloud Bigtable using the native HBase API and performs
 * some basic operations.
 */
public class BigtableHelloWorld {

  // Refer to table metadata names by byte array in the HBase API
  private static final byte[] TABLE_NAME = Bytes.toBytes("Hello-Bigtable");
  private static final byte[] COLUMN_FAMILY_NAME = Bytes.toBytes("cf1");
  private static final byte[] COLUMN_NAME = Bytes.toBytes("greeting");

  // Write some friendly greetings to Cloud Bigtable
  private static final String[] GREETINGS = {
    "Hello World!", "Hello Cloud Bigtable!", "Hello HBase!"
  };

  /**
   * Create a table -- first time only.
   *
   * @param connection to Bigtable
   * @return the status
   */
  public static String create(Connection connection) {
    try {
      // The admin API lets us create, manage and delete tables
      Admin admin = connection.getAdmin();

      // Create a table with a single column family
      HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
      descriptor.addFamily(new HColumnDescriptor(COLUMN_FAMILY_NAME));

      admin.createTable(descriptor);
    } catch (IOException e) {
      return "Table exists.";
    }
    return "Create table " + Bytes.toString(TABLE_NAME);
  }

  /** Connects to Cloud Bigtable, runs some basic operations and prints the results. */
  public static String doHelloWorld() {

    StringBuilder result = new StringBuilder();

    // Create the Bigtable connection, use try-with-resources to make sure it gets closed
    Connection connection = BigtableHelper.getConnection();
    result.append(create(connection));
    result.append("

"
); try (Table table = connection.getTable(TableName.valueOf(TABLE_NAME))) { // Retrieve the table we just created so we can do some reads and writes // Write some rows to the table result.append("Write some greetings to the table
"
); for (int i = 0; i < GREETINGS.length; i++) { // Each row has a unique row key. // // Note: This example uses sequential numeric IDs for simplicity, but // this can result in poor performance in a production application. // Since rows are stored in sorted order by key, sequential keys can // result in poor distribution of operations across nodes. // // For more information about how to design a Bigtable schema for the // best performance, see the documentation: // // https://cloud.google.com/bigtable/docs/schema-design String rowKey = "greeting" + i; // Put a single row into the table. We could also pass a list of Puts to write a batch. Put put = new Put(Bytes.toBytes(rowKey)); put.addColumn(COLUMN_FAMILY_NAME, COLUMN_NAME, Bytes.toBytes(GREETINGS[i])); table.put(put); } // Get the first greeting by row key String rowKey = "greeting0"; Result getResult = table.get(new Get(Bytes.toBytes(rowKey))); String greeting = Bytes.toString(getResult.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME)); result.append("Get a single greeting by row key
"
); result.append(" "); result.append(rowKey); result.append("= "); result.append(greeting); result.append("
"
); // Now scan across all rows. Scan scan = new Scan(); result.append("Scan for all greetings:"); ResultScanner scanner = table.getScanner(scan); for (Result row : scanner) { byte[] valueBytes = row.getValue(COLUMN_FAMILY_NAME, COLUMN_NAME); result.append(" "); result.append(Bytes.toString(valueBytes)); result.append("
"
); } } catch (IOException e) { result.append("Exception while running HelloWorld: " + e.getMessage() + "
"
); result.append(e.toString()); return result.toString(); } return result.toString(); } }