Usare Apache Sqoop per importare ed esportare dati tra Hadoop su HDInsight e un database SQL

Informazioni su come usare Apache Sqoop per eseguire importazioni ed esportazioni tra un cluster Hadoop in Azure HDInsight e un database SQL di Azure o un database Microsoft SQL Server. La procedura descritta in questo documento usa il comando sqoop direttamente dal nodo head del cluster Hadoop. Usare SSH per connettersi al nodo head ed eseguire i comandi di questo documento.

Importante

I passaggi descritti in questo documento funzionano solo con i cluster HDInsight che usano Linux. Linux è l'unico sistema operativo usato in HDInsight versione 3.4 o successiva. Per altre informazioni, vedere la sezione relativa al ritiro di HDInsight in Windows.

Installare FreeTDS

  1. Connettersi al cluster HDInsight usando SSH. Ad esempio, il comando seguente si connette al nodo head primario di un cluster denominato mycluster:

    ssh CLUSTERNAME-ssh.azurehdinsight.net
    

    Per altre informazioni, vedere Usare SSH con HDInsight.

  2. Immettere il comando seguente per installare FreeTDS:

    sudo apt --assume-yes install freetds-dev freetds-bin
    

    FreeTDS viene usato in diversi passaggi per connettersi al database SQL.

Creare la tabella nel database SQL

Importante

Se si usa il cluster HDInsight e il database SQL creato in Creare cluster e database SQL, saltare i passaggi descritti in questa sezione. Il database e la tabella sono stati creati come parte della procedura del documento Creare cluster e database SQL.

  1. Nella sessione SSH usare il comando seguente per connettersi al server del database SQL.

     TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <adminLogin> -P <adminPassword> -p 1433 -D sqooptest
    

    L'output che si riceve è simile al testo seguente:

     locale is "en_US.UTF-8"
     locale charset is "UTF-8"
     using default charset "UTF-8"
     Default database being set to sqooptest
     1>
    
  2. Al prompt di 1> immettere la query seguente:

    CREATE TABLE [dbo].[mobiledata](
    [clientid] [nvarchar](50),
    [querytime] [nvarchar](50),
    [market] [nvarchar](50),
    [deviceplatform] [nvarchar](50),
    [devicemake] [nvarchar](50),
    [devicemodel] [nvarchar](50),
    [state] [nvarchar](50),
    [country] [nvarchar](50),
    [querydwelltime] [float],
    [sessionid] [bigint],
    [sessionpagevieworder] [bigint])
    GO
    CREATE CLUSTERED INDEX mobiledata_clustered_index on mobiledata(clientid)
    GO
    

    Dopo aver immesso l'istruzione GO, vengono valutate le istruzioni precedenti. Innanzitutto, verrà creata la tabella mobiledata a cui verrà aggiunto un indice cluster (richiesto dal Database SQL).

    Per verificare la corretta creazione della tabella, usare la query seguente:

    SELECT * FROM information_schema.tables
    GO
    

    L'output sarà simile al seguente testo:

     TABLE_CATALOG   TABLE_SCHEMA    TABLE_NAME      TABLE_TYPE
     sqooptest       dbo     mobiledata      BASE TABLE
    
  3. Per uscire dall'utilità tsql, immettere exit al prompt di 1>.

Esportazione con Sqoop

  1. Dalla connessione SSH al cluster, usare il comando seguente per verificare che Sqoop possa visualizzare il database SQL:

    sqoop list-databases --connect jdbc:sqlserver://<serverName>.database.windows.net:1433 --username <adminLogin> -P
    

    Quando richiesto, immettere la password per l’accesso al database SQL.

    Questo comando restituisce un elenco di database, compreso il database sqooptest creato in precedenza.

  2. Per esportare dati dalla tabella hivesampletable alla tabella mobiledata, usare il comando seguente:

    sqoop export --connect 'jdbc:sqlserver://<serverName>.database.windows.net:1433;database=sqooptest' --username <adminLogin> -P --table 'mobiledata' --export-dir 'wasb:///hive/warehouse/hivesampletable' --fields-terminated-by '\t' -m 1
    

    Questo comando indica a Sqoop di connettersi al database sqooptest. Sqoop esporta quindi i dati da wasb:///hive/warehouse/hivesampletable nella tabella mobiledata.

    Importante

    Usare wasb:/// se l'archivio predefinito per il cluster è un account di archiviazione di Azure. Usare adl:/// se è un Azure Data Lake Store.

  3. Al termine dell'esecuzione del comando, usare il comando seguente per connettersi al database tramite TSQL:

    TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <adminLogin> -P -p 1433 -D sqooptest
    

    Una volta connessi, utilizzare le istruzioni seguenti per verificare che i dati siano stati esportati nella tabella mobiledata :

    SET ROWCOUNT 50;
    SELECT * FROM mobiledata
    GO
    

    Dovrebbe essere visualizzato un elenco di dati della tabella. Digitare exit per uscire dall'utilità tsql.

Importazione con Sqoop

  1. Usare il comando seguente per importare i dati dalla tabella mobiledata nel database SQL alla directory wasb:///tutorials/usesqoop/importeddata in HDInsight:

    sqoop import --connect 'jdbc:sqlserver://<serverName>.database.windows.net:1433;database=sqooptest' --username <adminLogin> --password <adminPassword> --table 'mobiledata' --target-dir 'wasb:///tutorials/usesqoop/importeddata' --fields-terminated-by '\t' --lines-terminated-by '\n' -m 1
    

    I campi nei dati sono separati da un carattere di tabulazione e le righe terminano con un carattere di nuova riga.

  2. Una volta completata l'importazione, usare il comando seguente per elencare i dati della nuova directory:

    hdfs dfs -text /tutorials/usesqoop/importeddata/part-m-00000
    

Uso di SQL Server

È inoltre possibile usare Sqoop per importare ed esportare dati da SQL Server nel data center o in una macchina virtuale ospitata in Azure. Le differenze tra l'uso del database SQL e SQL Server sono:

  • HDInsight e SQL Server devono trovarsi nella stessa rete virtuale di Azure.

    Per avere un esempio, vedere il documento Connettere HDInsight alla rete locale.

    Per altre informazioni sull'uso di HDInsight con le reti virtuali di Azure, vedere il documento Estendere HDInsight con la rete virtuale di Azure. Per altre informazioni su Rete virtuale di Azure, vedere il documenti di panoramica sulle reti virtuali.

  • SQL Server deve essere configurato per consentire l'autenticazione SQL. Per altre informazioni, consultare il documento Scegliere una modalità di autenticazione.

  • Potrebbe essere necessario configurare SQL Server affinché accetti le connessioni remote. Per altre informazioni, vedere il documento Come risolvere i problemi di connessione al motore di database di SQL Server.

  • Creare il database sqooptest in SQL Server usando un'utilità, ad esempio SQL Server Management Studio o tsql. La procedura per usare l'interfaccia della riga di comando di Azure funzionano solo per il database SQL di Azure.

    Usare le seguenti istruzioni Transact-SQL per creare la tabella mobiledata:

    CREATE TABLE [dbo].[mobiledata](
    [clientid] [nvarchar](50),
    [querytime] [nvarchar](50),
    [market] [nvarchar](50),
    [deviceplatform] [nvarchar](50),
    [devicemake] [nvarchar](50),
    [devicemodel] [nvarchar](50),
    [state] [nvarchar](50),
    [country] [nvarchar](50),
    [querydwelltime] [float],
    [sessionid] [bigint],
    [sessionpagevieworder] [bigint])
    
  • Quando ci si connette a SQL Server da HDInsight, è necessario usare l'indirizzo IP del Server SQL. Ad esempio:

    sqoop import --connect 'jdbc:sqlserver://10.0.1.1:1433;database=sqooptest' --username <adminLogin> --password <adminPassword> --table 'mobiledata' --target-dir 'wasb:///tutorials/usesqoop/importeddata' --fields-terminated-by '\t' --lines-terminated-by '\n' -m 1
    

Limitazioni

  • Esportazione di massa: con HDInsight basato su Linux, attualmente il connettore Sqoop, usato per esportare dati in Microsoft SQL Server o nel database SQL di Azure, non supporta inserimenti di massa.

  • Invio in batch: con HDInsight basato su Linux, quando si usa il comando -batch durante gli inserimenti, Sqoop esegue più inserimenti invece di suddividere in batch le operazioni di inserimento.

Passaggi successivi

In questa esercitazione si è appreso come usare Sqoop. Per altre informazioni, vedere: