Что касается пакетного чтения и записи 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) {
}
}
}
});
}