either way, for now compiling spark (with push to local maven) and then mahout (which would use local maven artifacts) on the same machine and then re-distributing artifacts to worker nodes should work regardless of parameters of compilation.
On Tue, Oct 21, 2014 at 3:28 PM, Dmitriy Lyubimov <dlie...@gmail.com> wrote: > hm no they don't push different binary releases to maven. I assume they > only push the default one. > > On Tue, Oct 21, 2014 at 3:26 PM, Dmitriy Lyubimov <dlie...@gmail.com> > wrote: > >> ps i remember discussion for packaging binary spark distributions. So >> there's in fact a number of different spark artifact releases. However, i >> am not sure if they are pushing them to mvn repositories. (if they did, >> they might use different maven classifiers for those). If that's the case, >> then one plausible strategy here is to recommend rebuilding mahout with >> dependency to a classifier corresponding to the actual spark binary release >> used. >> >> On Tue, Oct 21, 2014 at 2:21 PM, Dmitriy Lyubimov <dlie...@gmail.com> >> wrote: >> >>> if you are using mahout shell or command line drivers (which i dont) it >>> would seem the correct thing to do is for mahout script simply to take >>> spark dependencies from installed $SPARK_HOME rather than from Mahout's >>> assembly. In fact that would be consistent with what other projects are >>> doing in similar situation. it should also probably make things compatible >>> between minor releases of spark. >>> >>> But i think you are right in a sense that the problem is that spark jars >>> are not uniquely encompassed by maven artifact id and version, unlike with >>> most other products. (e.g. if we see mahout-math-0.9.jar we expect there to >>> be one and only one released artifact in existence -- but one's local build >>> may create incompatible variations). >>> >>> On Tue, Oct 21, 2014 at 1:51 PM, Pat Ferrel <p...@occamsmachete.com> >>> wrote: >>> >>>> The problem is not in building Spark it is in building Mahout using the >>>> correct Spark jars. If you are using CDH and hadoop 2 the correct jars are >>>> in the repos. >>>> >>>> For the rest of us, though the process below seems like an error prone >>>> hack to me it does work on Linux and BSD/mac. It should really be addressed >>>> by Spark imo. >>>> >>>> BTW The cache is laid out differently on linux but I don’t think you >>>> need to delete is anyway. >>>> >>>> On Oct 21, 2014, at 12:27 PM, Dmitriy Lyubimov <dlie...@gmail.com> >>>> wrote: >>>> >>>> fwiw i never built spark using maven. Always use sbt assembly. >>>> >>>> On Tue, Oct 21, 2014 at 11:55 AM, Pat Ferrel <p...@occamsmachete.com> >>>> wrote: >>>> >>>> > Ok, the mystery is solved. >>>> > >>>> > The safe sequence from my limited testing is: >>>> > 1) delete ~/.m2/repository/org/spark and mahout >>>> > 2) build Spark for your version of Hadoop *but do not use "mvn package >>>> > ...”* use “mvn install …” This will put a copy of the exact bits you >>>> need >>>> > into the maven cache for building mahout against. In my case using >>>> hadoop >>>> > 1.2.1 it was "mvn -Dhadoop.version=1.2.1 -DskipTests clean install” >>>> If you >>>> > run tests on Spark some failures can safely be ignored according to >>>> the >>>> > Spark guys so check before giving up. >>>> > 3) build mahout with “mvn clean install" >>>> > >>>> > This will create mahout from exactly the same bits you will run on >>>> your >>>> > cluster. It got rid of a missing anon function for me. The problem >>>> occurs >>>> > when you use a different version of Spark on your cluster than you >>>> used to >>>> > build Mahout and this is rather hidden by Maven. Maven downloads from >>>> repos >>>> > any dependency that is not in the local .m2 cache and so you have to >>>> make >>>> > sure your version of Spark is there so Maven wont download one that is >>>> > incompatible. Unless you really know what you are doing I’d build both >>>> > Spark and Mahout for now >>>> > >>>> > BTW I will check in the Spark 1.1.0 version of Mahout once I do some >>>> more >>>> > testing. >>>> > >>>> > On Oct 21, 2014, at 10:26 AM, Pat Ferrel <p...@occamsmachete.com> >>>> wrote: >>>> > >>>> > Sorry to hear. I bet you’ll find a way. >>>> > >>>> > The Spark Jira trail leads to two suggestions: >>>> > 1) use spark-submit to execute code with your own entry point (other >>>> than >>>> > spark-shell) One theory points to not loading all needed Spark >>>> classes from >>>> > calling code (Mahout in our case). I can hand check the jars for the >>>> anon >>>> > function I am missing. >>>> > 2) there may be different class names in the running code (created by >>>> > building Spark locally) and the version referenced in the Mahout >>>> POM. If >>>> > this turns out to be true it means we can’t rely on building Spark >>>> locally. >>>> > Is there a maven target that puts the artifacts of the Spark build in >>>> the >>>> > .m2/repository local cache? That would be an easy way to test this >>>> theory. >>>> > >>>> > either of these could cause missing classes. >>>> > >>>> > >>>> > On Oct 21, 2014, at 9:52 AM, Dmitriy Lyubimov <dlie...@gmail.com> >>>> wrote: >>>> > >>>> > no i havent used it with anything but 1.0.1 and 0.9.x . >>>> > >>>> > on a side note, I just have changed my employer. It is one of these >>>> big >>>> > guys that make it very difficult to do any contributions. So I am not >>>> sure >>>> > how much of anything i will be able to share/contribute. >>>> > >>>> > On Tue, Oct 21, 2014 at 9:43 AM, Pat Ferrel <p...@occamsmachete.com> >>>> wrote: >>>> > >>>> >> But unless you have the time to devote to errors avoid it. I’ve built >>>> >> everything from scratch using 1.0.2 and 1.1.0 and am getting these >>>> and >>>> >> missing class errors. The 1.x branch seems to have some kind of >>>> peculiar >>>> >> build order dependencies. The errors sometimes don’t show up until >>>> > runtime, >>>> >> passing all build tests. >>>> >> >>>> >> Dmitriy, have you successfully used any Spark version other than >>>> 1.0.1 on >>>> >> a cluster? If so do you recall the exact order and from what sources >>>> you >>>> >> built? >>>> >> >>>> >> >>>> >> On Oct 21, 2014, at 9:35 AM, Dmitriy Lyubimov <dlie...@gmail.com> >>>> wrote: >>>> >> >>>> >> You can't use spark client of one version and have the backend of >>>> > another. >>>> >> You can try to change spark dependency in mahout poms to match your >>>> > backend >>>> >> (or vice versa, you can change your backend to match what's on the >>>> > client). >>>> >> >>>> >> On Tue, Oct 21, 2014 at 7:12 AM, Mahesh Balija < >>>> > balijamahesh....@gmail.com >>>> >>> >>>> >> wrote: >>>> >> >>>> >>> Hi All, >>>> >>> >>>> >>> Here are the errors I get which I run in a pseudo distributed mode, >>>> >>> >>>> >>> Spark 1.0.2 and Mahout latest code (Clone) >>>> >>> >>>> >>> When I run the command in page, >>>> >>> https://mahout.apache.org/users/sparkbindings/play-with-shell.html >>>> >>> >>>> >>> val drmX = drmData(::, 0 until 4) >>>> >>> >>>> >>> java.io.InvalidClassException: org.apache.spark.rdd.RDD; local class >>>> >>> incompatible: stream classdesc serialVersionUID = >>>> 385418487991259089, >>>> >>> local class serialVersionUID = -6766554341038829528 >>>> >>> at >>>> >>> java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:592) >>>> >>> at >>>> >>> >>>> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) >>>> >>> at >>>> >>> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1516) >>>> >>> at >>>> >>> >>>> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) >>>> >>> at >>>> >>> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1516) >>>> >>> at >>>> >>> >>>> > >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) >>>> >>> at >>>> >>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1349) >>>> >>> at >>>> >> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:63) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.ResultTask$.deserializeInfo(ResultTask.scala:61) >>>> >>> at >>>> >>> >>>> org.apache.spark.scheduler.ResultTask.readExternal(ResultTask.scala:141) >>>> >>> at >>>> >>> >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1836) >>>> >>> at >>>> >>> >>>> > >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795) >>>> >>> at >>>> >>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1349) >>>> >>> at >>>> >> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:63) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:85) >>>> >>> at >>>> >>> >>>> org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:165) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) >>>> >>> at java.lang.Thread.run(Thread.java:701) >>>> >>> 14/10/21 19:35:37 WARN TaskSetManager: Lost TID 1 (task 0.0:1) >>>> >>> 14/10/21 19:35:37 WARN TaskSetManager: Lost TID 2 (task 0.0:0) >>>> >>> 14/10/21 19:35:37 WARN TaskSetManager: Lost TID 3 (task 0.0:1) >>>> >>> 14/10/21 19:35:38 WARN TaskSetManager: Lost TID 4 (task 0.0:0) >>>> >>> 14/10/21 19:35:38 WARN TaskSetManager: Lost TID 5 (task 0.0:1) >>>> >>> 14/10/21 19:35:38 WARN TaskSetManager: Lost TID 6 (task 0.0:0) >>>> >>> org.apache.spark.SparkException: Job aborted due to stage failure: >>>> >>> Task 0.0:0 failed 4 times, most recent failure: Exception failure in >>>> >>> TID 6 on host mahesh-VirtualBox.local: >>>> java.io.InvalidClassException: >>>> >>> org.apache.spark.rdd.RDD; local class incompatible: stream classdesc >>>> >>> serialVersionUID = 385418487991259089, local class serialVersionUID >>>> = >>>> >>> -6766554341038829528 >>>> >>> >>>> java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:592) >>>> >>> >>>> >>> >>>> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) >>>> >>> >>>> >>> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1516) >>>> >>> >>>> >>> >>>> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) >>>> >>> >>>> >>> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1516) >>>> >>> >>>> >>> >>>> > >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) >>>> >>> >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1349) >>>> >>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> >>> >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:63) >>>> >>> >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.ResultTask$.deserializeInfo(ResultTask.scala:61) >>>> >>> >>>> >>> >>>> org.apache.spark.scheduler.ResultTask.readExternal(ResultTask.scala:141) >>>> >>> >>>> >>> >>>> java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1836) >>>> >>> >>>> >>> >>>> > >>>> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795) >>>> >>> >>>> java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1349) >>>> >>> java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) >>>> >>> >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:63) >>>> >>> >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:85) >>>> >>> >>>> >>> >>>> org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:165) >>>> >>> >>>> >>> >>>> >> >>>> > >>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) >>>> >>> >>>> >>> >>>> >> >>>> > >>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) >>>> >>> java.lang.Thread.run(Thread.java:701) >>>> >>> Driver stacktrace: >>>> >>> at org.apache.spark.scheduler.DAGScheduler.org >>>> >>> >>>> >> >>>> > >>>> $apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1044) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1028) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1026) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) >>>> >>> at >>>> >>> scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1026) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:634) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:634) >>>> >>> at scala.Option.foreach(Option.scala:236) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:634) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> org.apache.spark.scheduler.DAGSchedulerEventProcessActor$$anonfun$receive$2.applyOrElse(DAGScheduler.scala:1229) >>>> >>> at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498) >>>> >>> at akka.actor.ActorCell.invoke(ActorCell.scala:456) >>>> >>> at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237) >>>> >>> at akka.dispatch.Mailbox.run(Mailbox.scala:219) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) >>>> >>> at >>>> >>> scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) >>>> >>> at >>>> >>> >>>> scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) >>>> >>> at >>>> >>> >>>> >> >>>> > >>>> scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) >>>> >>> >>>> >>> Best, >>>> >>> Mahesh Balija. >>>> >>> >>>> >>> >>>> >>> >>>> >>> >>>> >>> >>>> >>> >>>> >>> >>>> >>> On Tue, Oct 21, 2014 at 2:38 AM, Dmitriy Lyubimov < >>>> dlie...@gmail.com> >>>> >>> wrote: >>>> >>> >>>> >>>> On Mon, Oct 20, 2014 at 1:51 PM, Pat Ferrel <p...@occamsmachete.com >>>> > >>>> >>> wrote: >>>> >>>> >>>> >>>>> Is anyone else nervous about ignoring this issue or relying on >>>> >>> non-build >>>> >>>>> (hand run) test driven transitive dependency checking. I hope >>>> someone >>>> >>>> else >>>> >>>>> will chime in. >>>> >>>>> >>>> >>>>> As to running unit tests on a TEST_MASTER I’ll look into it. Can >>>> we >>>> > set >>>> >>>> up >>>> >>>>> the build machine to do this? I’d feel better about eyeballing >>>> deps if >>>> >>> we >>>> >>>>> could have a TEST_MASTER automatically run during builds at >>>> Apache. >>>> >>> Maybe >>>> >>>>> the regular unit tests are OK for building locally ourselves. >>>> >>>>> >>>> >>>>>> >>>> >>>>>> On Oct 20, 2014, at 12:23 PM, Dmitriy Lyubimov < >>>> dlie...@gmail.com> >>>> >>>>> wrote: >>>> >>>>>> >>>> >>>>>> On Mon, Oct 20, 2014 at 11:44 AM, Pat Ferrel < >>>> p...@occamsmachete.com> >>>> >>>>> wrote: >>>> >>>>>> >>>> >>>>>>> Maybe a more fundamental issue is that we don’t know for sure >>>> >>> whether >>>> >>>> we >>>> >>>>>>> have missing classes or not. The job.jar at least used the pom >>>> >>>>> dependencies >>>> >>>>>>> to guarantee every needed class was present. So the job.jar >>>> seems to >>>> >>>>> solve >>>> >>>>>>> the problem but may ship some unnecessary duplicate code, right? >>>> >>>>>>> >>>> >>>>>> >>>> >>>>>> No, as i wrote spark doesn't work with job jar format. Neither >>>> as it >>>> >>>>> turns >>>> >>>>>> out more recent hadoop MR btw. >>>> >>>>> >>>> >>>>> Not speaking literally of the format. Spark understands jars and >>>> maven >>>> >>>> can >>>> >>>>> build one from transitive dependencies. >>>> >>>>> >>>> >>>>>> >>>> >>>>>> Yes, this is A LOT of duplicate code (will take normally MINUTES >>>> to >>>> >>>>> startup >>>> >>>>>> tasks with all of it just on copy time). This is absolutely not >>>> the >>>> >>> way >>>> >>>>> to >>>> >>>>>> go with this. >>>> >>>>>> >>>> >>>>> >>>> >>>>> Lack of guarantee to load seems like a bigger problem than startup >>>> >>> time. >>>> >>>>> Clearly we can’t just ignore this. >>>> >>>>> >>>> >>>> >>>> >>>> Nope. given highly iterative nature and dynamic task allocation in >>>> this >>>> >>>> environment, one is looking to effects similar to Map Reduce. This >>>> is >>>> >> not >>>> >>>> the only reason why I never go to MR anymore, but that's one of >>>> main >>>> >>> ones. >>>> >>>> >>>> >>>> How about experiment: why don't you create assembly that copies ALL >>>> >>>> transitive dependencies in one folder, and then try to broadcast it >>>> > from >>>> >>>> single point (front end) to well... let's start with 20 machines. >>>> (of >>>> >>>> course we ideally want to into 10^3 ..10^4 range -- but why bother >>>> if >>>> > we >>>> >>>> can't do it for 20). >>>> >>>> >>>> >>>> Or, heck, let's try to simply parallel-copy it between too >>>> machines 20 >>>> >>>> times that are not collocated on the same subnet. >>>> >>>> >>>> >>>> >>>> >>>>>> >>>> >>>>>>> There may be any number of bugs waiting for the time we try >>>> running >>>> >>>> on a >>>> >>>>>>> node machine that doesn’t have some class in it’s classpath. >>>> >>>>>> >>>> >>>>>> >>>> >>>>>> No. Assuming any given method is tested on all its execution >>>> paths, >>>> >>>> there >>>> >>>>>> will be no bugs. The bugs of that sort will only appear if the >>>> user >>>> >>> is >>>> >>>>>> using algebra directly and calls something that is not on the >>>> path, >>>> >>>> from >>>> >>>>>> the closure. In which case our answer to this is the same as for >>>> the >>>> >>>>> solver >>>> >>>>>> methodology developers -- use customized SparkConf while creating >>>> >>>> context >>>> >>>>>> to include stuff you really want. >>>> >>>>>> >>>> >>>>>> Also another right answer to this is that we probably should >>>> >>> reasonably >>>> >>>>>> provide the toolset here. For example, all the stats stuff found >>>> in R >>>> >>>>> base >>>> >>>>>> and R stat packages so the user is not compelled to go >>>> non-native. >>>> >>>>>> >>>> >>>>>> >>>> >>>>> >>>> >>>>> Huh? this is not true. The one I ran into was found by calling >>>> >>> something >>>> >>>>> in math from something in math-scala. It led outside and you can >>>> >>>> encounter >>>> >>>>> such things even in algebra. In fact you have no idea if these >>>> >>> problems >>>> >>>>> exists except for the fact you have used it a lot personally. >>>> >>>>> >>>> >>>> >>>> >>>> >>>> >>>> You ran it with your own code that never existed before. >>>> >>>> >>>> >>>> But there's difference between released Mahout code (which is what >>>> you >>>> >>> are >>>> >>>> working on) and the user code. Released code must run thru remote >>>> tests >>>> >>> as >>>> >>>> you suggested and thus guarantee there are no such problems with >>>> post >>>> >>>> release code. >>>> >>>> >>>> >>>> For users, we only can provide a way for them to load stuff that >>>> they >>>> >>>> decide to use. We don't have apriori knowledge what they will use. >>>> It >>>> > is >>>> >>>> the same thing that spark does, and the same thing that MR does, >>>> > doesn't >>>> >>>> it? >>>> >>>> >>>> >>>> Of course mahout should drop rigorously the stuff it doesn't load, >>>> from >>>> >>> the >>>> >>>> scala scope. No argue about that. In fact that's what i suggested >>>> as #1 >>>> >>>> solution. But there's nothing much to do here but to go dependency >>>> >>>> cleansing for math and spark code. Part of the reason there's so >>>> much >>>> > is >>>> >>>> because newer modules still bring in everything from mrLegacy. >>>> >>>> >>>> >>>> You are right in saying it is hard to guess what else dependencies >>>> are >>>> >> in >>>> >>>> the util/legacy code that are actually used. but that's not a >>>> >>> justification >>>> >>>> for brute force "copy them all" approach that virtually guarantees >>>> >>> ruining >>>> >>>> one of the foremost legacy issues this work intended to address. >>>> >>>> >>>> >>> >>>> >> >>>> >> >>>> > >>>> > >>>> > >>>> >>>> >>> >> >