Comment télécharger de 100 millions de lignes à partir d'Azure Table Storage RAPIDE
J'ai été chargé avec le téléchargement d'environ 100 millions de lignes de données à partir d'Azure Table Storage. L'important ici étant de vitesse.
Le processus que nous utilisons est le téléchargement de 10 000 lignes de Azure Table storage. Processus dans une instance locale de Sql Server. Pendant le traitement de l'lignes, il supprime les 100 lignes à la fois dans l'Azur du tableau. Ce processus est filetée pour avoir 8 threads de téléchargement de 10 000 lignes à la fois.
Le seul problème avec ceci est que, selon nos calculs. Il faudra environ 40 jours pour le télécharger et le processus de l'ordre de 100 millions de lignes que nous avons enregistrées. Quelqu'un sait-il un moyen plus rapide pour accomplir cette tâche?
Un côté de la question: Pendant le processus de téléchargement d'Azur renverra le code xml qui juste n'ont pas toutes les données. Il ne renvoie pas une erreur. Mais il envoie ceci:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="azure-url/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">CommandLogTable</title>
<id>azure-url/CommandLogTable</id>
<updated>2010-07-12T19:50:55Z</updated>
<link title="CommandLogTable" href="CommandLogTable" />
</feed>
0
Quelqu'un d'autre a ce problème et avez une solution pour elle?
Dans la plupart de chaque ligne est de 1k.
Je n'ai pas travaillé avec Azure, donc je suis le seul à essayer de dépanner à partir de SQL / réseau; cependant, je suis en train de lire à travers certains blogs, et ils sont tous disent la même chose - à l'aide de l'ATOME est très détaillé et inefficace pour les grands ensembles de données. Maintenant, je ne suis pas sûr de savoir comment il est difficile de changer cela; mais voici un exemple de vitesse / différences entre les données weblogs.asp.net/rgillen/archive/2009/08/20/...
OriginalL'auteur jWoose | 2010-07-12
Vous devez vous connecter pour publier un commentaire.
Outre les suggestions de La Désactivation De Nagling, il y a un très joli post sur l'amélioration de la performance de la plateforme Azure Table Storage. En fait l'amélioration de la vitesse de ADO.NET la Désérialisation fourni 10x la vitesse d' pour Sqwarea (massive multijoueur en ligne jeu construit avec Lokad.Cloud cadre).
Cependant, table de stockage peut ne pas être la meilleure solution pour les grands scénarios de stockage (plus de millions d'enregistrements). Le temps de latence est le meurtre facteur ici. Pour contourner cela, j'ai réussi à l'aide du fichier de base de données pour les stockages, où les changements sont fait localement (sans aucune latence du réseau de CLAP) et se sont engagés à GOUTTE en téléchargeant le fichier (simultanéité et de mise à l'échelle a été appliquée ici par Lokad.CQRS App Engine pour Windows Azure).
Insertion de 10 millions d'enregistrements de base de données SQLite à la fois (dans la transaction, où chaque enregistrement a été indexé par 2 champs et avait arbitraire schéma de données sérialisées par ProtoBuf) n'a pris que 200 secondes au total sur la moyenne. Téléchargement du fichier résultant environ 15 secondes en moyenne. Les lectures aléatoires par index - instantanée (à condition que le fichier est mis en cache dans le local de stockage et ETag est la mise en correspondance).
Je suis heureux je l'ai aidé. Table de stockage est bonne (bien que l'API aurait pu être beaucoup mieux) et irremplaçable pour des choses comme le stockage de données d'affichage de très évolutive des applications web. Pourtant, dans les scénarios qui nécessitent une latence extrêmement faible et à haut débit - c'est pas le meilleur (comme SQL Azure)
Rinat et jWoose. Azure Table Storage n'est PAS relationnelle. C'est un NoSQL, noschema, base de données distribuée, probablement mis en œuvre de manière similaire à ce que vous décrivez. Azure Table Storage est spécialement conçu pour Gazillions de dossiers.
Panagiotis, personne n'a fait valoir ATS être RDB.
OriginalL'auteur Rinat Abdullin
De votre côté de la question, je pense que vous êtes l'obtention d'un "jeton de continuation." Si vous êtes en utilisant le .NET client de stockage de la bibliothèque, essayez d'ajouter .AsTableServiceQuery() à votre requête.
À votre question principale, attisant la requête est la meilleure chose que vous pouvez faire. Il semblerait que vous ayez accès au stockage à partir d'un ordinateur local (pas dans Windows Azure). Si oui, j'imagine que vous pouvez accélérer les choses un peu en déployant un petit service à Windows Azure qui extrait les données à partir de la table de stockage (beaucoup plus rapide, car il n'y a plus de bande passante et une latence plus faible dans le centre de données), puis compresse les résultats et les renvoie vers le bas sur votre machine locale. Il y a beaucoup de frais généraux pour le XML Windows Azure tables envoyer en arrière, afin de décapage que de sortir et de s'emmitoufler lignes serait probablement d'économiser beaucoup de temps de transfert.
Vous avez raison à propos de mon côté de la question. La poursuite de jeton de le renvoyer si votre demande prend plus de 5 secondes.
OriginalL'auteur smarx
Côté de suggestions au sujet des limites de bande passante, vous pouvez facilement être en cours d'exécution dans le compte de stockage des limites, comme chaque table de partition est limitée à environ 500 transactions par seconde.
Plus loin: il y a une optimisation de déploiement (l'algorithme Nagle) qui pourraient effectivement ralentir les choses pour les petites lectures (comme votre 1K lectures de données). Voici un blog sur la désactivation de Nagling, ce qui pourrait accélérer la vitesse de votre lit considérablement, particulièrement si vous êtes en cours d'exécution directement dans l'Azur service Internet sans temps de latence dans le chemin.
OriginalL'auteur David Makogon
Le moyen le plus rapide pour obtenir vos données, prises en charge par Amazon, mais pas encore d'Azur, est de les expédier un disque USB (une clé USB), demandez-leur de placer les données dans le disque et de le renvoyer à vous.
Une autre option est l'utilisation d'AppFabric Service Bus pour obtenir les données d'un autre système lorsqu'il est créé, au lieu d'attendre pour télécharger tout à la fois.
OriginalL'auteur Panagiotis Kanavos
Le plus souvent, votre facteur limitant est la bande passante du réseau, pas de traitement. Si c'est le cas, votre seul véritable espoir est de développer: plus de machines de course de plus de threads pour télécharger les données.
BTW, n'a pas d'Azure exposer quelques "exporter" mécanisme qui permet de supprimer le besoin de télécharger toutes les lignes manuellement?
Comment allez-vous déterminer ce? J'ai du mal à croire que vous n'êtes PAS d'e/s.
OriginalL'auteur JSBձոգչ
Le facteur important ici est de savoir comment les données sont réparties sur les partitions. Une requête qui s'étend sur les limites des partitions sera de retour à chaque frontière nécessitant de soumettre à nouveau - même si la partition en question a 0 lignes. SI les données sont 1 Partition = 1 Ligne, puis il sera lent, mais vous pouvez augmenter le nombre de threads bien au-dessus de 8. Si les données sont en n partitions = m lignes, puis les idées ci-dessous devrait vous expédier vers le haut.
En supposant que vous avez plusieurs partitions, et chacun avec un certain nombre de lignes, le moyen le plus rapide pour aller sera de faire tourner autant de threads que possible (si vous êtes en utilisant .Net PLINQ ou en Parallèle.ForEach(partition) ou QueueWorkItem()) et ont un fil de numérisation sa partition pour toutes les lignes, les processus, la poste de SQL, & supprimer avant de revenir.
Donné les latences impliqués (10s de ms) et les multiples allers-retours, même w/8 threads, vous n'êtes probablement pas aussi occupé que vous ne le pensez. Aussi, vous ne mentionnez pas qui virtuelle que vous utilisez, mais vous pouvez le profil de tailles différentes.
Sinon, une autre façon de le faire serait d'utiliser une file d'attente et quelques 'n' travailleurs. Pour chaque partition (ou un ensemble de partitions) mettre un message dans la file d'attente. Ont les travailleurs de tirer à partir de la file d'attente (multi-thread) et de requête/processus/post/répéter. Vous pourriez faire tourner un nombre de travailleurs nécessaires et de se propager à travers plus de le centre de données (c'est à dire plus de débit, etc.).
OriginalL'auteur Pat Filoteo