Je veux effectuer des recherches GeoIP de mes données dans Spark. Pour ce faire, j'utilise la base de données GeoIP de Maxmind.
Ce que je veux faire, c'est d'initialiser un objet de base de données GeOIP une fois sur chaque partition, puis utilisez ensuite cela pour rechercher la ville liée à une adresse IP. P> < P> L'étincelle a-t-elle une phase d'initialisation pour chaque nœud, ou devrais-je plutôt vérifier si une variable d'instance est indéfinie, et si oui, initialisez-le avant de continuer? Par exemple. Quelque chose comme (c'est python mais je veux une solution Scala): p> Bien sûr, cela nécessite que l'étincelle soit sérialisée tout ce que les Docs prudent contre. < / p> p>
3 Réponses :
Cela semble être une bonne utilisation d'une variable de diffusion. Avez-vous examiné la documentation pour cette fonctionnalité et si vous le souhaitez, ne répondez pas à vos besoins? P>
J'ai essayé d'utiliser une variable de diffusion. Mais cela n'a pas fonctionné. Peut-être parce que com.maxmind.geoip.lookupservice n'est pas sérialisable. J'ai essayé d'utiliser la méthode sparcontext.adddfile à la place et cela a bien fonctionné. Ajouter les fichiers geoipcity.dat et geoipasnum.dat
En étincelle, les opérations de partition peuvent être utilisées en utilisant: Ce mapper exécutera la fonction exemple: P> f code> une fois par partition sur un itérateur d'éléments. L'idée est que le coût de la configuration des ressources (comme des connexions DB) sera compensé avec l'utilisation de ces ressources sur un certain nombre d'éléments de l'itérateur. P>
val logsRDD = ???
logsRDD.mapPartitions{iter =>
val geoIp = new GeoIPLookupDB(...)
// this is local map over the iterator - do not confuse with rdd.map
iter.map(elem => (geoIp.resolve(elem.ip),elem))
}
Une bonne solution, mais dans ce cas, je souhaite réutiliser l'objet dans plusieurs opérations, une variable de diffusion vous semble plus utile.
Comme @bearRito mentionné - vous pouvez utiliser Charger votre Geodb, puis la diffuser depuis votre pilote. Une autre option à prendre en compte est de fournir un service externe que vous pouvez utiliser pour effectuer une recherche. Cela pourrait être un cache en mémoire tel que REDIS / MEMCACHED / TACHEYON ou un magasin de données régulier. p>