1, 对Universal Recommender进行pio build成功,但是却提示No engine found

Building and delpoying model
[INFO] [Engine$] Using command '/home/vagrant/pio_elastic1/PredictionIO-0.11.1-SNAPSHOT/sbt/sbt' at /home/vagrant/workspace/universal-recommender to build.
[INFO] [Engine$] If the path above is incorrect, this process will fail.
[INFO] [Engine$] Uber JAR disabled. Making sure lib/pio-assembly-0.11.-SNAPSHOT.jar is absent.
[INFO] [Engine$] Going to run: /home/vagrant/pio_elastic1/PredictionIO-0.11.-SNAPSHOT/sbt/sbt package assemblyPackageDependency in /home/vagrant/workspace/universal-recommender
[INFO] [Engine$] Compilation finished successfully.
[INFO] [Engine$] Looking for an engine...
[ERROR] [Engine$] No engine found. Your build might have failed. Aborting.

这是Scala版本导致的问题。进入到universal-recommender的打包目录target中查看,会发现一个叫做scala-2.10的目录。

而我们的PredictionIO在make时指定版本是Scala2.11,所以会去scala-2.11目录下去寻找engine的jar包,自然会出现No engine found

这里有个临时的解决方案,就是直接把scala-2.10改名或者拷贝为scala-2.11,就可以让PredictionIO可以正常执行。

[vagrant@master universal-recommender]$ cd /home/vagrant/workspace/universal-recommender/target
[vagrant@master target]$ ls
resolution-cache scala-2.10 streams
[vagrant@master target]$ cp -r scala-2.10 scala-2.11

2,解决Universal Recommender的Scala版本问题

上面的办法只是个临时解决办法,还是需要统一PredictionIO和Universal Recommender的Scala版本。

我们可以通过修改build.sbt来指定Universal Recommender的Scala版本

name := "universal-recommender"

scalaVersion := "2.11.8"         

但是,最终会发现出现编译错误。原因是Universal Recommender的一些依赖包,没有Scala2.11的版本。比如mahout包。

[vagrant@master universal-recommender]$ pio build
[INFO] [Engine$] Using command '/home/vagrant/pio_elastic1/PredictionIO-0.11.1-SNAPSHOT/sbt/sbt' at /home/vagrant/workspace/universal-recommender to build.
[INFO] [Engine$] If the path above is incorrect, this process will fail.
[INFO] [Engine$] Uber JAR disabled. Making sure lib/pio-assembly-0.11.-SNAPSHOT.jar is absent.
[INFO] [Engine$] Going to run: /home/vagrant/pio_elastic1/PredictionIO-0.11.-SNAPSHOT/sbt/sbt package assemblyPackageDependency in /home/vagrant/workspace/universal-recommender
[ERROR] [Engine$] [error] (*:update) sbt.ResolveException: unresolved dependency: org.apache.mahout#mahout-math-scala_2.;0.13.: not found
[ERROR] [Engine$] [error] unresolved dependency: org.apache.mahout#mahout-spark_2.;0.13.: not found
[ERROR] [Engine$] [error] Total time: s, completed Sep , :: AM
[ERROR] [Engine$] Return code of build command: /home/vagrant/pio_elastic1/PredictionIO-0.11.-SNAPSHOT/sbt/sbt package assemblyPackageDependency is . Aborting.

最终只好对build.sbt动了一下大手术,基本原则是:

1),能够升级到Scala2.11的依赖包,升级;

2),没有2.11的包,比如mahout,强制指定包版本为2.10

3),依赖中出现2.10和2.11并存冲突的包,exclude掉2.10版本

最后修改的样子如下:

import scalariform.formatter.preferences._
import com.typesafe.sbt.SbtScalariform
import com.typesafe.sbt.SbtScalariform.ScalariformKeys
import sbt.Keys.scalaVersion name := "universal-recommender" version := "0.6.1-SNAPSHOT" organization := "com.actionml" scalaVersion := "2.11.8" val mahoutVersion = "0.13.0" val pioVersion = "0.11.0-incubating" val elasticsearch1Version = "1.7.6" //val elasticsearch5Version = "5.1.2" libraryDependencies ++= Seq(
"org.apache.predictionio" %% "apache-predictionio-core" % pioVersion % "provided",
"org.apache.predictionio" %% "apache-predictionio-data-elasticsearch1" % pioVersion % "provided",
"org.apache.spark" % "spark-core_2.11" % "2.1.0" % "provided",
"org.apache.spark" % "spark-mllib_2.11" % "1.4.0" % "provided",
"org.xerial.snappy" % "snappy-java" % "1.1.1.7",
// Mahout's Spark libs
"org.apache.mahout" % "mahout-math-scala_2.10" % mahoutVersion
exclude("com.github.scopt", "scopt_2.10")
exclude("org.spire-math", "spire_2.10")
exclude("org.scalanlp", "breeze_2.10")
exclude("org.spire-math", "spire-macros_2.10")
exclude("org.apache.spark", "spark-mllib_2.10")
exclude("org.json4s", "json4s-ast_2.10")
exclude("org.json4s", "json4s-core_2.10")
exclude("org.json4s", "json4s-native_2.10")
exclude("org.scalanlp", "breeze-macros_2.10")
exclude("com.esotericsoftware.kryo", "kryo")
exclude("com.twitter", "chill_2.10"),
"org.apache.mahout" % "mahout-spark_2.10" % mahoutVersion
exclude("com.github.scopt", "scopt_2.10")
exclude("org.spire-math", "spire_2.10")
exclude("org.scalanlp", "breeze_2.10")
exclude("org.spire-math", "spire-macros_2.10")
exclude("org.apache.spark", "spark-mllib_2.10")
exclude("org.json4s", "json4s-ast_2.10")
exclude("org.json4s", "json4s-core_2.10")
exclude("org.json4s", "json4s-native_2.10")
exclude("com.twitter", "chill_2.10")
exclude("org.scalanlp", "breeze-macros_2.10")
exclude("com.esotericsoftware.kryo", "kryo")
exclude("org.apache.spark", "spark-launcher_2.10")
exclude("org.apache.spark", "spark-unsafe_2.10")
exclude("org.apache.spark", "spark-tags_2.10")
exclude("org.apache.spark", "spark-core_2.10")
exclude("org.apache.spark", "spark-network-common_2.10")
exclude("org.apache.spark", "spark-streaming_2.10")
exclude("org.apache.spark", "spark-graphx_2.10")
exclude("org.apache.spark", "spark-catalyst_2.10")
exclude("org.apache.spark", "spark-sql_2.10"),
"org.apache.mahout" % "mahout-math" % mahoutVersion,
"org.apache.mahout" % "mahout-hdfs" % mahoutVersion
exclude("com.thoughtworks.xstream", "xstream")
exclude("org.apache.hadoop", "hadoop-client"),
//"org.apache.hbase" % "hbase-client" % "0.98.5-hadoop2" % "provided",
// exclude("org.apache.zookeeper", "zookeeper"),
// other external libs
"com.thoughtworks.xstream" % "xstream" % "1.4.4"
exclude("xmlpull", "xmlpull"),
// possible build for es5
//"org.elasticsearch" %% "elasticsearch-spark-13" % elasticsearch5Version % "provided",
"org.elasticsearch" % "elasticsearch" % "1.7.5" % "provided",
"org.elasticsearch" % "elasticsearch-spark-20_2.11" % "5.5.1",
// exclude("org.apache.spark", "spark-launcher_2.11")
// exclude("org.apache.spark", "spark-unsafe_2.11")
// exclude("org.apache.spark", "spark-tags_2.11")
// exclude("org.apache.spark", "spark-core_2.11")
// exclude("org.apache.spark", "spark-network-common_2.11")
// exclude("org.apache.spark", "spark-streaming_2.11")
// exclude("org.apache.spark", "spark-catalyst_2.11")
// exclude("org.apache.spark", "spark-sql_2.11"),
"org.json4s" % "json4s-native_2.11" % "3.2.10")
.map(_.exclude("org.apache.lucene","lucene-core")).map(_.exclude("org.apache.lucene","lucene-analyzers-common")) resolvers += Resolver.mavenLocal SbtScalariform.scalariformSettings ScalariformKeys.preferences := ScalariformKeys.preferences.value
.setPreference(AlignSingleLineCaseStatements, true)
.setPreference(DoubleIndentClassDeclaration, true)
.setPreference(DanglingCloseParenthesis, Prevent)
.setPreference(MultilineScaladocCommentsStartOnFirstLine, true) assemblyMergeStrategy in assembly := {
case "plugin.properties" => MergeStrategy.discard
case PathList(ps @ _*) if ps.last endsWith "package-info.class" =>
MergeStrategy.first
case PathList(ps @ _*) if ps.last endsWith "UnusedStubClass.class" =>
MergeStrategy.first
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}

PredictionIO和Universal Recommender这样的开源产品,确实存在着官方文档不太完整或者更新不太及时的问题,按照官方手册一次成功的概率很低,需要多次的试验和调查,从其官网,邮件组,以及其他互联网渠道搜索各种线索,才能最终解决问题。

但PredictionIO的社区活跃度很好,Universal Recommender的开发者本人是PredictionIO的重要开发者,还对自己的产品有运营的意愿和行动,邮件组中的技术支持比较到位。

PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(2)的更多相关文章

  1. PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(3)

    PredictionIO+Universal Recommender虽然可以帮助中小企业快速的搭建部署基于用户行为协同过滤的个性化推荐引擎,单纯从引擎层面来看,开发成本近乎于零,但仍然需要一些前提条件 ...

  2. PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(1)

    1,PredictionIO如果用直接下载的0.11.0-incubating版本,存在一个HDFS配置相关的BUG 执行pio status命令时会发生如下的错误: -- ::, ERROR org ...

  3. SNF快速开发平台--规则引擎整体介绍及使用说明书

    一.设计目标 a)规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b)能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c)运算速度快 ...

  4. SNF快速开发平台--规则引擎在程序当中如何调用

    规则定义完如何在程序当中进行使用呢? 其时很简单,只需要如下代码就可以调用程序: 规则定义: 调用代码: #region 演示2:生成左表数据(规则) POST: /api/DEMO/DemoSing ...

  5. SNF快速开发平台--规则引擎介绍和使用文档

    设计目标: a) 规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b) 能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c) 运算速度 ...

  6. Atitit 快速开发的推荐技术标准化 规范 大原则

    Atitit 快速开发的推荐技术标准化 规范 大原则 1. 如何评估什么样的技术适合快速开发??1 1.1. (重要)判断语言层次..层次越高开发效率越高  4gl  dsl> 3.5gl &g ...

  7. 使用ASP.NET MVC、Rabbit WeixinSDK和Azure快速开发部署微信后台

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:公众号后台系统和数据都基本准备妥当了,可以来分享下我是如何开发本微信公众号的后台系统了 ...

  8. 4款java快速开发平台推荐

    JBoss Seam JBoss Seam,算得上是Java开源框架里面最优秀的快速开发框架之一. Seam框架非常出色,尤其是他的组件机制设计的很有匠心,真不愧是Gavin King精心打造的框架了 ...

  9. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...

随机推荐

  1. Hive详解

    1.   Hive基本概念 1.1  Hive简介 1.1.1 什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 1.1 ...

  2. C++反汇编第一讲,认识构造函数,析构函数,以及成员函数

    C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...

  3. ios多线程开发总结

    1>无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU空闲时就会执行). 2>更新UI应该在主线程(UI线程)中进行,并且推荐使用同步 ...

  4. B2B电商系统开发建设的价格费用取决于哪些要素

    B2B电子商务系统平台建设开发怎么做?如何搭建一个电商系统网站平台?相信我们的企业商家在搭建电子商务系统的时候都会进行前期的系统策划,但是对于电子商务系统的构建绝大多数人都有一个误区,那就是对于电子商 ...

  5. 网页设计——2. html入门

    开始正式的课程讲解了,首先来看看课程体系: Java EE(java 企业应用程序版本) java2 有三个版本:J2 SE(标准版),J2 EE(企业版).J2 ME(微缩版). 我们要掌握J2EE ...

  6. 使用Jenkins自动部署博客

    title: 使用Jenkins自动部署博客 toc: true comment: true date: 2017-12-17 19:48:10 tags: ['Jenkins', 'CI'] cat ...

  7. 更便捷的css处理方式-postcss

    更便捷的css处理方式-PostCSS 一般来说介绍一个东西都是要从是什么,怎么用的顺序来讲.我感觉这样很容易让大家失去兴趣,先看一下postcss能做点什么,有兴趣的话再往下看,否则可能没有耐心看下 ...

  8. 不用分支语句实现1+2+。。。+n

    要求: 不使用乘除法.for.while .if.else.switch.case.以及A?B:C三元表达式 求1+2+3+...+n 此题思路有多种,能够用多态.构造函数.递归.和模板元. 我在看到 ...

  9. 九、 Spring Boot 拦截器

    过滤器属于Servlet范畴的API,与spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截 ...

  10. Ubuntu 下 libgps 库的使用

    简介 一般 GPS 接收器会遵循美国国家海洋电子协会(National Marine Electronics Association)所指定的标准规格,其中包含传输资料的格式以及传输资料的通讯协议.那 ...