Un volume externe est un système de fichiers distribué et une solution de stockage de données fournis par MaxCompute. Il fonctionne comme un objet dans MaxCompute qui mappe un chemin d'accès dans Object Storage Service (OSS). Créez un volume externe pour monter un chemin OSS et utilisez le système de gestion des autorisations de MaxCompute pour un contrôle d'accès granulaire. Utilisez également les moteurs de calcul MaxCompute pour traiter les fichiers du volume externe. Chaque projet peut contenir plusieurs volumes externes. Cette rubrique explique comment utiliser les volumes externes MaxCompute pour traiter des données non structurées.
Prérequis
La fonctionnalité de volume externe est activée. Pour plus d'informations, consultez la rubrique Demander l'utilisation d'essai des nouvelles fonctionnalités.
-
Le client MaxCompute version 0.43.0 ou ultérieure est installé. Pour plus d'informations, consultez la rubrique Se connecter à l'aide du client local (odpscmd).
Si vous utilisez un SDK, le SDK Java doit être en version 0.43.0 ou ultérieure. Pour plus d'informations, consultez les Notes de version.
-
Activez OSS, créez un bucket et accordez à votre projet MaxCompute les autorisations nécessaires pour accéder à OSS. Pour plus d'informations, consultez la rubrique Autorisation en mode STS.
RemarqueLes données d'un volume externe sont stockées dans OSS. MaxCompute ne facture pas de frais de stockage distincts pour les données d'un volume externe. Des frais de calcul s'appliquent lorsque vous utilisez des moteurs de calcul MaxCompute, tels que Spark on MaxCompute et les jobs MapReduce, pour lire et traiter les données d'un volume externe. Les résultats générés par les moteurs de calcul MaxCompute, tels que les données d'index créées par Proxima CE, sont également stockés dans le volume externe ; OSS facture ce stockage.
Démarrage rapide
-
Accordez les autorisations.
RemarquePour utiliser un volume externe, vous avez besoin des autorisations suivantes : CreateInstance, CreateVolume, List, Read et Write. Pour plus d'informations, consultez la rubrique Autorisations MaxCompute.
-
Exécutez la commande suivante pour vérifier si l'utilisateur actuel dispose de l'autorisation
CreateVolume.SHOW grants FOR <user_name>; -
Si l'utilisateur ne dispose pas de l'autorisation CreateVolume, exécutez la commande suivante pour la lui accorder.
GRANT CreateVolume ON project <project_name> TO USER <user_name>;Pour révoquer l'autorisation, exécutez la commande suivante.
REVOKE CreateVolume ON project <project_name> FROM USER <user_name>; -
Exécutez à nouveau la commande
SHOW GRANTSpour confirmer que l'utilisateur dispose de l'autorisationCreateVolume.
-
-
Créez un volume externe.
Exécutez la commande suivante pour créer un volume externe.
vfs -create <volume_name> -storage_provider oss -url <oss://oss_endpoint/bucket_name/directory_name> [-acd <true|false>] -role_arn <arn:aliyun:xxx/aliyunodpsdefaultrole>Pour obtenir la description des paramètres et découvrir d'autres opérations, consultez la rubrique Opérations sur les volumes externes.
Après la création d'un volume externe, son chemin d'accès dans MaxCompute est
odps://[project_name]/[volume_name]. Dans ce chemin, project_name correspond au nom de votre projet MaxCompute et volume_name au nom du volume externe. Les moteurs de calcul tels que Spark et les jobs MapReduce peuvent utiliser ce chemin. -
Consultez les volumes externes créés.
Exécutez la commande suivante pour afficher les volumes externes créés.
vfs -ls /;
Cas d'utilisation
Utiliser Spark on MaxCompute avec des volumes externes
Spark on MaxCompute est un service de calcul fourni par MaxCompute, compatible avec Spark open source. Il offre un framework de calcul Spark basé sur un système unifié pour les ressources de calcul, les jeux de données et les autorisations. Cela vous permet de soumettre et d'exécuter des jobs Spark en utilisant des méthodes de développement familières pour répondre à une large gamme de besoins en matière de traitement et d'analyse des données. Si vous avez besoin d'un contrôle d'accès granulaire, utilisez un volume externe pour gérer l'accès via le système d'autorisations de l'entrepôt de données. Pour plus d'informations, consultez la rubrique Accéder à OSS depuis Spark on MaxCompute.
Référencer des ressources depuis un volume externe
Lors du démarrage d'un job Spark, vous pouvez référencer directement des ressources depuis un volume externe. Ces ressources, spécifiées à l'aide de paramètres, sont automatiquement téléchargées dans le répertoire de travail.
Fichier : un fichier peut être de n'importe quel type, tel que
jaroupy.Archive : un fichier compressé dans l'un des formats suivants :
zip,tar.gzoutar.
La différence réside dans le fait qu'un fichier est directement téléchargé dans le répertoire de travail actuel du job. Une archive est téléchargée puis automatiquement extraite dans le répertoire de travail actuel. Utilisez les deux paramètres suivants pour permettre à votre programme Spark de traiter les données du volume externe :
Configurez les paramètres suivants dans la section Parameters d'un nœud ODPS Spark dans DataWorks ou dans le fichier spark-defaults.conf. Ne les configurez pas directement dans le code.
|
Paramètre |
Description |
|
spark.hadoop.odps.cupid.volume.files |
Spécifie les ressources de fichiers requises pour le job. Séparez plusieurs fichiers par des virgules. Ces fichiers sont téléchargés dans le répertoire de travail du job Spark.
|
|
spark.hadoop.odps.cupid.volume.archives |
Spécifie les fichiers d'archive requis pour le job. Séparez plusieurs fichiers d'archive par des virgules. Les fichiers sont téléchargés dans le répertoire de travail actuel du job Spark et extraits.
|
Traiter les ressources OSS dans un volume externe
Pour accéder aux ressources d'un volume externe depuis votre code pendant l'exécution du job, configurez les paramètres suivants dans votre job Spark.
|
Paramètre |
Description |
|
spark.hadoop.odps.volume.common.filesystem |
Permet à Spark on MaxCompute de reconnaître un volume externe. Définissez la valeur sur La valeur par défaut est |
|
spark.hadoop.odps.cupid.volume.paths |
Spécifie le chemin du volume externe à accéder.
|
|
spark.hadoop.fs.odps.impl |
Classe d'implémentation permettant à Spark on MaxCompute d'accéder à OSS. La valeur est fixe : |
|
spark.hadoop.fs.AbstractFileSystem.odps.impl |
Classe d'implémentation permettant à Spark on MaxCompute d'accéder à OSS. La valeur est fixe : |
Exemple de code : cet exemple utilise l'algorithme K-means pour générer un modèle à partir de données d'entraînement (odps://ms_proj1_dev/volume_yyy1/kmeans_data.txt) et l'enregistre dans le chemin odps://ms_proj1_dev/volume_yyy1/target/PythonKMeansExample/KMeansModel. Il utilise ensuite le modèle pour classifier les données cibles et stocke les résultats dans le chemin 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()
Après l'exécution, vous pouvez consulter les données résultantes dans le répertoire OSS mappé au volume externe.
Utiliser Proxima CE pour le calcul vectoriel
Cette section fournit des instructions et un exemple sur l'utilisation de Proxima CE pour la vectorisation dans MaxCompute.
-
Installez le package de ressources Proxima CE.
-
Exécutez un job.
-
Limitations :
-
Le SDK Proxima pour Java prend actuellement en charge l'exécution des commandes de tâches uniquement sur un client MaxCompute fonctionnant sous Linux ou macOS.
RemarqueLes jobs Proxima CE se composent de deux parties : les tâches locales et les tâches MaxCompute. Les tâches locales sont des modules fonctionnels qui n'impliquent pas de jobs SQL, MapReduce ou Graph MaxCompute. Les tâches MaxCompute sont des jobs exécutés par des moteurs MaxCompute tels que SQL, MapReduce et Graph. Ces deux types de tâches s'exécutent alternativement. Lorsqu'un job Proxima CE démarre, il tente d'abord de charger le noyau Proxima sur la machine locale où le job est exécuté, en utilisant le client MaxCompute. Si le chargement du noyau réussit, certains modules s'exécutent localement et appellent des fonctions basées sur le noyau Proxima. En cas d'échec du chargement du noyau, une erreur est signalée, mais les opérations suivantes ne sont pas affectées et les modules appellent des fonctions de secours à la place. Étant donné que le package JAR du job contient des dépendances liées à Linux, il ne peut pas être exécuté sur un client MaxCompute sous un système d'exploitation Windows.
L'exécution de jobs à partir de nœuds MapReduce DataWorks n'est pas prise en charge pour le moment. La version sous-jacente du client MaxCompute intégrée au nœud MapReduce est en cours de mise à niveau, ce qui entraîne l'échec des jobs. Pour l'instant, soumettez les jobs à l'aide du client MaxCompute.
-
-
Préparez les données :
-- 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'); -
Exemple de code de 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 ; -
Exemple de résultat : exécutez la commande
select * from output_table_float_smoke where pt='20230116';pour interroger la table de résultats.+------------+------------+------------+------------+ | 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 | +------------+------------+------------+------------+
-