use of co.cask.cdap.api.dataset.table.Scanner in project cdap by caskdata.
the class MockRuntimeDatasetSink method readOutput.
/**
* Used to read the records written by this sink.
*
* @param tableManager dataset manager used to get the sink dataset to read from
*/
public static List<StructuredRecord> readOutput(DataSetManager<Table> tableManager) throws Exception {
Table table = tableManager.get();
try (Scanner scanner = table.scan(null, null)) {
List<StructuredRecord> records = new ArrayList<>();
Row row;
while ((row = scanner.next()) != null) {
Schema schema = Schema.parseJson(row.getString(SCHEMA_COL));
String recordStr = row.getString(RECORD_COL);
records.add(StructuredRecordStringConverter.fromJsonString(recordStr, schema));
}
return records;
}
}
use of co.cask.cdap.api.dataset.table.Scanner in project cdap by caskdata.
the class MockSink method readOutput.
/**
* Used to read the records written by this sink.
*
* @param tableManager dataset manager used to get the sink dataset to read from
*/
public static List<StructuredRecord> readOutput(DataSetManager<Table> tableManager) throws Exception {
tableManager.flush();
Table table = tableManager.get();
try (Scanner scanner = table.scan(null, null)) {
List<StructuredRecord> records = new ArrayList<>();
Row row;
while ((row = scanner.next()) != null) {
Schema schema = Schema.parseJson(row.getString(SCHEMA_COL));
String recordStr = row.getString(RECORD_COL);
records.add(StructuredRecordStringConverter.fromJsonString(recordStr, schema));
}
return records;
}
}
use of co.cask.cdap.api.dataset.table.Scanner in project cdap by caskdata.
the class HBaseConsumerStateStore method configureGroups.
@Override
public void configureGroups(Iterable<? extends ConsumerGroupConfig> groupConfigs) {
com.google.common.collect.Table<Long, Integer, byte[]> startRows = fetchAllStartRows();
// Writes a new barrier info for all the groups
byte[] startRow = QueueEntryRow.getQueueEntryRowKey(queueName, transaction.getWritePointer(), 0);
Put put = new Put(Bytes.add(queueName.toBytes(), startRow));
Set<Long> groupsIds = Sets.newHashSet();
for (ConsumerGroupConfig groupConfig : groupConfigs) {
long groupId = groupConfig.getGroupId();
if (!groupsIds.add(groupId)) {
throw new IllegalArgumentException("Same consumer group is provided multiple times");
}
put.add(Bytes.toBytes(groupId), GSON.toJson(groupConfig));
// For new instance, set the start row to barrier start row
for (int instanceId = 0; instanceId < groupConfig.getGroupSize(); instanceId++) {
if (!startRows.contains(groupId, instanceId)) {
table.put(queueName.toBytes(), getConsumerStateColumn(groupId, instanceId), startRow);
}
}
}
// Remove all states for groups that are removed.
deleteRemovedGroups(table.get(queueName.toBytes()), groupsIds);
// Remove all barriers for groups that are removed.
// Also remove barriers that have all consumers consumed pass that barrier
// Multimap from groupId to barrier start rows. Ordering need to be maintained as the scan order.
Multimap<Long, byte[]> deletes = LinkedHashMultimap.create();
try (Scanner scanner = table.scan(barrierScanStartRow, barrierScanEndRow)) {
Row row = scanner.next();
while (row != null) {
deleteRemovedGroups(row, groupsIds);
// Check all instances in all groups
for (Map.Entry<byte[], byte[]> entry : row.getColumns().entrySet()) {
QueueBarrier barrier = decodeBarrierInfo(row.getRow(), entry.getValue());
if (barrier == null) {
continue;
}
long groupId = barrier.getGroupConfig().getGroupId();
boolean delete = true;
// Check if all instances in a group has consumed passed the current barrier
for (int instanceId = 0; instanceId < barrier.getGroupConfig().getGroupSize(); instanceId++) {
byte[] consumerStartRow = startRows.get(groupId, instanceId);
if (consumerStartRow == null || Bytes.compareTo(consumerStartRow, barrier.getStartRow()) < 0) {
delete = false;
break;
}
}
if (delete) {
deletes.put(groupId, row.getRow());
}
}
row = scanner.next();
}
}
// Remove barries that have all consumers consumed passed it
for (Map.Entry<Long, Collection<byte[]>> entry : deletes.asMap().entrySet()) {
// Retains the last barrier info
if (entry.getValue().size() <= 1) {
continue;
}
Deque<byte[]> rows = Lists.newLinkedList(entry.getValue());
rows.removeLast();
byte[] groupColumn = Bytes.toBytes(entry.getKey());
for (byte[] rowKey : rows) {
table.delete(rowKey, groupColumn);
}
}
table.put(put);
}
use of co.cask.cdap.api.dataset.table.Scanner in project cdap by caskdata.
the class HBaseConsumerStateStore method getLatestConsumerGroups.
void getLatestConsumerGroups(Collection<? super ConsumerGroupConfig> result) {
try (Scanner scanner = table.scan(barrierScanStartRow, barrierScanEndRow)) {
// Get the last row
Row lastRow = null;
Row row = scanner.next();
while (row != null) {
lastRow = row;
row = scanner.next();
}
if (lastRow == null) {
throw new IllegalStateException("No consumer group information. Queue: " + queueName);
}
for (Map.Entry<byte[], byte[]> entry : lastRow.getColumns().entrySet()) {
result.add(GSON.fromJson(new String(entry.getValue(), Charsets.UTF_8), ConsumerGroupConfig.class));
}
}
}
use of co.cask.cdap.api.dataset.table.Scanner in project cdap by caskdata.
the class HBaseConsumerStateStore method clear.
/**
* Remove all states related to the queue that this state store is representing.
*/
void clear() {
// Scan and delete all barrier rows
try (Scanner scanner = table.scan(barrierScanStartRow, barrierScanEndRow)) {
Row row = scanner.next();
while (row != null) {
table.delete(row.getRow());
row = scanner.next();
}
// Also delete the consumer state rows
table.delete(queueName.toBytes());
}
}
Aggregations