On Friday, January 30, 2015 at 7:27:12 AM UTC-8, Marshall Bockrath-Vandegrift wrote: > > Not a solution to your immediate problem, but if this is for > new development (not an existing mass of clojure-hadoop code), I'd suggest > looking at Parkour instead. As the main Parkour developer I'm obviously > biased, but Parkour exists in part because the compilation model used by > clojure-hadoop in order to meet Hadoop's expectations is very much at odds > with typical Clojure development. In particular, Parkour does not require > AOT compilation. > > https://github.com/damballa/parkour >
Thanks for the recommendation. For now we're looking for a simple low-level interface to MR, but we're also keeping an eye on parkour and pigpen for more complex tasks down the road. Can you explain why I might prefer parkour to pigpen or vice-versa? > > > On Thursday, January 29, 2015 at 2:39:54 AM UTC-5, Jason Wolfe wrote: >> >> First off, I apologize in advance for not having a reduced test case, and >> express my sincere gratitude in advance for any assistance. I've been >> tearing my hair out for a day or so and not making headway, and figured >> someone here might recognize some keywords and have a pointer in the right >> direction. (I'm admittedly pretty green when it comes to class loading, and >> have largely exhausted my google fu). >> >> *Problem: * >> >> I'm submitting a hadoop job using clojure-hadoop. All is well with a >> simple job, but once I require something that transitively depends on >> Schema, I end up with: >> >> clojure.lang.Compiler$CompilerException: >> java.lang.IllegalArgumentException: No implementation of method: :walker of >> protocol: #'schema.core/Schema found for class: clojure.core$long, >> compiling:(crane/config.clj:33:4) >> >> It works fine when run in-process with hadoop-mapreduce-client-jobclient, >> but not with bin/hadoop -jar. This stunk of a classloader issue, and after >> digging in it seems that there are multiple versions of clojure.core$long >> floating around. The version on which the protocol is extended is not the >> same class for the fn that the symbol 'long resolves to in client code. >> >> *Context: * >> >> clojure-hadoop is AOT-compiled, and after being loaded by hadoop it >> dynamically loads the target namespace (not AOT-compiled, nor any other of >> the code in question) using >> https://github.com/alexott/clojure-hadoop/blob/master/src/clojure_hadoop/load.clj#L3 >> >> From here, schema is transitively required, and then client namespaces >> attempt to use the Schema protocol to generate validators, and when the >> schema 'long is used (which resolves to the fn with class >> clojure.core$long), it fails to find the appropriate method. >> >> After repeated head-bashing, I've determined that there are (at least >> two) versions of the clojure.core$long class floating around -- the one >> used to extend the protocol, which stems from a DynamicClassLoader, and the >> one that 'long resolves to in client code, which stems from a >> URLClassLoader. The URLClassLoader is the loader of the current thread and >> Compiler, but not @(clojure.lang.Compiler/LOADER). >> >> *Attempts:* >> >> I've tried wrapping the clojure-hadoop loading code with >> .setContextClassLoader on some obvious candidates and binding >> *use-context-classloader* around the code doing the loading, with no avail. >> I've tried changing the schema code to reference the class in different >> ways (class (resolve 'long)), (class 'long), etc and that hasn't made a >> difference. I've checked and the clojure-hadoop jar doesn't contain any >> .class files for clojure, schema, or other offending code. >> >> *Plea:* >> >> I suspect there's something obvious I'm missing. (In retrospect it seems >> like the design of Schema may be suboptimal in light of this, but if >> possible I'd like to figure out a workaround without changing that >> substantially). Thanks in advance for your help -- any and all pointers are >> welcome. >> >> -Jason >> >> >> >> >> > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.