Spark пакетное чтение и запись Phoenix

Что касается пакетного чтения и записи Phoenix в Spark, я нашел два способа организовать их в заметки и использовать их в качестве заметок.

метод первый

Phoenix официально предоставляет подключаемый модуль Spark, который может активировать взаимодействие между Spark и Phoenix.
Адрес: http://phoenix.apache.org/phoenix_spark.html

Если вы используете CDH, Cloudera также предоставляет соответствующие инструменты для реализации взаимодействия между Spark и Phoenix.
Адрес: https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/phoenix_spark_connector.html.

Эти два инструмента подключены к Phoenix через zookeeper.

Если в кластере включен Kerberos, если Spark и Phoenix находятся в одном кластере, доступ должен быть в порядке.Однако, если Spark и Phoenix не находятся в одном кластере, два инструмента не смогут нормально взаимодействовать из-за проверки подлинности Kerberos. проблемы.

В настоящее время вы можете использовать Spark для доступа к клиенту Phoenix для взаимодействия. Это также второй метод, который будет представлен ниже.

Способ второй

Общая схема вывода Spark foreachPartition, этот метод является производным от общего оператора вывода foreachRDD Spark Streaming , см. другую мою статью Spark Streaming сохраняет данные в HBase .

Здесь платформа CDH взята в качестве примера для описания метода настройки и этапов работы.

На платформе включен FreeIPA.FreeIPA — это расширенный инструмент управления для Kerberos, но он имеет не только возможности Kerberos.

1. Добавьте phoenix-client.jar в oozie-share-lib/spark
2. Spark требуется разрешение rx на каталог раздела таблицы куста
3. Конфигурация задачи Oozie, проверка учетных данных hcat
4. Spark использует foreachPartition, каждый раздел подключается к phoenix и записывает данные

Пример кода ключа:

public static void saveToPhoenix(Dataset<Row> df) {
    
    
    df.foreachPartition(partitionOfRecords -> {
    
    
        String columns = "id,name";
        String phoenixUrl = "jdbc:phoenix:master1.bigdata.com:2181:/hbase";
        String phoenixSQL = String.join("",
                "UPSERT INTO test.test (",
                columns,
                ") VALUES(?,?)");
        Properties props = new Properties();
        props.setProperty("phoenix.schema.isNamespaceMappingEnabled", "true");
        props.setProperty("phoenix.schema.mapSystemTablesToNamespace", "true");
        Connection phoenixConn = null;
        PreparedStatement phoenixPS = null;

        try {
    
    
            phoenixConn = PhoenixUtils.getConn(phoenixUrl, props);
            phoenixConn.setAutoCommit(true); // phoenix默认不启用自动提交,这里启用自动提交,方便批操作
            phoenixPS = phoenixConn.prepareStatement(phoenixSQL);
            Integer cnt = 0;
            while (partitionOfRecords.hasNext()) {
    
    
                Row line = partitionOfRecords.next();
                phoenixPS.setObject(1, line.getAs("id"));
                phoenixPS.setObject(2, line.getAs("name"));
                phoenixPS.addBatch();
                cnt += 1;
                if (cnt >= 5000) {
    
    
                    phoenixPS.executeBatch();
                    cnt = 0;
                }
            }
            if (cnt > 0) {
    
    
                phoenixPS.executeBatch();
            }
        } finally {
    
    
            if (phoenixPS != null) {
    
    
                try {
    
    
                    phoenixPS.close();
                } catch (Exception e) {
    
    }
            }
            if (phoenixConn != null) {
    
    
                try {
    
    
                    phoenixConn.setAutoCommit(false);
                    phoenixConn.close();
                } catch (Exception e) {
    
    }
            }
        }
    });
}

Supongo que te gusta

Origin blog.csdn.net/xwd127429/article/details/115004322
Recomendado
Clasificación