Использование Data Lake Storage 1-го поколения с кластерами Azure HDInsight

Примечание

Развертывайте новые кластеры HDInsight с помощью Azure Data Lake Storage 2-го поколения, чтобы повысить их производительность и получить дополнительные функции.

Данные, предназначенные для анализа в кластере HDInsight, можно хранить в Azure Blob storage, Azure Data Lake Storage 1-го поколения или Azure Data Lake Storage 2-го поколения. Все варианты хранилищ позволяют безопасно и без потери пользовательских данных удалять используемые для расчетов кластеры HDInsight.

Из этой статьи вы узнаете, как Data Lake Storage 1-го поколения работает с кластерами HDInsight. О том, как хранилище BLOB-объектов Azure работает с кластерами HDInsight, см. в статье Использование хранилища BLOB-объектов Azure с кластерами Azure HDInsight. Дополнительные сведения о создании кластера HDInsight см. в статье Установка кластеров в HDInsight с использованием Hadoop, Spark, Kafka и других технологий.

Примечание

Доступ к Data Lake Storage 1-го поколения всегда осуществляется по безопасному каналу, поэтому никогда не применяется имя схемы файловой системы adls. Всегда используется adl.

Примечание

Для взаимодействия с Azure рекомендуется использовать модуль Azure Az PowerShell. Чтобы начать работу, см. статью Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.

Сведения о доступности кластеров HDInsight

В Apache Hadoop поддерживается концепция файловой системы по умолчанию. Файловая система по умолчанию подразумевает использование центра сертификации и схемы по умолчанию. Она также может использоваться для разрешения относительных путей. В ходе создания кластера HDInsight укажите контейнер BLOB-объектов в качестве файловой системы по умолчанию в службе хранилища Azure. При использовании HDInsight 3.5 и более новых версий вы можете выбрать хранилище BLOB-объектов Azure или Azure Data Lake Storage 1-го поколения в качестве файловой системы по умолчанию за несколькими исключениями. Кластер и учетная запись хранения должны размещаться в одном регионе.

Есть два способа использовать Data Lake Storage 1-го поколения с кластерами HDInsight:

  • в качестве хранилища по умолчанию;
  • в качестве дополнительного хранилища (при этом в качестве хранилища по умолчанию используется хранилище BLOB-объектов Azure).

Сейчас только некоторые типы и версии кластеров HDInsight поддерживают использование Data Lake Storage 1-го поколения в качестве хранилища по умолчанию и дополнительных учетных записей хранения.

Тип кластера HDInsight Использование Data Lake Storage 1-го поколения как хранилища по умолчанию Использование Data Lake Storage 1-го поколения как дополнительного хранилища Примечания
HDInsight версии 4.0 Нет Нет HDInsight 4.0 не поддерживает ADLS 1-го поколения
HDInsight версии 3.6 Да Да За исключением HBase
HDInsight версии 3.5 Да Да За исключением HBase
HDInsight версия 3.4 Нет Да
HDInsight версии 3.3 Нет Нет
HDInsight версии 3.2 Нет Да

Предупреждение

HDInsight HBase не поддерживается в Azure Data Lake Storage 1-го поколения.

Использование Data Lake Storage 1-го поколения в качестве дополнительной учетной записи хранения не влияет на производительность и на возможность чтения и записи в хранилище BLOB-объектов Azure из кластера.

Использование Data Lake Storage 1-го поколения как хранилища по умолчанию

Если для кластера HDInsight в качестве хранилища по умолчанию развернуто Data Lake Storage 1-го поколения, все файлы этого кластера хранятся в расположении adl://mydatalakestore/<cluster_root_path>/, где <cluster_root_path> обозначает имя папки, созданной в Data Lake Storage. Указав корневую папку для каждого кластера, вы можете использовать одну и ту же учетную запись Data Lake Storage для нескольких кластеров. Таким образом, у вас могут получиться такие настройки:

  • Cluster1 использует путь adl://mydatalakestore/cluster1storage;
  • Cluster2 использует путь adl://mydatalakestore/cluster2storage.

Обратите внимание, что оба кластера используют одну учетную запись Data Lake Storage 1-го поколения с именем mydatalakestore. Каждый кластер имеет доступ к собственный корневой файловой системе в Data Lake Storage. При развертывании портала Azure предлагается использовать для корневого пути имя папки вида /clusters/<clustername>.

Чтобы использовать Data Lake Storage 1-го поколения как хранилище по умолчанию, предоставьте субъекту-службе доступ к следующим объектам:

  • Корневой каталог учетной записи Data Lake Storage 1-го поколения. Например: adl://mydatalakestore/.
  • Папка для всех папок кластера. Например: adl://mydatalakestore/clusters.
  • Папка для кластера. Например: adl://mydatalakestore/clusters/cluster1storage.

Дополнительные сведения о создании субъекта-службы и предоставлении доступа см. в разделе "Настройка доступа к Data Lake Storage".

Извлечение сертификата из Azure Key Vault для использования при создании кластера

Если сертификат для вашего субъекта-службы хранится в Azure Key Vault, преобразуйте сертификат в правильный формат. В приведенных ниже фрагментах кода показано, как преобразовать сертификат.

Прежде всего, загрузите сертификат из Key Vault и извлеките SecretValueText.

$certPassword = Read-Host "Enter Certificate Password"
$cert = (Get-AzureKeyVaultSecret -VaultName 'MY-KEY-VAULT' -Name 'MY-SECRET-NAME')
$certValue = [System.Convert]::FromBase64String($cert.SecretValueText)

Затем преобразуйте SecretValueText в сертификат.

$certObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $certValue,$null,"Exportable, PersistKeySet"
$certBytes = $certObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $certPassword.SecretValueText);
$identityCertificate = [System.Convert]::ToBase64String($certBytes)

После этого можно используйте $identityCertificate для развертывания нового кластера, как показано в следующем фрагменте.

New-AzResourceGroupDeployment `
    -ResourceGroupName $resourceGroupName `
    -TemplateFile $pathToArmTemplate `
    -identityCertificate $identityCertificate `
    -identityCertificatePassword $certPassword.SecretValueText `
    -clusterName  $clusterName `
    -clusterLoginPassword $SSHpassword `
    -sshPassword $SSHpassword `
    -servicePrincipalApplicationId $application.ApplicationId

Использование Data Lake Storage 1-го поколения как дополнительного хранилища

Data Lake Storage 1-го поколения можно использовать в качестве дополнительного хранилища кластера. В таких случаях хранилищем кластера по умолчанию может быть хранилище BLOB-объектов Azure или учетная запись Azure Data Lake Storage 1-го поколения. При выполнении заданий HDInsight с данными, которые хранятся в Azure Data Lake Storage 1-го поколения как в дополнительном хранилище, используйте полный путь к файлам. Пример:

adl://mydatalakestore.azuredatalakestore.net/<file_path>

В URL-адресе отсутствует cluster_root_path, так как в этом случае Data Lake Storage не является хранилищем по умолчанию. Поэтому вам достаточно указать путь к файлам.

Чтобы использовать Data Lake Storage 1-го поколения как дополнительное хранилище, предоставьте субъекту-службе доступ к расположениям, в которых хранятся файлы. Пример:

adl://mydatalakestore.azuredatalakestore.net/<file_path>

Дополнительные сведения о создании субъекта-службы и предоставлении доступа см. в разделе "Настройка доступа к Data Lake Storage".

Использование нескольких учетных записей Data Lake Storage 1-го поколения

Можно добавить учетную запись Data Lake Storage в качестве дополнительной или добавить несколько учетных записей Data Lake Storage. Предоставьте кластеру HDInsight разрешение на данные в одной или нескольких учетных записях Data Lake Storage. См. ниже раздел о настройке доступа к Data Lake Storage 1-го поколения.

Настройка доступа к Data Lake Storage 1-го поколения

Для настройки доступа к Data Lake Storage 1-го поколения из кластера HDInsight вам потребуется субъект-служба Azure Active Directory (Azure AD). Создать субъект-службу может только администратор Azure AD. Для создания субъекта-службы необходим сертификат. Дополнительные сведения см. в разделах Краткое руководство. Настройка кластеров в HDInsight и Создание субъекта-службы с самозаверяющим сертификатом.

Примечание

Если вы собираетесь добавить Azure Data Lake Storage 1-го поколения в качестве дополнительного хранилища для кластера HDInsight, мы настоятельно рекомендуем сделать это во время создания кластера, как описано в этой статье. Сценарий с добавлением Azure Data Lake Storage 1-го поколения в качестве дополнительного хранилища для существующего кластера HDInsight не поддерживается.

Сведения о модели управления доступом см. в статье Управление доступом в Azure Data Lake Storage 1-го поколения.

Доступ к файлам из кластера

Существует несколько способов доступа к файлам в Data Lake Storage из кластера HDInsight.

  • С помощью полного доменного имени. При таком подходе необходимо указать полный путь к файлу, к которому требуется доступ.

    adl://<data_lake_account>.azuredatalakestore.net/<cluster_root_path>/<file_path>
    
  • Используя сокращенный формат пути. При таком подходе путь до корня кластера заменяется на следующий:

    adl:///<file path>
    
  • С помощью относительного пути. При таком подходе указывается только относительный путь к файлу, к которому требуется доступ.

    /<file.path>/
    

Примеры доступа к данным

Примеры основаны на SSH-подключении к головному узлу кластера. В примерах используются все три схемы URI. Замените DATALAKEACCOUNT и CLUSTERNAME соответствующими значениями.

Несколько команд HDFS

  1. Создайте файл в локальном хранилище.

    touch testFile.txt
    
  2. Создайте каталог в хранилище кластера.

    hdfs dfs -mkdir adl://DATALAKEACCOUNT.azuredatalakestore.net/clusters/CLUSTERNAME/sampledata1/
    hdfs dfs -mkdir adl:///sampledata2/
    hdfs dfs -mkdir /sampledata3/
    
  3. Скопируйте данные из локального хранилища в хранилище кластера.

    hdfs dfs -copyFromLocal testFile.txt adl://DATALAKEACCOUNT.azuredatalakestore.net/clusters/CLUSTERNAME/sampledata1/
    hdfs dfs -copyFromLocal testFile.txt adl:///sampledata2/
    hdfs dfs -copyFromLocal testFile.txt /sampledata3/
    
  4. Перечислите содержимое каталога в хранилище кластера.

    hdfs dfs -ls adl://DATALAKEACCOUNT.azuredatalakestore.net/clusters/CLUSTERNAME/sampledata1/
    hdfs dfs -ls adl:///sampledata2/
    hdfs dfs -ls /sampledata3/
    

Создание таблицы Hive

Для наглядности показаны три расположения файлов. Для фактического выполнения используйте только одну из записей LOCATION.

DROP TABLE myTable;
CREATE EXTERNAL TABLE myTable (
    t1 string,
    t2 string,
    t3 string,
    t4 string,
    t5 string,
    t6 string,
    t7 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE
LOCATION 'adl://DATALAKEACCOUNT.azuredatalakestore.net/clusters/CLUSTERNAME/example/data/';
LOCATION 'adl:///example/data/';
LOCATION '/example/data/';

Указание пути к хранилищу из Ambari

Чтобы указать полный путь к настроенному хранилищу по умолчанию, выберите HDFS>Конфигурации и в поле ввода фильтра введите fs.defaultFS.

Создание кластеров HDInsight с доступом к Data Lake Storage 1-го поколения

По указанным ниже ссылкам вы найдете подробные инструкции по созданию кластеров HDInsight с доступом к Data Lake Storage 1-го поколения.

Обновление сертификата HDInsight для получения доступа к Data Lake Storage 1-го поколения

Следующий фрагмент кода PowerShell считывает сертификат из локального файла или Azure Key Vault и настраивает его в кластере HDInsight для доступа к Azure Data Lake Storage 1-го поколения. Укажите имена для кластера HDInsight и группы ресурсов, идентификатор подписки, app ID и локальный путь к сертификату. Когда отобразится соответствующий запрос, введите пароль.

$clusterName = '<clustername>'
$resourceGroupName = '<resourcegroupname>'
$subscriptionId = '01234567-8a6c-43bc-83d3-6b318c6c7305'
$appId = '01234567-e100-4118-8ba6-c25834f4e938'
$addNewCertKeyCredential = $true
$certFilePath = 'C:\localfolder\adls.pfx'
$KeyVaultName = "my-key-vault-name"
$KeyVaultSecretName = "my-key-vault-secret-name"
$certPassword = Read-Host "Enter Certificate Password"
# certSource
# 0 - create self signed cert
# 1 - read cert from file path
# 2 - read cert from key vault
$certSource = 0

Login-AzAccount
Select-AzSubscription -SubscriptionId $subscriptionId

if($certSource -eq 0)
{
    Write-Host "Generating new SelfSigned certificate"

    $cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" -Subject "CN=hdinsightAdlsCert" -KeySpec KeyExchange
    $certBytes = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $certPassword);
    $certString = [System.Convert]::ToBase64String($certBytes)
}
elseif($certSource -eq 1)
{

    Write-Host "Reading the cert file from path $certFilePath"

    $cert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2($certFilePath, $certPassword)
    $certString = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes($certFilePath))
}
elseif($certSource -eq 2)
{

    Write-Host "Reading the cert file from Azure Key Vault $KeyVaultName"

    $cert = (Get-AzureKeyVaultSecret -VaultName $KeyVaultName -Name $KeyVaultSecretName)
    $certValue = [System.Convert]::FromBase64String($cert.SecretValueText)
    $certObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $certValue, $null,"Exportable, PersistKeySet"

    $certBytes = $certObject.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $certPassword.SecretValueText);

    $certString =[System.Convert]::ToBase64String($certBytes)
}

if($addNewCertKeyCredential)
{
    Write-Host "Creating new KeyCredential for the app"
    $keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())
    New-AzADAppCredential -ApplicationId $appId -CertValue $keyValue -EndDate $cert.NotAfter -StartDate $cert.NotBefore
    Write-Host "Waiting for 7 minutes for the permissions to get propagated"
    Start-Sleep -s 420 #7 minutes
}

Write-Host "Updating the certificate on HDInsight cluster..."

Invoke-AzResourceAction `
    -ResourceGroupName $resourceGroupName `
    -ResourceType 'Microsoft.HDInsight/clusters' `
    -ResourceName $clusterName `
    -ApiVersion '2015-03-01-preview' `
    -Action 'updateclusteridentitycertificate' `
    -Parameters @{ ApplicationId = $appId; Certificate = $certString; CertificatePassword = $certPassword.ToString() } `
    -Force

Дальнейшие действия

Из этой статьи вы узнали, как использовать HDFS-совместимую службу Azure Data Lake Storage 1-го поколения с HDInsight. Это хранилище позволяет создавать адаптируемые долгосрочные решения для сбора архивных данных. А также использовать HDInsight для разблокирования информации внутри структурированных и неструктурированных данных.

Дополнительные сведения см. в разделе: