Acessando dados de aplicativos
Ao usar a API de tarefas do Spark, você pode armazenar os arquivos de tarefas do aplicativo e seus arquivos de dados em volumes de armazenamento que podem ser gerenciados usando a API IBM Cloud Pak for Data de volumes ou, alternativamente, você pode provisionar uma instância do IBM Cloud Object Storage.
Seus arquivos podem estar localizados no sistema de armazenamento de arquivos no cluster do IBM Cloud Pak for Data ou no IBM Cloud Object Storage. Consulte Considerações sobre o armazenamento.
Trabalhando com arquivos em volumes externos
Em aplicativos Spark executados usando Analytics Engine powered by Apache Spark, uma maneira comum de referenciar os arquivos de trabalho do Spark, os dados de entrada ou os dados de saída é por meio de volumes de armazenamento externos que você pode gerenciar usando a API de IBM Cloud Pak for Data volumes.
É possível trabalhar com os volumes externos a seguir:
- Volume de armazenamento NFS externo
- Veja como criar um volume em um servidor NFS externo em Criar um volume em um servidor NFS externo.
- Solicitação de volume persistente existente
- Consulte Criar um volume em uma reivindicação de volume persistente.
- Nova instância de volume
- Consulte Gerenciando instâncias de volume persistente.
Para saber como usar uma instância de volume para criar diretórios e incluir seus arquivos de aplicativo, consulte Gerenciando instâncias de volume persistente com a API de Volumes.
Trabalhando com arquivos em diversos volumes de armazenamento
É possível usar diversos volumes de armazenamento ao criar a carga útil de tarefa do Spark.
O exemplo a seguir mostra um aplicativo Spark que é transferido por upload sob o diretório customApps dentro do volume vol1, que é montado como /myapp no cluster do Spark. Os dados do usuário estão no volume vol2 que é montado como /data no cluster do Spark.
{
"application_details": {
"application": "/myapp/<spark_application>",
"arguments": [
""
],
"conf": {
"spark.app.name": "JSFVT",
"spark.executor.extraClassPath": "/myapp/*",
"spark.driver.extraClassPath": "/myapp/*"
}
},
"volumes": [
{
"name": "<project_name>::vol1",
"mount_path": "/myapp",
"source_sub_path": "customApps"
},
{
"name": "<project_name>::vol2",
"source_sub_path": "",
"mount_path": "/data"
}
]
}
Trabalhando com arquivos no Object Storage
É possível armazenar os arquivos de tarefas e seus dados em um depósito do Object Storage compatível com S3. As etapas a seguir descrevem como isso pode ser feito para um bucket do IBM Cloud Object Storage.
- Crie seu aplicativo, por exemplo, um arquivo de programa Python cosExample.py:
from __future__ import print_function
import sys
import calendar
import time
from pyspark.sql import SparkSession
if __name__ == "__main__":
if len(sys.argv) != 5:
print("Usage: cosExample <access-key> <secret-key> <endpoint> <bucket>", file=sys.stderr)
sys.exit(-1)
spark = SparkSession.builder.appName("CosExample").getOrCreate()
prefix = "fs.cos.llservice"
hconf = spark.sparkContext._jsc.hadoopConfiguration()
hconf.set(prefix +".endpoint", sys.argv[3])
hconf.set(prefix + ".access.key", sys.argv[1])
hconf.set(prefix + ".secret.key", sys.argv[2])
data = [1, 2, 3, 4, 5, 6]
distData = spark.sparkContext.parallelize(data)
distData.count()
path = "cos://{}.llservice/{}".format(sys.argv[4], calendar.timegm(time.gmtime()))
distData.saveAsTextFile(path)
rdd = spark.sparkContext.textFile(path)
print ("output rdd count: {}". format(rdd.count()))
spark.stop()
- Carregue o arquivo de tarefa. Para carregar o arquivo de tarefa por meio de um volume externo, faça upload de cosExample.py sob o diretório
customAppsno volume de armazenamentovol1, que é montado como/myappno cluster do Spark:
{
"application_details": {
"application": "/myapp/cosExample.py",
"arguments": ["<ACCESS_KEY>", "<COS_SECRET_KEY>", "<COS_ENDPOINT>", "<BUCKET_NAME>"],
"class": "org.apache.spark.deploy.SparkSubmit",
"conf": {
"spark.app.name": "Job1",
"spark.executor.extraClassPath": "/myapp/*",
"spark.driver.extraClassPath": "/myapp/*"
}
},
"volumes": [{
"name": "<project_name>::vol1",
"mount_path": "/myapp",
"source_sub_path": "customApps"
}]
}
- Como alternativa, para carregar o arquivo de tarefa por meio de um depósito do IBM Cloud Object Storage, faça o upload do arquivo de tarefa no
<OBJECT_NAME>por meio do depósito<BUCKET_NAME>no serviço IBM Cloud Object Storage (<COS_SERVICE_NAME>):
{
"application_details": {
"application": "cos://<BUCKET_NAME>.<COS_SERVICE_NAME>/<OBJECT_NAME>",
"arguments": ["cos://<BUCKET_NAME>.<COS_SERVICE_NAME>/<OBJECT_NAME>"],
"class": "<main_class>",
"conf": {
"spark.app.name": "MyJob",
"spark.hadoop.fs.cos.<COS_SERVICE_NAME>.endpoint": "<COS_ENDPOINT>",
"spark.hadoop.fs.cos.<COS_SERVICE_NAME>.secret.key": "<COS_SECRET_KEY>",
"spark.hadoop.fs.cos.<COS_SERVICE_NAME>.access.key": "<COS_ACCESS_KEY>"
}
}
}