Uso del conector de Apache Spark para SQL Server y Azure SQL

Importante

El complemento Clústeres de macrodatos de Microsoft SQL Server 2019 se va a retirar. La compatibilidad con Clústeres de macrodatos de SQL Server 2019 finalizará el 28 de febrero de 2025. Todos los usuarios existentes de SQL Server 2019 con Software Assurance serán totalmente compatibles con la plataforma, y el software se seguirá conservando a través de actualizaciones acumulativas de SQL Server hasta ese momento. Para más información, consulte la entrada de blog sobre el anuncio y Opciones de macrodatos en la plataforma Microsoft SQL Server.

El conector de Apache Spark para SQL Server y Azure SQL es un conector de alto rendimiento que le permite usar datos transaccionales en análisis de macrodatos y conservar los resultados para consultas ad hoc o la generación de informes. El conector permite usar cualquier base de datos SQL, local o en la nube, como origen de datos de entrada o receptor de datos de salida para trabajos de Spark. El conector utiliza API de escritura masiva de SQL Server. El usuario puede pasar los parámetros de escritura masiva como parámetros opcionales, y el conector los pasa tal cual a la API subyacente. Para más información sobre las operaciones de escritura masiva, consulte Uso de la copia masiva con el controlador JDBC.

El conector se incluye de forma predeterminada en los clústeres de macrodatos de SQL Server.

Más información sobre el conector en el repositorio de código abierto. Puede encontrar ejemplos aquí.

Escritura en una nueva tabla de SQL

Precaución

En el modo overwrite, el conector descarta primero la tabla si ya existe en la base de datos de forma predeterminada. Use esta opción con cuidado para evitar pérdidas de datos inesperadas.

Cuando se usa el modo overwrite sin la opción truncate, al volver a crear la tabla se perderán los índices. Por ejemplo, una tabla de almacén de columnas se convierte en un montón. Si quiere mantener la indexación existente, especifique también la opción truncate con el valor true. Por ejemplo, .option("truncate",true).

server_name = "jdbc:sqlserver://{SERVER_ADDR}"
database_name = "database_name"
url = server_name + ";" + "databaseName=" + database_name + ";"

table_name = "table_name"
username = "username"
password = "password123!#" # Please specify password here

try:
  df.write \
    .format("com.microsoft.sqlserver.jdbc.spark") \
    .mode("overwrite") \
    .option("url", url) \
    .option("dbtable", table_name) \
    .option("user", username) \
    .option("password", password) \
    .save()
except ValueError as error :
    print("Connector write failed", error)

Anexión a una tabla SQL

try:
  df.write \
    .format("com.microsoft.sqlserver.jdbc.spark") \
    .mode("append") \
    .option("url", url) \
    .option("dbtable", table_name) \
    .option("user", username) \
    .option("password", password) \
    .save()
except ValueError as error :
    print("Connector write failed", error)

Especificación del nivel de aislamiento

De forma predeterminada, este conector usa el nivel de aislamiento READ_COMMITTED al realizar la inserción masiva en la base de datos. Si quiere reemplazarlo por otro nivel de aislamiento, use la opción mssqlIsolationLevel como se muestra a continuación.

    .option("mssqlIsolationLevel", "READ_UNCOMMITTED") \

Lectura de una tabla SQL

jdbcDF = spark.read \
        .format("com.microsoft.sqlserver.jdbc.spark") \
        .option("url", url) \
        .option("dbtable", table_name) \
        .option("user", username) \
        .option("password", password).load()

Modo sin Active Directory

En la seguridad del modo sin Active Directory, cada usuario tiene un nombre de usuario y una contraseña que se deben proporcionar como parámetros durante la creación de instancias del conector para realizar operaciones de lectura o escritura.

A continuación, se muestra un ejemplo de creación de instancias del conector para el modo sin Active Directory: Antes de ejecutar el script, reemplace ? por el valor de su cuenta.

# Note: '?' is a placeholder for a necessary user-specified value
connector_type = "com.microsoft.sqlserver.jdbc.spark" 

url = "jdbc:sqlserver://master-p-svc;databaseName=?;"
writer = df.write \ 
   .format(connector_type)\ 
   .mode("overwrite") 
   .option("url", url) \ 
   .option("user", ?) \ 
   .option("password",?) 
writer.save() 

Modo de Active Directory

En la seguridad del modo de Active Directory, una vez que un usuario ha generado un archivo keytab, tiene que proporcionar los valores principal y keytab como parámetros durante la creación de instancias del conector.

En este modo, el controlador carga el archivo keytab en los contenedores del ejecutor correspondiente. Después, los ejecutores usan el nombre de entidad de seguridad y el archivo keytab para generar un token que se utiliza para crear un conector JDBC para lectura y escritura.

A continuación, se muestra un ejemplo de creación de instancias del conector para el modo de Active Directory: Antes de ejecutar el script, reemplace ? por el valor de su cuenta.

# Note: '?' is a placeholder for a necessary user-specified value
connector_type = "com.microsoft.sqlserver.jdbc.spark"

url = "jdbc:sqlserver://master-p-svc;databaseName=?;integratedSecurity=true;authenticationScheme=JavaKerberos;" 
writer = df.write \ 
   .format(connector_type)\ 
   .mode("overwrite") 
   .option("url", url) \ 
   .option("principal", ?) \ 
   .option("keytab", ?)   

writer.save() 

Pasos siguientes

Para obtener más información sobre los clústeres de macrodatos, vea Cómo implementar Clústeres de macrodatos de SQL Server en Kubernetes.

¿Tiene comentarios o recomendaciones sobre características para los clústeres de macrodatos de SQL Server? Deje una nota en Comentarios sobre clústeres de macrodatos de SQL Server.