Настройка автономной искры для доступа к хранилищу Azure - PullRequest
0 голосов
/ 21 мая 2018

Мне нужно иметь возможность запустить spark на моей локальной машине, чтобы получить доступ к azure wasb и adl url, но я не могу заставить его работать.У меня есть урезанный пример:

maven pom.xml (Совершенно новый pom, установлены только зависимости):

<dependencies>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_2.11</artifactId>
  <version>2.3.0</version>
</dependency>
  <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_2.11</artifactId>
      <version>2.3.0</version>
  </dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.8.0</version>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-azure-datalake</artifactId>
  <version>3.1.0</version>
</dependency>
<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-storage</artifactId>
  <version>6.0.0</version>
</dependency>
<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-data-lake-store-sdk</artifactId>
  <version>2.2.3</version>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-azure</artifactId>
  <version>3.1.0</version>
</dependency>
<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-storage</artifactId>
  <version>7.0.0</version>
</dependency>

Java-код (Не нужно быть java - может быть scala):

import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.SparkSession;

public class App {
    public static void main(String[] args) {
        SparkConf config = new SparkConf();
        config.setMaster("local");
        config.setAppName("app");
        SparkSession spark = new SparkSession(new SparkContext(config));
        spark.read().parquet("wasb://container@host/path");
        spark.read().parquet("adl://host/path");
    }
}

Независимо от того, что я пытаюсь, я получаю:

Exception in thread "main" java.io.IOException: No FileSystem for scheme: wasb

То же самое для adl.Каждый документ, который я могу найти по этому вопросу, либо просто говорит о добавлении зависимости Azure-Storage, что я сделал, либо говорит об использовании HDInsight.

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я понял это и решил опубликовать рабочий проект, так как это всегда то, что я ищу.Он размещен здесь:

лазурная искра-локальный образец

Суть его в том, что @Shankar Koirala предложил:

Для WASBустановите свойство, чтобы разрешить распознавание схемы URL:

config.set("spark.hadoop.fs.wasb.impl", "org.apache.hadoop.fs.azure.NativeAzureFileSystem");

Затем установите свойство, которое разрешает доступ к учетной записи.Вам понадобится один из них для каждой учетной записи, к которой вам нужен доступ.Они создаются через портал Azure в разделе «Ключи доступа» блейда учетной записи хранения.

    config.set("fs.azure.account.key.[storage-account-name].blob.core.windows.net", "[access-key]");

Теперь для adl назначьте схему fs как с WASB:

    config.set("spark.hadoop.fs.adl.impl", "org.apache.hadoop.fs.adl.AdlFileSystem");
    // I don't know why this would be needed, but I saw it
    // on an otherwise very helpful page . . .
    config.set("spark.fs.AbstractFileSystem.adl.impl", "org.apache.hadoop.fs.adl.Adl");

.,,и, наконец, установите ключи доступа клиента в этих свойствах, опять же для каждой отдельной учетной записи, к которой вам нужно получить доступ:

    config.set("fs.adl.oauth2.access.token.provider.type", "ClientCredential");

    /* Client ID is generally the application ID from the azure portal app registrations*/
    config.set("fs.adl.oauth2.client.id", "[client-id]");

    /*The client secret is the key generated through the portal*/
    config.set("fs.adl.oauth2.credential", "[client-secret]");

    /*This is the OAUTH 2.0 TOKEN ENDPOINT under the ENDPOINTS section of the app registrations under Azure Active Directory*/
    config.set("fs.adl.oauth2.refresh.url", "[oauth-2.0-token-endpoint]");

Я надеюсь, что это полезно, и я хотел бы отдать должное Шанкару за ответ,но я также хотел получить точные детали там.

0 голосов
/ 21 мая 2018

Я не уверен, что adl не проверял, но для wasb вам нужно определить файловую систему, которая будет использоваться в базовых Hadoop конфигурациях.

Поскольку вы используетеВ spark 2.3 вы можете использовать сеанс spark для создания точки входа как

val spark = SparkSession.builder().appName("read from azure storage").master("local[*]").getOrCreate()

Теперь определите файловую систему

spark.sparkContext.hadoopConfiguration.set("fs.azure", "org.apache.hadoop.fs.azure.NativeAzureFileSystem")
spark.sparkContext.hadoopConfiguration.set("fs.azure.account.key.yourAccount.blob.core.windows.net", "yourKey ")

Теперь прочитайте файл паркета как

val baseDir = "wasb[s]://BlobStorageContainer@yourUser.blob.core.windows.net/"

val dfParquet = spark.read.parquet(baseDir + "pathToParquetFile")

Надеюсь, это поможет!

...