1

Affichage d'un faible nombre d'écritures dans elasticsearch à l'aide de spark java.Problème de performance d'écriture Spark + Elastic search

Voici les configurations

utilisant 13.xlarge machines pour le cluster ES

4 instances each have 4 processors. 
Set refresh interval to -1 and replications to '0' and other basic 
configurations required for better writing. 

Spark:

2 nœud de cluster DME avec

2 Core instances 
    - 8 vCPU, 16 GiB memory, EBS only storage 
    - EBS Storage:1000 GiB 

1 Master node 
    - 1 vCPU, 3.8 GiB memory, 410 SSD GB storage 

index ES a 16 tessons défini dans la cartographie.

ayant en dessous de config quand le travail en cours d'exécution,

executor-memory - 8g 
spark.executor.instances=2 
spark.executor.cores=4 

et en utilisant

es.batch.size.bytes - 6MB 
es.batch.size.entries - 10000 
es.batch.write.refresh - false 

avec cette configuration, j'essaie de charger des documents 1million (chaque document a une taille de 1300 octets), il fait la charge à 500 enregistrements/docs par nœuds ES.

et dans le journal d'allumage Voit chaque tâche

-1116 bytes result sent to driver 

Code Spark

JavaRDD<String> javaRDD = jsc.textFile("<S3 Path>"); 
    JavaEsSpark.saveJsonToEs(javaRDD,"<Index name>"); 

Aussi quand je regarde le graphique de-réseau dans le cluster ES, il est très faible, et je vois EMR n'envoie pas d'énormes données sur un réseau. Est-ce que je peux dire à Spark d'envoyer un bon nombre de données pour que l'écriture soit plus rapide?

OU

Y at-il autre config que je manque à modifier. Cause Je vois 500docs par seconde par instance es est plus faible. Quelqu'un peut-il s'il vous plaît guider ce me manque avec ces paramètres pour améliorer mes performances es écrire

Merci à l'avance

+0

Dans votre répertoire s3, lisez-vous un seul fichier ou plusieurs fichiers? –

+0

en utilisant de nombreux fichiers – camelBeginner

Répondre

0

Vous pouvez avoir un problème ici. spark.executor.instances=2

Vous êtes limité à deux exécuteurs, vous pouvez en avoir 4 en fonction de la configuration de votre cluster. Je changerais cela à 4 ou plus. Je pourrais aussi essayer executor-memory = 1500M, cores = 1, instances = 16. J'aime laisser un peu de frais généraux dans ma mémoire, c'est pourquoi je suis passé de 2G à 1.5G (mais vous ne pouvez pas faire 1.5G donc nous devons faire 1500M). Si vous vous connectez via vos exécuteurs, cela améliorera les performances.

Aurait besoin de code pour déboguer davantage. Je me demande si vous êtes connecté à la recherche élastique uniquement dans votre pilote, et non dans vos nœuds de travail. Cela signifie que vous n'obtenez qu'une connexion au lieu d'une pour chaque exécuteur.

+0

Merci beaucoup, Dan, Quand vous dites augmenter les exécuteurs à 4, vous voulez dire augmenter le cluster EMR pour avoir 4 instances au lieu de 2? La façon dont je me connecte à ES est via le code ci-dessous. SparkConf conf = new SparkConf(). SetAppName ("Application SparkES"); – camelBeginner

+0

SparkConf conf = new SparkConf().setAppName ("Application SparkES"); conf.set ("es.nodes", ""); conf.set ("es.batch.size.bytes", "6mb"); conf.set ("es.batch.size.entries", "10000"); conf.set ("es.batch.concurrent.request", "4"); conf.set ("es.batch.write.refresh", "false"); conf.set ("spark.kryoserializer.buffer", "24"); JavaSparkContext jsc = new JavaSparkContext (conf); JavaRDD javaRDD = jsc.textFile ("CHEMIN S3"); JavaEsSpark.saveJsonToEs (javaRDD, "nom de l'index"); – camelBeginner

+0

et les deux dernières lignes ci-dessus est dans une méthode et appelé à partir de main() et j'envoie un paramètre à utiliser dans la méthode loadSNindex (jsc); – camelBeginner