O volume externo é uma solução de sistema de arquivos distribuído e armazenamento de dados do MaxCompute. Ele funciona como um objeto no MaxCompute mapeado para um caminho no Object Storage Service (OSS). Crie um volume externo para montar um caminho do OSS e usar o sistema de gerenciamento de permissões do MaxCompute para controle de acesso granular. Os mecanismos de computação do MaxCompute também processam arquivos no volume externo. Cada projeto pode conter vários volumes externos. Este tópico descreve como usar volumes externos do MaxCompute para processar dados não estruturados.
Pré-requisitos
O recurso de volume externo está ativado. Para mais informações, consulte Apply for trial use of new features.
-
O cliente MaxCompute v0.43.0 ou posterior está instalado. Para mais informações, consulte Connect using the local client (odpscmd).
Se você usar um SDK, o Java SDK deve ser v0.43.0 ou posterior. Para mais informações, consulte Release notes.
-
Ative o OSS, crie um bucket e conceda permissões ao seu projeto MaxCompute para acessar o OSS. Para mais informações, consulte STS mode authorization.
NotaOs dados em um volume externo são armazenados no OSS. O MaxCompute não cobra taxas separadas de armazenamento para dados em um volume externo. Taxas de computação são cobradas quando você usa mecanismos de computação do MaxCompute, como Spark on MaxCompute e jobs MapReduce, para ler e processar dados em um volume externo. Os resultados gerados pelos mecanismos de computação do MaxCompute, como dados de índice criados pelo Proxima CE, também são armazenados no volume externo, e o OSS cobra por esse armazenamento.
Início rápido
-
Conceda permissões.
NotaPara usar um volume externo, são necessárias as seguintes permissões: CreateInstance, CreateVolume, List, Read e Write. Para mais informações, consulte MaxCompute permissions.
-
Execute o comando a seguir para verificar se o usuário atual tem a permissão
CreateVolume.SHOW grants FOR <user_name>; -
Caso o usuário não tenha a permissão CreateVolume, execute o comando a seguir para concedê-la.
GRANT CreateVolume ON project <project_name> TO USER <user_name>;Para revogar a permissão, execute o comando a seguir.
REVOKE CreateVolume ON project <project_name> FROM USER <user_name>; -
Execute novamente o comando
SHOW GRANTSpara confirmar que o usuário tem a permissãoCreateVolume.
-
-
Crie um volume externo.
Execute o comando a seguir para criar um volume externo.
vfs -create <volume_name> -storage_provider oss -url <oss://oss_endpoint/bucket_name/directory_name> [-acd <true|false>] -role_arn <arn:aliyun:xxx/aliyunodpsdefaultrole>Para descrições de parâmetros e mais operações, consulte External volume operations.
Após criar um volume externo, o caminho dele no MaxCompute será
odps://[project_name]/[volume_name]. Nesse caminho, project_name é o nome do seu projeto MaxCompute e volume_name é o nome do volume externo. Mecanismos de computação como Spark e jobs MapReduce podem usar esse caminho. -
Visualize os volumes externos criados.
Execute o comando a seguir para visualizar os volumes externos criados.
vfs -ls /;
Casos de uso
Use Spark on MaxCompute com volumes externos
O Spark on MaxCompute é um service de computação do MaxCompute compatível com o Spark open source. Ele oferece um framework de computação Spark sobre um sistema unificado de recursos de computação, conjuntos de dados e permissões. Isso permite enviar e executar jobs Spark usando métodos de desenvolvimento familiares para atender a diversas necessidades de processamento e análise de dados. Se for necessário controle de permissão granular, use um volume externo para gerenciar o acesso por meio do sistema de permissões do data warehouse. Para mais informações, consulte Access OSS from Spark on MaxCompute.
Referencie recursos de um volume externo
Ao iniciar um job Spark, referencie diretamente recursos de um volume externo. Esses recursos, especificados por meio de parâmetros, são baixados automaticamente para o diretório de trabalho.
Arquivo: Pode ser de qualquer tipo, como
jaroupy.Arquivo compactado: Um arquivo comprimido em um dos seguintes formatos:
zip,tar.gzoutar.
A diferença é que um arquivo é baixado diretamente para o diretório de trabalho atual do job. Já um arquivo compactado é baixado e extraído automaticamente no diretório de trabalho atual. Use os dois parâmetros a seguir para permitir que seu programa Spark processe dados no volume externo:
Configure os parâmetros a seguir na seção Parameters de um nó ODPS Spark no DataWorks ou no arquivo spark-defaults.conf. Não os configure no código.
|
Parâmetro |
Descrição |
|
spark.hadoop.odps.cupid.volume.files |
Especifica os recursos de arquivo necessários para o job. Separe múltiplos arquivos com vírgulas. Esses arquivos são baixados para o diretório de trabalho do job Spark.
|
|
spark.hadoop.odps.cupid.volume.archives |
Especifica os arquivos compactados necessários para o job. Separe múltiplos arquivos compactados com vírgulas. Os arquivos são baixados para o diretório de trabalho atual do job Spark e extraídos.
|
Processe recursos do OSS em um volume externo
Para acessar recursos em um volume externo a partir do seu código durante a execução do job, configure os seguintes parâmetros no seu job Spark.
|
Parâmetro |
Descrição |
|
spark.hadoop.odps.volume.common.filesystem |
Permite que o Spark on MaxCompute reconheça um volume externo. Defina o valor como O valor padrão é |
|
spark.hadoop.odps.cupid.volume.paths |
Especifica o caminho do volume externo a ser acessado.
|
|
spark.hadoop.fs.odps.impl |
Classe de implementação para o Spark on MaxCompute acessar o OSS. O valor é fixo: |
|
spark.hadoop.fs.AbstractFileSystem.odps.impl |
Classe de implementação para o Spark on MaxCompute acessar o OSS. O valor é fixo: |
Exemplo de código: Este exemplo usa o algoritmo K-means para gerar um modelo a partir de dados de treinamento (odps://ms_proj1_dev/volume_yyy1/kmeans_data.txt) e o salva no caminho odps://ms_proj1_dev/volume_yyy1/target/PythonKMeansExample/KMeansModel. Em seguida, usa o modelo para classificar dados alvo e armazena os resultados no caminho odps://ms_proj1_dev/volume_yyy1/target/PythonKMeansExample/KMeansModel/data.
-- Configurations
spark.hadoop.odps.cupid.volume.paths=odps://ms_proj1_dev/volume_yyy1/
spark.hadoop.odps.volume.common.filesystem=true
spark.hadoop.fs.odps.impl=org.apache.hadoop.fs.aliyun.volume.OdpsVolumeFileSystem
spark.hadoop.fs.AbstractFileSystem.odps.impl=org.apache.hadoop.fs.aliyun.volume.abstractfsimpl.OdpsVolumeFs
spark.hadoop.odps.access.id=xxxxxxxxx
spark.hadoop.odps.access.key=xxxxxxxxx
spark.hadoop.fs.oss.endpoint=oss-cn-beijing-internal.aliyuncs.com
spark.hadoop.odps.cupid.resources=ms_proj1_dev.jindofs-sdk-3.8.0.jar
spark.hadoop.fs.oss.impl=com.aliyun.emr.fs.oss.JindoOssFileSystem
spark.hadoop.odps.cupid.resources=public.python-2.7.13-ucs4.tar.gz
spark.pyspark.python=./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python
spark.hadoop.odps.spark.version=spark-2.4.5-odps0.34.0
-- Code
from numpy import array
from math import sqrt
from pyspark import SparkContext
from pyspark.mllib.clustering import KMeans, KMeansModel
if __name__ == "__main__":
sc = SparkContext(appName="KMeansExample") # SparkContext
# Load and parse the data
data = sc.textFile("odps://ms_proj1_dev/volume_yyy1/kmeans_data.txt")
parsedData = data.map(lambda line: array([float(x) for x in line.split(' ')]))
# Build the model (cluster the data)
clusters = KMeans.train(parsedData, 2, maxIterations=10, initializationMode="random")
# Evaluate clustering by computing Within Set Sum of Squared Errors
def error(point):
center = clusters.centers[clusters.predict(point)]
return sqrt(sum([x**2 for x in (point - center)]))
WSSSE = parsedData.map(lambda point: error(point)).reduce(lambda x, y: x + y)
print("Within Set Sum of Squared Error = " + str(WSSSE))
# Save and load model
clusters.save(sc, "odps://ms_proj1_dev/volume_yyy1/target/PythonKMeansExample/KMeansModel")
print(parsedData.map(lambda feature: clusters.predict(feature)).collect())
sameModel = KMeansModel.load(sc, "odps://ms_proj1_dev/volume_yyy1/target/PythonKMeansExample/KMeansModel")
print(parsedData.map(lambda feature: sameModel.predict(feature)).collect())
sc.stop()
Após a execução, visualize os dados resultantes no diretório do OSS mapeado para o volume externo.
Use Proxima CE para computação vetorial
Esta seção fornece instruções e um exemplo de como usar o Proxima CE para vetorização no MaxCompute.
-
Instale o pacote de recursos do Proxima CE.
-
Execute um job.
-
Limitações:
-
Atualmente, o Proxima SDK for Java suporta apenas a execução de comandos de tarefa em um cliente MaxCompute rodando em Linux ou macOS.
NotaOs jobs do Proxima CE consistem em duas partes: tarefas locais e tarefas do MaxCompute. Tarefas locais são módulos funcionais que não envolvem SQL do MaxCompute, MapReduce ou jobs Graph. Tarefas do MaxCompute são jobs executados por mecanismos do MaxCompute, como SQL, MapReduce e Graph. Esses dois tipos de tarefas são executados alternadamente. Quando um job do Proxima CE inicia, ele primeiro tenta carregar o kernel do Proxima na máquina local onde o job é executado, usando o cliente MaxCompute. Se o kernel carregar com sucesso, certos módulos rodam localmente e chamam funções baseadas no kernel do Proxima. Se o kernel falhar ao carregar, um erro é relatado, mas as operações subsequentes não são afetadas, e os módulos chamam funções de fallback. Como o pacote JAR do job contém dependências relacionadas ao Linux, ele não pode ser executado em um cliente MaxCompute em um sistema operacional Windows.
A execução de jobs a partir de nós MapReduce do DataWorks não é suportada atualmente. A versão subjacente do cliente MaxCompute integrada ao nó MapReduce está sendo atualizada, o que causa falhas nos jobs. Por enquanto, envie jobs usando o cliente MaxCompute.
-
-
Prepare os dados:
-- Create input tables. CREATE TABLE doc_table_float_smoke(pk STRING, vector STRING) PARTITIONED BY (pt STRING); CREATE TABLE query_table_float_smoke(pk STRING, vector STRING) PARTITIONED BY (pt STRING); -- Insert data into the doc table (base table). ALTER TABLE doc_table_float_smoke add PARTITION(pt='20230116'); INSERT OVERWRITE TABLE doc_table_float_smoke PARTITION (pt='20230116') VALUES ('1.nid','1~1~1~1~1~1~1~1'), ('2.nid','2~2~2~2~2~2~2~2'), ('3.nid','3~3~3~3~3~3~3~3'), ('4.nid','4~4~4~4~4~4~4~4'), ('5.nid','5~5~5~5~5~5~5~5'), ('6.nid','6~6~6~6~6~6~6~6'), ('7.nid','7~7~7~7~7~7~7~7'), ('8.nid','8~8~8~8~8~8~8~8'), ('9.nid','9~9~9~9~9~9~9~9'), ('10.nid','10~10~10~10~10~10~10~10'); -- Insert data into the query table. ALTER TABLE query_table_float_smoke add PARTITION(pt='20230116'); INSERT OVERWRITE TABLE query_table_float_smoke PARTITION (pt='20230116') VALUES ('q1.nid','1~1~1~1~2~2~2~2'), ('q2.nid','4~4~4~4~3~3~3~3'), ('q3.nid','9~9~9~9~5~5~5~5'); -
Código de exemplo do job:
jar -libjars proxima-ce-aliyun-1.0.0.jar -classpath proxima-ce-aliyun-1.0.0.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table doc_table_float_smoke -doc_table_partition 20230116 -query_table query_table_float_smoke -query_table_partition 20230116 -output_table output_table_float_smoke -output_table_partition 20230116 -data_type float -dimension 8 -topk 1 -job_mode train:build:seek:recall -external_volume shanghai_vol_ceshi -owner_id 1248953xxx ; -
Resultado de exemplo: Execute o comando
select * from output_table_float_smoke where pt='20230116';para consultar a tabela de resultados.+------------+------------+------------+------------+ | pk | knn_result | score | pt | +------------+------------+------------+------------+ | q1.nid | 2.nid | 4.0 | 20230116 | | q1.nid | 1.nid | 4.0 | 20230116 | | q1.nid | 3.nid | 20.0 | 20230116 | | q2.nid | 4.nid | 4.0 | 20230116 | | q2.nid | 3.nid | 4.0 | 20230116 | | q2.nid | 2.nid | 20.0 | 20230116 | | q3.nid | 7.nid | 32.0 | 20230116 | | q3.nid | 8.nid | 40.0 | 20230116 | | q3.nid | 6.nid | 40.0 | 20230116 | +------------+------------+------------+------------+
-