我是Scala的新手,并且一直在努力学习和理解隐式转换和参数,并遇到了一个令我感到困惑的场景.
对于上下文,我使用Scaldi在Akka应用程序中执行依赖注入,并希望有多个可注入的actor从抽象类继承.我相信我无法使抽象类成为一个特征,因为我们需要Injector通过构造函数参数使隐式可用来利用框架.
展示我所看到的行为的一个非常人为的例子如下:
class SecretSauce {}
abstract class Base(implicit secretSauce: SecretSauce) {}
class Concrete extends Base {}
object Example extends App {
... // Setup Actor system, etc, etc
implicit val secretSauce: SecretSauce = new SecretSauce()
}
Run Code Online (Sandbox Code Playgroud)
我期待一些工作,但我得到一个编译错误:
Unspecified value parameter secretSauce.
class Concrete extends Base {
^
Run Code Online (Sandbox Code Playgroud)
如果我将隐式参数添加到具体类中,就像这样,事情可行:
class Concrete(implicit secretSauce: SecretSauce) extends Base {}
Run Code Online (Sandbox Code Playgroud)
我认为我的困惑源于隐式参数如何工作 - 在我所描述的情况下,它们是不是由子类继承的?有人可以ELI5在我的例子中发生了什么或指向我可以帮助清理的参考?
谢谢!
我试图了解任务序列化在Spark中的工作方式,并对我在编写的测试中得到的一些混合结果感到困惑。
我有一些测试代码(为方便起见而简化),可以在多个节点上执行以下操作:
object TestJob {
def run(): Unit = {
val rdd = ...
val helperObject = new Helper() // Helper does NOT impl Serializable and is a vanilla class
rdd.map(element => {
helperObject.transform(element)
}).collect()
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行时run(),作业由于helperObject无法序列化而如预期般爆炸“任务不可序列化”异常。但是,当我稍作更改时,如下所示:
trait HelperComponent {
val helperObject = new Helper()
}
object TestJob extends HelperComponent {
def run(): Unit = {
val rdd = ...
rdd.map(element => {
helperObject.transform(element)
}).collect()
}
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,作业成功执行。有人可以帮我理解为什么会这样吗?在上述每种情况下,Spark究竟将哪些序列化并发送给工作人员?
我正在使用Spark版本2.1.1。
谢谢!
groupBy在流数据流定义中使用时,其最大容量为n:
source.groupBy(Int.MaxValue, _.key).to(Sink.actorRef)
Run Code Online (Sandbox Code Playgroud)
如果我挂起导致说明的子流,一个Actor接收器,并且有目的地导致子流终止于某个消息,那么这会释放groupBy容量吗?它将从去n到n-1回n,如果一个子流是通过水槽结束?这是建立动态图表的可行方法吗?
我们在AWS的一台机器上运行了一个Neo4j v3.0.4企业集群,有16个内核,当我们向它发出大量请求时,它似乎只利用了大约40%的CPU(当使用htop它查看盒子时)似乎只使用了6个核心?).在测试期间,所述盒子上的磁盘+网络IO看起来都可以忽略不计.
CPU配置文件的屏幕截图 - 平面部分是我们用负载点击它时:
使用Spring Data Neo4j 4通过一组Spring Boot应用程序将请求路由到数据库,从我们的调查来看,这些服务器看起来并不像内存,CPU和网络IO POV那样形成任何瓶颈.
我们目前不使用Bolt,也不使用因果聚类; 但是我们正计划向两者迈进.在过渡期间,是否有任何可能导致此类行为的事情?我们的数据库可能配置错误吗?这可能是JVM级问题吗?
任何建议都非常感谢 - 谢谢!
我目前正在开发一个Spring Data Neo4j 5.0.3 REST API应用程序,该应用程序与Neo4j 3.3.1因果集群连接,该集群包含3个核心节点(1个领导者和2个粉丝).无论好坏,我们还使用session.queryla SQL预处理语句向数据库提交了大量自定义cypher查询.当我们这样做时,我们注意到我们提交的自定义Cypher几乎都没有session.query被发送给任何只读的关注者.
我已经破解了代码并注意到,在Neo4jSession该query方法中,该方法总是创建一个带有类型的事务READ_WRITE.有没有办法解决这个问题,以便我们的查询正确分布在我们的集群中?
我也尝试用适当的方法标记,@Transactional(readOnly = true)但它似乎不起作用.当我进入时Neo4jTransactionManager,我在第218行看到以下内容:
private Transaction.Type getTransactionType(TransactionDefinition definition, Neo4jTransactionObject txObject) {
Transaction.Type type;
if (definition.isReadOnly() && txObject.isNewSessionHolder()) {
type = Transaction.Type.READ_ONLY;
} else if (txObject.transactionData != null) {
type = txObject.transactionData.type();
} else {
type = Transaction.Type.READ_WRITE;
}
return type;
}
Run Code Online (Sandbox Code Playgroud)
isNewSessionHolder第一个分支中的第二个条件是什么意思?在单个HTTP API调用的上下文中,我们至少调用数据库2次,因此通过第二个查询,我相信这个条件总是返回false.
鉴于这些观察结果,是否有任何简单的方法可以使我的查询被视为只读?
我目前正在使用GraphUnit,Spock和正在进行的Neo4j服务器对我的Spring Data Neo4j 4.0支持的应用程序进行集成测试.
它一直在我的测试操作之后做的图形数据库的状态断言一个非常漂亮的工具,但我注意到,为了让GraphUnit的assertGraph,并printGraph告诉我我的期望,我Neo4j的交易必须首先承诺.从逻辑上讲,这对我来说很有意义,但这也意味着我无法标记我的集成测试,@Transactional并且在一次测试中对进程数据库所做的任何数据更改都会导致后续测试.
我通过在Spock fixture方法中的每个测试方法之后清除数据库来处理这个并且这很好但我非常希望能够:
我的问题是 - 有没有办法完成这三个?如果我想使用GraphUnit,它是一个基本要求/假设事务提交?
neo4j ×3
scala ×2
akka ×1
akka-stream ×1
apache-spark ×1
cpu ×1
graphaware ×1
implicit ×1
java ×1
scaldi ×1