我想我还没有完全理解Spark是如何工作的.
这是我的设置:
我在独立模式下运行Spark集群.我正在使用4台机器:一台是大师,另外三台是工人.
我编写了一个从Cassandra集群读取数据的应用程序(请参阅https://github.com/journeymonitor/analyze/blob/master/spark/src/main/scala/SparkApp.scala#L118).
3节点Cassandra集群在同样承载Spark Worker节点的机器上运行.Spark Master节点不运行Cassandra节点:
Machine 1 Machine 2 Machine 3 Machine 4
Spark Master Spark Worker Spark Worker Spark Worker
Cassandra node Cassandra node Cassandra node
Run Code Online (Sandbox Code Playgroud)
这背后的原因是我想优化数据局部性 - 当在集群上运行我的Spark应用程序时,每个Worker只需要与其本地Cassandra节点通信.
现在,当通过spark-submit --deploy-mode client --master spark://machine-1从Machine 1(Spark Master)运行将我的Spark应用程序提交到集群时,我期望以下内容:
127.0.0.1:9042但是,情况似乎并非如此.相反,Spark Master尝试与Cassandra交谈(并且失败了,因为Machine 1主机上没有Cassandra节点).
我误解了什么?它的工作方式不同吗?事实上,驱动程序是否从Cassandra读取数据,并将数据分发给Executors?但是memory of Machine 1,即使我的集群的总内存足够,我也永远无法读取大于的数据.
或者,驱动程序是否与Cassandra联系不读取数据,而是查找如何对数据进行分区,并指示执行者读取数据中的"他们"部分?
如果有人能够引起我的兴趣,那将非常感激.
我目前正在摆弄DCPU-16汇编程序(参见http://0x10c.com/doc/dcpu-16.txt和http://jazzychad.net/dcpu.html).
在汇编程序指令转换为十六进制/二进制的方式中,有一点我不明白.
作为一个例子,采取像这样的指令
SET B, 0x0002
Run Code Online (Sandbox Code Playgroud)
应该将寄存器B的值设置为十进制2(或十六进制0x0002或二进制0b000010)
DCPU-16的指令格式是
bbbbbbaaaaaaoooo
Run Code Online (Sandbox Code Playgroud)
因此,4位用于下端的操作码,6位用于第一个值,6位用于第二个值.
在手动转换指令时,我会这样做:
SET == 0x1 == 0b0001
B == 0x01 == 0b000001
0x0002 == 0b000010
Run Code Online (Sandbox Code Playgroud)
以完整的指令结束
0b0000100000010001 == 0x811
Run Code Online (Sandbox Code Playgroud)
但DCPU-16的正确值是
0b1000100000010001 == 0x8811
Run Code Online (Sandbox Code Playgroud)
也就是说,增加了领先1 - 为什么呢?
我对汇编程序和任何其他类型的硬核低级机器指令都很陌生,所以如果这是一个非常愚蠢的问题,请耐心等待.