All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cz.o2.proxima.direct.bigtable.BigTableStorage Maven / Gradle / Ivy

/*
 * Copyright 2017-2022 O2 Czech Republic, a.s.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cz.o2.proxima.direct.bigtable;

import com.google.auto.service.AutoService;
import com.google.cloud.bigtable.hbase1_x.BigtableConnection;
import cz.o2.proxima.direct.core.DataAccessor;
import cz.o2.proxima.direct.core.DataAccessorFactory;
import cz.o2.proxima.direct.core.DirectDataOperator;
import cz.o2.proxima.direct.hbase.HBaseDataAccessor;
import cz.o2.proxima.repository.AttributeFamilyDescriptor;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Connection;

/**
 * Storage descriptor for bigtable:// URIs.
 *
 * BigTable storage uses URIs in the form of
 * 
bigtable://:/?family= and stores data using HBase
 * client in BigTable instance 
instance
of project
project
in table named *
table
in family
family
. * * An optional parameter in URI called
v
can be used to distinguish two serialization * versions of data in BigTable cell: *
    *
  1. v=1
    (default) stores the serialized bytes of a value in a cell directly
  2. *
  3. v=2
    uses protobuffer to store more metadata into the value
  4. *
* * The
v=2
serialization format is required to support transactions on top of BigTable, * because the metadata preserves sequentialId (stored in {@link cz.o2.proxima.storage.StreamElement#getSequentialId()}). **/ @AutoService(DataAccessorFactory.class) public class BigTableStorage implements DataAccessorFactory { private static final long serialVersionUID = 1L; @Override public DataAccessor createAccessor( DirectDataOperator operator, AttributeFamilyDescriptor familyDescriptor) { return new HBaseDataAccessor( familyDescriptor.getEntity(), familyDescriptor.getStorageUri(), familyDescriptor.getCfg(), (m, u) -> { Configuration ret = new Configuration(); ret.setClass("hbase.client.connection.impl", BigtableConnection.class, Connection.class); String authority = u.getAuthority(); if (authority == null) { throw new IllegalArgumentException("Missing authority in URI " + u); } String[] parts = authority.split(":"); if (parts.length != 2) { throw new IllegalArgumentException( "Invalid authority " + u.getAuthority() + ", expected :"); } ret.set("google.bigtable.project.id", parts[0]); ret.set("google.bigtable.instance.id", parts[1]); return ret; }); } public Accept accepts(URI uri) { return uri.getScheme().equals("bigtable") ? Accept.ACCEPT : Accept.REJECT; } }