Κοινοποίηση μέσω


Εγγενής μηχανή εκτέλεσης για Fabric Data Engineering

Ο εγγενής μηχανισμός εκτέλεσης είναι μια πρωτοποριακή βελτίωση για εκτελέσεις εργασιών Apache Spark στο Microsoft Fabric. Αυτός ο διανυσματικός μηχανισμός βελτιστοποιεί την απόδοση και την αποδοτικότητα των ερωτημάτων Spark εκτελώντας τα απευθείας στην υποδομή lakehouse σας. Η απρόσκοπτη ενοποίηση της μηχανής σημαίνει ότι δεν απαιτεί τροποποιήσεις κώδικα και αποτρέπει το κλείδωμα προμηθευτή. Υποστηρίζει API Apache Spark και είναι συμβατό με το Runtime 1.3 (Apache Spark 3.5) και λειτουργεί με μορφή Parquet και Delta. Ανεξάρτητα από τη θέση των δεδομένων σας στο OneLake ή εάν αποκτάτε πρόσβαση σε δεδομένα μέσω συντομεύσεων, ο εγγενής μηχανισμός εκτέλεσης μεγιστοποιεί την αποτελεσματικότητα και τις επιδόσεις.

Ο εγγενής μηχανισμός εκτέλεσης αυξάνει σημαντικά την απόδοση των ερωτημάτων, ελαχιστοποιώντας παράλληλα το κόστος λειτουργίας. Προσφέρει αξιοσημείωτη βελτίωση ταχύτητας, επιτυγχάνοντας έως και τέσσερις φορές ταχύτερη απόδοση σε σύγκριση με το παραδοσιακό OSS (λογισμικό ανοιχτού κώδικα) Spark, όπως επικυρώνεται από το σημείο αναφοράς TPC-DS 1 TB. Η μηχανή είναι έμπειρη στη διαχείριση μιας μεγάλης γκάμας σεναρίων επεξεργασίας δεδομένων, που κυμαίνονται από συνήθεις προσλήψεις δεδομένων, εργασίες δέσμης και εργασίες ETL (εξαγωγή, μετασχηματισμός, φόρτωση), έως σύνθετες αναλύσεις επιστήμης δεδομένων και δυναμικά αλληλεπιδραστικά ερωτήματα. Οι χρήστες επωφελούνται από τους επιταχυνόμενους χρόνους επεξεργασίας, την αυξημένη ταχύτητα μετάδοσης και τη βελτιστοποιημένη χρήση πόρων.

Ο εγγενής μηχανισμός εκτέλεσης βασίζεται σε δύο βασικά στοιχεία του OSS: το Velox, μια βιβλιοθήκη επιτάχυνσης βάσης δεδομένων C++ που παρουσιάστηκε από τη Meta και το Apache Meta (incubating), ένα μεσαίο επίπεδο που ευθύνεται για τη μείωση της φόρτωσης της εκτέλεσης κινητήρων SQL που βασίζονται σε JVM σε εγγενείς κινητήρες που εισήγαγε η Intel.

Πότε να χρησιμοποιείτε τον εγγενή μηχανισμό εκτέλεσης

Ο εγγενής μηχανισμός εκτέλεσης προσφέρει μια λύση για την εκτέλεση ερωτημάτων σε σύνολα δεδομένων μεγάλης κλίμακας. Βελτιστοποιεί την απόδοση χρησιμοποιώντας τις εγγενείς δυνατότητες των υποκείμενων προελεύσεων δεδομένων και ελαχιστοποιώντας την επιβάρυνση που συνήθως σχετίζεται με τη μετακίνηση δεδομένων και τη σειριοποίηση σε παραδοσιακά περιβάλλοντα Spark. Ο μηχανισμός υποστηρίζει διάφορους τελεστές και τύπους δεδομένων, συμπεριλαμβανομένων των συγκεντρωτικών αποτελεσμάτων συνάθροισης, της ένθετης ένωσης ένθετων βρόχων μετάδοσης (BNLJ) και επακριβών μορφών χρονικής σήμανσης. Ωστόσο, για να επωφεληθείτε πλήρως από τις δυνατότητες της μηχανής, θα πρέπει να εξετάσετε τις βέλτιστες περιπτώσεις χρήσης:

  • Η μηχανή είναι αποτελεσματική όταν εργάζεται με δεδομένα σε μορφές Parquet και Delta, τις οποίες μπορεί να επεξεργαστεί εγγενώς και αποτελεσματικά.
  • Τα ερωτήματα που περιλαμβάνουν περίπλοκους μετασχηματισμούς και συναθροίσεις επωφελούνται σημαντικά από τις δυνατότητες επεξεργασίας στηλών και διανυσματικής λειτουργίας του μηχανισμού.
  • Η βελτίωση των επιδόσεων είναι πιο σημαντική σε σενάρια όπου τα ερωτήματα δεν ενεργοποιούν τον εναλλακτικό μηχανισμό, αποφεύγοντας μη υποστηριζόμενες δυνατότητες ή παραστάσεις.
  • Ο μηχανισμός είναι κατάλληλος για ερωτήματα που κάνουν εντατική χρήση υπολογιστικών υπολογισμών, αντί για απλή σύνδεση με I/O.

Για πληροφορίες σχετικά με τους τελεστές και τις συναρτήσεις που υποστηρίζονται από τον εγγενή μηχανισμό εκτέλεσης, ανατρέξτε στην τεκμηρίωση για τη μέθοδο Apache Url.

Ενεργοποίηση του εγγενούς μηχανισμού εκτέλεσης

Για να χρησιμοποιήσετε τις πλήρεις δυνατότητες του εγγενούς μηχανισμού εκτέλεσης κατά τη φάση προεπισκόπησης, απαιτούνται συγκεκριμένες ρυθμίσεις παραμέτρων. Οι παρακάτω διαδικασίες δείχνουν πώς μπορείτε να ενεργοποιήσετε αυτήν τη δυνατότητα για σημειωματάρια, ορισμούς εργασιών Spark και ολόκληρα περιβάλλοντα.

Σημαντικό

Ο εγγενής μηχανισμός εκτέλεσης υποστηρίζει την τελευταία έκδοση χρόνου εκτέλεσης GA, η οποία είναι η έκδοση Runtime 1.3 (Apache Spark 3.5, Delta Lake 3.2). Με την κυκλοφορία του εγγενούς μηχανισμού εκτέλεσης στο Runtime 1.3, η υποστήριξη για την προηγούμενη έκδοση—Runtime 1.2 (Apache Spark 3.4, Delta Lake 2.4)—διακόπτεται. Ενθαρρύνουμε όλους τους πελάτες να κάνουν αναβάθμιση στον τελευταίο χρόνο εκτέλεσης 1.3. Εάν χρησιμοποιείτε το Native Execution Engine στο Runtime 1.2, η εγγενής επιτάχυνση θα απενεργοποιηθεί.

Ενεργοποίηση σε επίπεδο περιβάλλοντος

Για να εξασφαλίσετε ομοιόμορφη βελτίωση των επιδόσεων, ενεργοποιήστε τον εγγενή μηχανισμό εκτέλεσης σε όλες τις εργασίες και σημειωματάρια που σχετίζονται με το περιβάλλον σας:

  1. Μεταβείτε στον χώρο εργασίας που περιέχει το περιβάλλον σας και επιλέξτε το περιβάλλον. Εάν δεν έχετε δημιουργήσει περιβάλλον, ανατρέξτε στο θέμα Δημιουργία, ρύθμιση παραμέτρων και χρήση περιβάλλοντος στο Fabric.

  2. Στην περιοχή Υπολογισμός σπινθήρα, επιλέξτε Επιτάχυνση.

  3. Επιλέξτε το πλαίσιο με την ετικέτα Ενεργοποίηση εγγενούς μηχανισμού εκτέλεσης.

  4. Αποθηκεύστε και δημοσιεύστε τις αλλαγές.

    Στιγμιότυπο οθόνης που δείχνει πώς μπορείτε να ενεργοποιήσετε τον εγγενή μηχανισμό εκτέλεσης μέσα στο στοιχείο περιβάλλοντος.

Όταν ενεργοποιηθεί στο επίπεδο περιβάλλοντος, όλες οι επόμενες εργασίες και σημειωματάρια μεταβιβάζονται στη ρύθμιση. Αυτή η μεταβίβαση εξασφαλίζει ότι οποιεσδήποτε νέες περίοδοι λειτουργίας ή πόροι που δημιουργούνται στο περιβάλλον επωφελούνται αυτόματα από τις βελτιωμένες δυνατότητες εκτέλεσης.

Σημαντικό

Στο παρελθόν, ο εγγενής μηχανισμός εκτέλεσης ενεργοποιήθηκε μέσω των ρυθμίσεων Spark εντός της ρύθμισης παραμέτρων περιβάλλοντος. Ο εγγενής μηχανισμός εκτέλεσης μπορεί πλέον να ενεργοποιηθεί πιο εύκολα χρησιμοποιώντας ένα κουμπί εναλλαγής στην καρτέλα Επιτάχυνση των ρυθμίσεων περιβάλλοντος. Για να συνεχίσετε να το χρησιμοποιείτε, μεταβείτε στην καρτέλα Επιτάχυνση και ενεργοποιήστε το κουμπί εναλλαγής. Μπορείτε επίσης να την ενεργοποιήσετε μέσω των ιδιοτήτων Spark, εάν προτιμάτε.

Ενεργοποίηση για ορισμό εργασίας σημειωματάριου ή Spark

Μπορείτε επίσης να ενεργοποιήσετε τον εγγενή μηχανισμό εκτέλεσης για ένα μόνο σημειωματάριο ή ορισμό εργασίας Spark. Πρέπει να ενσωματώσετε τις απαραίτητες ρυθμίσεις παραμέτρων στην αρχή της δέσμης ενεργειών εκτέλεσης:

%%configure 
{ 
   "conf": {
       "spark.native.enabled": "true", 
   } 
} 

Για σημειωματάρια, εισαγάγετε τις απαιτούμενες εντολές ρύθμισης παραμέτρων στο πρώτο κελί. Για ορισμούς εργασίας Spark, συμπεριλάβετε τις ρυθμίσεις στην πρώτη γραμμή του ορισμού εργασίας Spark. Ο εγγενής μηχανισμός εκτέλεσης ενσωματώνεται με χώρους συγκέντρωσης, επομένως, μόλις ενεργοποιήσετε τη δυνατότητα, τίθεται σε ισχύ αμέσως χωρίς να χρειάζεται να ξεκινήσετε μια νέα περίοδο λειτουργίας.

Στοιχείο ελέγχου σε επίπεδο ερωτήματος

Οι μηχανισμοί ενεργοποίησης του εγγενούς μηχανισμού εκτέλεσης στα επίπεδα μισθωτή, χώρου εργασίας και περιβάλλοντος, απρόσκοπτα ενοποιημένοι με το περιβάλλον εργασίας χρήστη, βρίσκονται υπό ενεργή ανάπτυξη. Εν τω μεταξύ, μπορείτε να απενεργοποιήσετε τον εγγενή μηχανισμό εκτέλεσης για συγκεκριμένα ερωτήματα, ειδικά εάν περιλαμβάνουν τελεστές που δεν υποστηρίζονται αυτήν τη στιγμή (ανατρέξτε στους περιορισμούς). Για να απενεργοποιήσετε, ορίστε τη ρύθμιση παραμέτρων Spark spark.native.enabled σε false για το συγκεκριμένο κελί που περιέχει το ερώτημά σας.

%%sql 
SET spark.native.enabled=FALSE; 

Στιγμιότυπο οθόνης που δείχνει πώς μπορείτε να απενεργοποιήσετε τον εγγενή μηχανισμό εκτέλεσης μέσα σε ένα σημειωματάριο.

Αφού εκτελέσετε το ερώτημα στο οποίο είναι απενεργοποιημένος ο εγγενής μηχανισμός εκτέλεσης, πρέπει να τον ενεργοποιήσετε ξανά για τα επόμενα κελιά, ορίζοντας το spark.native.enabled σε true. Αυτό το βήμα είναι απαραίτητο, επειδή το Spark εκτελεί κελιά κώδικα διαδοχικά.

%%sql 
SET spark.native.enabled=TRUE; 

Προσδιορισμός λειτουργιών που εκτελέστηκαν από τη μηχανή

Υπάρχουν διάφορες μέθοδοι για να προσδιορίσετε εάν έγινε επεξεργασία ενός τελεστή στην εργασία σας Apache Spark χρησιμοποιώντας τον εγγενή μηχανισμό εκτέλεσης.

Περιβάλλον εργασίας χρήστη Spark και διακομιστής ιστορικού Spark

Αποκτήστε πρόσβαση στο περιβάλλον εργασίας χρήστη Spark ή στο διακομιστή ιστορικού Spark για να εντοπίσετε το ερώτημα που πρέπει να ελέγξετε. Για να αποκτήσετε πρόσβαση στο περιβάλλον εργασίας web Spark, μεταβείτε στον ορισμό εργασίας Spark και εκτελέστε τον. Από την καρτέλα Εκτελείται, επιλέξτε το ... δίπλα στο Όνομα εφαρμογής και επιλέξτε περιβάλλοντος εργασίας web Open Spark . Μπορείτε επίσης να αποκτήσετε πρόσβαση στο περιβάλλον εργασίας χρήστη Spark από την καρτέλα Παρακολούθηση στον χώρο εργασίας. Επιλέξτε το σημειωματάριο ή τη διοχέτευση, από τη σελίδα παρακολούθησης, υπάρχει μια άμεση σύνδεση στο περιβάλλοντος εργασίας Spark για ενεργές εργασίες.

στιγμιότυπο οθόνης που δείχνει πώς μπορείτε να μεταβείτε στο περιβάλλον εργασίας web Spark.

Στο σχέδιο ερωτήματος που εμφανίζεται στη διασύνδεση Spark UI, αναζητήστε τυχόν ονόματα κόμβων που τελειώνουν με το επίθημα Transformer, *NativeFileScan ή VeloxColumnarToRowExec. Το επίθημα υποδεικνύει ότι ο εγγενής μηχανισμός εκτέλεσης εκτέλεσε τη λειτουργία. Για παράδειγμα, οι κόμβοι μπορεί να έχουν ετικέτα ως RollUpHashAggregateTransformer, ProjectExecTransformer, BroadcastHashJoinExecTransformer, ShuffledHashJoinExecTransformer ή BroadcastNestedLoopJoinExecTransformer.

Στιγμιότυπο οθόνης που δείχνει πώς μπορείτε να ελέγξετε την απεικόνιση DAG που τελειώνει με τον μετασχηματισμό επιθήματος.

Επεξήγηση dataFrame

Εναλλακτικά, μπορείτε να εκτελέσετε την df.explain() εντολή στο σημειωματάριό σας για να προβάλετε το σχέδιο εκτέλεσης. Εντός της εξόδου, αναζητήστε τα ίδια transformer, *NativeFileScan ή επιθήματα VeloxColumnarToRowExec. Αυτή η μέθοδος παρέχει έναν γρήγορο τρόπο για να επιβεβαιώσετε εάν ο χειρισμός συγκεκριμένων λειτουργιών γίνεται από τον εγγενή μηχανισμό εκτέλεσης.

Στιγμιότυπο οθόνης που δείχνει πώς μπορείτε να ελέγξετε το φυσικό σχέδιο για το ερώτημά σας και να δείτε ότι το ερώτημα εκτελέστηκε από τον εγγενή μηχανισμό εκτέλεσης.

Μηχανισμός επιστροφής

Σε ορισμένες περιπτώσεις, ο εγγενής μηχανισμός εκτέλεσης ενδέχεται να μην μπορεί να εκτελέσει ένα ερώτημα για λόγους όπως μη υποστηριζόμενες δυνατότητες. Σε αυτές τις περιπτώσεις, η λειτουργία πέφτει πίσω στον παραδοσιακό μηχανισμό Spark. Αυτός ο αυτόματος μηχανισμός επαναφοράς εξασφαλίζει ότι δεν υπάρχει διακοπή στη ροή εργασιών σας.

Στιγμιότυπο οθόνης που εμφανίζει τον μηχανισμό επιστροφής.

Στιγμιότυπο οθόνης που δείχνει πώς μπορείτε να ελέγξετε αρχεία καταγραφής που σχετίζονται με τον μηχανισμό επιστροφής.

Παρακολούθηση ερωτημάτων και dataFrame που εκτελούνται από τον μηχανισμό

Για να κατανοήσετε καλύτερα τον τρόπο με τον οποίο εφαρμόζεται ο μηχανισμός εγγενούς εκτέλεσης σε ερωτήματα SQL και λειτουργίες DataFrame, καθώς και για να κάνετε λεπτομερή έρευνα στα επίπεδα σταδίου και τελεστή, μπορείτε να ανατρέξετε στο περιβάλλον εργασίας χρήστη Spark και στον Spark History Server για πιο λεπτομερείς πληροφορίες σχετικά με την εκτέλεση του εγγενούς μηχανισμού.

Καρτέλα "Εγγενής μηχανισμός εκτέλεσης"

Μπορείτε να μεταβείτε στη νέα καρτέλα 'Sql / DataFrame' Για να δείτε τις πληροφορίες δόμησης Δονήσεων και τις λεπτομέρειες εκτέλεσης ερωτημάτων. Ο πίνακας Ερωτήματα παρέχει πληροφορίες σχετικά με τον αριθμό των κόμβων που εκτελούνται στον εγγενή μηχανισμό και εκείνους που επιστρέφουν στην JVM για κάθε ερώτημα.

Στιγμιότυπο οθόνης που εμφανίζει την καρτέλα εγγενούς μηχανισμού εκτέλεσης.

Γράφημα εκτέλεσης ερωτημάτων

Μπορείτε επίσης να επιλέξετε στην περιγραφή ερωτήματος για την απεικόνιση σχεδίου εκτέλεσης ερωτήματος Apache Spark. Το γράφημα εκτέλεσης παρέχει λεπτομέρειες εγγενούς εκτέλεσης σε στάδια και τις αντίστοιχες λειτουργίες τους. Τα χρώματα φόντου διαφοροποιούν τις μηχανές εκτέλεσης: το πράσινο αντιπροσωπεύει τον εγγενή μηχανισμό εκτέλεσης, ενώ το ανοιχτό μπλε υποδεικνύει ότι η λειτουργία εκτελείται στον προεπιλεγμένο μηχανισμό JVM.

Στιγμιότυπο οθόνης που εμφανίζει το γράφημα εκτέλεσης ερωτημάτων.

Περιορισμοί

Παρόλο που ο εγγενής μηχανισμός εκτέλεσης (NEE) στο Microsoft Fabric αυξάνει σημαντικά την απόδοση για τις εργασίες Apache Spark, αυτήν τη στιγμή έχει τους ακόλουθους περιορισμούς:

Υπάρχοντες περιορισμοί

  • Μη συμβατές δυνατότητες Spark: Ο εγγενής μηχανισμός εκτέλεσης δεν υποστηρίζει προς το παρόν συναρτήσεις που ορίζονται από το χρήστη (UDF), τη array_contains συνάρτηση ή δομημένη ροή. Εάν αυτές οι συναρτήσεις ή μη υποστηριζόμενες δυνατότητες χρησιμοποιούνται είτε απευθείας είτε μέσω βιβλιοθηκών που έχουν εισαχθεί, το Spark θα επανέλθει στον προεπιλεγμένο μηχανισμό του.

  • Μη υποστηριζόμενες μορφές αρχείων: Τα ερωτήματα για τις μορφές , JSONXMLκαι CSV δεν επιταχύνονται από τον εγγενή μηχανισμό εκτέλεσης. Αυτά επιστρέφουν από προεπιλογή στην κανονική μηχανή Spark JVM για εκτέλεση.

  • Η λειτουργία ANSI δεν υποστηρίζεται: Ο εγγενής μηχανισμός εκτέλεσης δεν υποστηρίζει τη λειτουργία ANSI SQL. Εάν ενεργοποιηθεί, η εκτέλεση επιστρέφει στη μηχανή vanilla Spark.

  • Αναντιστοιχίες τύπου φίλτρου ημερομηνίας: Για να επωφεληθείτε από την επιτάχυνση του εγγενούς μηχανισμού εκτέλεσης, βεβαιωθείτε ότι και οι δύο πλευρές μιας σύγκρισης ημερομηνιών συμφωνούν στον τύπο δεδομένων. Για παράδειγμα, αντί να συγκρίνετε μια DATETIME στήλη με μια σταθερά συμβολοσειράς, χρησιμοποιήστε την ρητά όπως φαίνεται:

    CAST(order_date AS DATE) = '2024-05-20'
    

Άλλα ζητήματα και περιορισμοί

  • Δεκαδικός σε ασυμφωνία χύτευσης κινητής υποδιαστολής: Όταν γίνεται χύτευση από DECIMAL σε FLOAT, το Spark διατηρεί την ακρίβεια με τη μετατροπή σε μια συμβολοσειρά και την ανάλυση της. Το NEE (μέσω Velox) εκτελεί απευθείας από την εσωτερική int128_t αναπαράσταση, το οποίο μπορεί να οδηγήσει σε ασυμφωνίες στρογγυλοποίηση.

  • Σφάλματα ρύθμισης παραμέτρων ζώνης ώρας : Η ρύθμιση μιας μη αναγνωρίσιμης ζώνης ώρας στο Spark προκαλεί αποτυχία της εργασίας στο NEE, ενώ η spark JVM την χειρίζεται με χάρη. Για παράδειγμα:

    "spark.sql.session.timeZone": "-08:00"  // May cause failure under NEE
    
  • Ασυνεπής συμπεριφορά στρογγυλοποίησης: Η round() συνάρτηση συμπεριφέρεται διαφορετικά στο NEE λόγω της εξάρτησης από std::roundτο , το οποίο δεν αναπαράγει τη λογική στρογγυλοποίησης του Spark. Αυτό μπορεί να οδηγήσει σε αριθμητικές ασυνέπειες στα αποτελέσματα στρογγυλοποίηση.

  • Λείπει η συνάρτηση ελέγχου map() διπλότυπου κλειδιού: Όταν spark.sql.mapKeyDedupPolicy οριστεί σε ΕΞΑΙΡΕΣΗ, το Spark εμφανίζει ένα σφάλμα για τα διπλότυπα κλειδιά. Προς το παρόν, η NEE παραλείπει αυτόν τον έλεγχο και επιτρέπει την εσφαλμένη επιτυχία του ερωτήματος.
    Παράδειγμα:

    SELECT map(1, 'a', 1, 'b'); -- Should fail, but returns {1: 'b'}
    
  • Διακύμανση σειράς σε collect_list() σχέση με την ταξινόμηση: Όταν χρησιμοποιείτε DISTRIBUTE BY τα και SORT BY, ο Spark διατηρεί τη σειρά στοιχείων στο collect_list(). Το NEE μπορεί να επιστρέψει τιμές με διαφορετική σειρά λόγω διαφορών με τυχαία σειρά, γεγονός που μπορεί να οδηγήσει σε αναντιστοιχίες προσδοκιών για λογική ευαίσθητη στις παραγγελίες.

  • Ασυμφωνία ενδιάμεσου τύπου για collect_list() / collect_set()το : Το Spark χρησιμοποιεί BINARY τον ενδιάμεσο τύπο για αυτές τις συναθροίσεις, ενώ το NEE χρησιμοποιεί ARRAYτο . Αυτή η αναντιστοιχία μπορεί να οδηγήσει σε προβλήματα συμβατότητας κατά τον σχεδιασμό ή την εκτέλεση ερωτημάτων.

  • Διαχειριζόμενα ιδιωτικά τελικά σημεία που απαιτούνται για πρόσβαση στον χώρο αποθήκευσης: Όταν είναι ενεργοποιημένος ο εγγενής μηχανισμός εκτέλεσης (NEE) και εάν οι εργασίες spark προσπαθούν να αποκτήσουν πρόσβαση σε έναν χώρο αποθήκευσης χρησιμοποιώντας ένα διαχειριζόμενο ιδιωτικό τελικό σημείο, οι χρήστες πρέπει να ρυθμίσουν τις παραμέτρους ξεχωριστών διαχειριζόμενων ιδιωτικών τελικών σημείων τόσο για τα τελικά σημεία Blob (blob.core.windows.net) όσο και για τα τελικά σημεία DFS / File System (dfs.core.windows.net), ακόμα και αν παραπέμπουν στον ίδιο λογαριασμό χώρου αποθήκευσης. Ένα μεμονωμένο τελικό σημείο δεν μπορεί να επαναχρησιμοποιηθεί και για τα δύο. Αυτός είναι ένας τρέχων περιορισμός και ενδέχεται να απαιτεί πρόσθετη ρύθμιση παραμέτρων δικτύου κατά την ενεργοποίηση του εγγενούς μηχανισμού εκτέλεσης σε έναν χώρο εργασίας που έχει διαχειρισμένα ιδιωτικά τελικά σημεία σε λογαριασμούς αποθήκευσης.