Модульное тестирование с использованием HBaseTestingUtility - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь отладить код java с помощью библиотеки HBaseTestingUtility. У меня уже есть таблица создана. Мне нужно: - вставить значение с ключом в «myTable» - получить значение из «myTable» с ключом - убедиться, что возвращаемое значение равно значению, которое я создал. Вот код, который я заполнил:

package HbaseUniteTest;

import jdk.nashorn.api.scripting.ScriptUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.junit.Assert;

import static org.junit.Assert.assertEquals;

public class TestCreateTableClass
{
    private final static String tableName = "myTable";
    private static ScriptUtils HTableUtil;

    public static void main( String[] args ) throws Exception {

        //Start the "mini cluster"
        HBaseTestingUtility testingUtility = new HBaseTestingUtility();
        testingUtility.startMiniCluster();

        //Get the configuration
        //Configuration conf = ...
        Configuration conf = testingUtility.getConfiguration();

        //Instantiate a connection
        Connection connection = ConnectionFactory.createConnection(conf);

        //Define table "myTable"
        HTableDescriptor table = new HTableDescriptor(TableName.valueOf(tableName));
        table.addFamily(new HColumnDescriptor("cf1").setCompressionType(Compression.Algorithm.NONE));

        //Create table "myTable"
        connection.getAdmin().createTable(table);

        //Get the first (and only) table name
        String first_table = connection.getAdmin().listTableNames()[0].getNameAsString();

        //Verify the returned Table name is equal to the table name we provided
        assertEquals(tableName,first_table);

        //Insert a value with a key in "myTable"
        byte[] key = Bytes.toBytes("some-key");
        Put put = new Put(key);
        put.add(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1.1"), System.currentTimeMillis(), Bytes.toBytes("val1.1"));
        put.add(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1.2"), System.currentTimeMillis(), Bytes.toBytes("val1.2"));
        put.add(Bytes.toBytes("colfam2"), Bytes.toBytes("qual2.1"), System.currentTimeMillis(), Bytes.toBytes("val2.1"));
        Result converted = HTableUtil.convert(put);
        table.put(put);
        Result readFromTable = table.get(new Get(key));
        Assert.assertArrayEquals(readFromTable.raw(), converted.raw());


        //Get the value from "myTable" with the key

        //Verify the returned value is equal to the value you created


        //Stop the mini cluster
        testingUtility.shutdownMiniCluster();
        System.out.println("END OF TEST");
    }

    public static void setHTableUtil(ScriptUtils HTableUtil) {
        TestCreateTableClass.HTableUtil = HTableUtil;
    }
}

Однако я получил следующую ошибку: 1. Ошибка в этой строке кода с функцией put.add ()

put.add(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1.1"), System.currentTimeMillis(), Bytes.toBytes("val1.1"));

javaerr1

Вторая ошибка в этой строке кода:
 Result converted = HTableUtil.convert(put);

javaErr2

Java не может найти символ для этих 3 методов: put (), get (), raw ()
table.put(put);
Result readFromTable = table.get(new Get(key));
        Assert.assertArrayEquals(readFromTable.raw(), converted.raw());

javaErr3

Я также заметил некоторые предупреждения, касающиеся класса HTableDescriptor, HColumnDescriptor устарел. Я проверил на inte rnet, и они советуют использовать, например, «TableDescriptorBuilder», но я не уверен, как его использовать. (Ссылка: https://github.com/apache/hbase/blob/master/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java)

javaErr4

1 Ответ

1 голос
/ 01 апреля 2020

1. Ошибка в этой строке кода с функцией put.add ().
Я думаю, что вы можете использовать addColumn (), как это для добавления столбца.

put.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1.1"), System.currentTimeMillis(), Bytes.toBytes("val1.1"));
put.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1.2"), System.currentTimeMillis(), Bytes.toBytes("val1.2"));
put.addColumn(Bytes.toBytes("colfam2"), Bytes.toBytes("qual2.1"), System.currentTimeMillis(), Bytes.toBytes("val2.1"));


2. Вторая ошибка в этой строке кода:
Я не знаком с 'ScriptUtils', но я думаю, что он работает.

Result converted = (Result) HTableUtil.convert(put, Result.class);


3. Java не может найти символ для этих 3 методов put (), get (), raw ()
Это потому, что вы продолжаете использовать 'HTableDescriptor' для put (), get () или raw (). HTableDescriptor используется для создания таблицы, подобной DDL. Вам нужно использовать класс Table для управления с помощью put (), get () или raw ().

Table createdTable = connection.getTable(TableName.valueOf(tableName));
createdTable.put(put);
Result readFromTable = createdTable.get(new Get(key));

Кроме того, я считаю, что класс 'Result' не предоставляет raw (). Таким образом, вы можете сравнить оба результата, используя Result.compareResults () следующим образом.

Result.compareResults(readFromTable, converted);


4. Как использовать TableDescriptorBuilder
Как я уже говорил выше, Descriptor - это класс для определения вашей таблицы, семейства столбцов, столбца и т. Д. Таким образом, вам нужно использовать его, когда вы делаете / создаете их.

//Define table "myTable"
TableDescriptorBuilder table = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
table.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf1")).setCompressionType(Compression.Algorithm.NONE).build());

//Create table "myTable"
connection.getAdmin().createTable(table.build());
...