为 Spark 集群和 Cassandra 设置和配置 Titan
Setup and configuration of Titan for a Spark cluster and Cassandra
在 aurelius 邮件列表以及此处的 Whosebug 上已经有几个关于配置 Titan 以使其与 Spark 一起工作的具体问题的问题。但我认为缺少对使用 Titan 和 Spark 的简单设置的高级描述。
我正在寻找的是使用推荐设置的最小设置。例如,对于 Cassandra,复制因子应为 3,并且应使用专用数据中心进行分析。
根据我在 Spark、Titan 和 Cassandra 的文档中找到的信息,这样的最小设置可能如下所示:
- 实时处理 DC:3 个节点与 Titan + Cassandra(RF:3)
- Analytics DC:1 个 Spark 主节点 + 3 个带有 Cassandra 的 Spark 从节点(RF:3)
我对该设置和 Titan + Spark 一般有一些疑问:
- 设置正确吗?
- Titan 是否也应该安装在 3 个 Spark 从节点和/或 Spark 主节点上?
- 您是否可以使用其他设置?
- Spark 从站是否只从分析 DC 读取数据,理想情况下甚至从同一节点上的 Cassandra 读取数据?
也许有人甚至可以共享支持这种设置(或更好的设置)的配置文件。
所以我试了一下并设置了一个简单的 Spark 集群来与 Titan(和 Cassandra 作为存储后端)一起工作,这是我想出的:
高级概述
我这里只专注于集群的分析端,所以我把实时处理节点放出来了。
Spark由一个(或多个)master和多个slave(worker)组成。由于从服务器进行实际处理,因此他们需要访问他们处理的数据。因此 Cassandra 安装在 workers 上并保存来自 Titan 的图形数据。
作业从 Titan 节点发送到 spark master,spark master 将它们分发给他的工人。所以Titan基本上只和Spark master通信
之所以需要 HDFS,是因为 TinkerPop 将中间结果存储在其中。请注意,this changed in TinkerPop 3.2.0.
安装
HDFS
我刚刚学习了我找到的教程 here。对于 Titan,这里只有两件事要记住:
- 选择一个兼容的版本,对于Titan 1.0.0,这是1.2.1。
- 不需要来自 Hadoop 的 TaskTrackers 和 JobTrackers,因为我们只需要 HDFS 而不是 MapReduce。
火花
同样,版本必须兼容,Titan 1.0.0 也是 1.2.1。安装基本上意味着使用编译版本提取存档。最后,您可以通过导出 HADOOP_CONF_DIR
来配置 Spark 使用您的 HDFS,它应该指向 Hadoop 的 conf 目录。
泰坦的配置
您还需要在要从中启动 OLAP 作业的 Titan 节点上有一个 HADOOP_CONF_DIR
。它需要包含一个 core-site.xml
指定 NameNode 的文件:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://COORDINATOR:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
</configuration>
将 HADOOP_CONF_DIR
添加到您的 CLASSPATH
,TinkerPop 应该可以访问 HDFS。 TinkerPop documentation 包含更多相关信息以及如何检查 HDFS 是否配置正确。
最后,一个对我有用的配置文件:
#
# Hadoop Graph Configuration
#
gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.graphInputFormat=com.thinkaurelius.titan.hadoop.formats.cassandra.CassandraInputFormat
gremlin.hadoop.graphOutputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat
gremlin.hadoop.memoryOutputFormat=org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat
gremlin.hadoop.deriveMemory=false
gremlin.hadoop.jarsInDistributedCache=true
gremlin.hadoop.inputLocation=none
gremlin.hadoop.outputLocation=output
#
# Titan Cassandra InputFormat configuration
#
titanmr.ioformat.conf.storage.backend=cassandrathrift
titanmr.ioformat.conf.storage.hostname=WORKER1,WORKER2,WORKER3
titanmr.ioformat.conf.storage.port=9160
titanmr.ioformat.conf.storage.keyspace=titan
titanmr.ioformat.cf-name=edgestore
#
# Apache Cassandra InputFormat configuration
#
cassandra.input.partitioner.class=org.apache.cassandra.dht.Murmur3Partitioner
cassandra.input.keyspace=titan
cassandra.input.predicate=0c00020b0001000000000b000200000000020003000800047fffffff0000
cassandra.input.columnfamily=edgestore
cassandra.range.batch.size=2147483647
#
# SparkGraphComputer Configuration
#
spark.master=spark://COORDINATOR:7077
spark.serializer=org.apache.spark.serializer.KryoSerializer
答案
这导致以下答案:
Is that setup correct?
好像是。至少它适用于此设置。
Should Titan also be installed on the 3 Spark slave nodes and / or the Spark master?
因为这不是必需的,所以我不会这样做,因为我更喜欢用户可以访问的 Spark 和 Titan 服务器的分离。
Is there another setup that you would use instead?
我很乐意听取具有不同设置的其他人的意见。
Will the Spark slaves only read data from the analytics DC and ideally even from Cassandra on the same node?
由于明确配置了 Cassandra 节点(来自分析 DC),因此 Spark 从站不应该能够从完全不同的节点中提取数据。但我仍然不确定第二部分。也许其他人可以在这里提供更多见解?
在 aurelius 邮件列表以及此处的 Whosebug 上已经有几个关于配置 Titan 以使其与 Spark 一起工作的具体问题的问题。但我认为缺少对使用 Titan 和 Spark 的简单设置的高级描述。
我正在寻找的是使用推荐设置的最小设置。例如,对于 Cassandra,复制因子应为 3,并且应使用专用数据中心进行分析。
根据我在 Spark、Titan 和 Cassandra 的文档中找到的信息,这样的最小设置可能如下所示:
- 实时处理 DC:3 个节点与 Titan + Cassandra(RF:3)
- Analytics DC:1 个 Spark 主节点 + 3 个带有 Cassandra 的 Spark 从节点(RF:3)
我对该设置和 Titan + Spark 一般有一些疑问:
- 设置正确吗?
- Titan 是否也应该安装在 3 个 Spark 从节点和/或 Spark 主节点上?
- 您是否可以使用其他设置?
- Spark 从站是否只从分析 DC 读取数据,理想情况下甚至从同一节点上的 Cassandra 读取数据?
也许有人甚至可以共享支持这种设置(或更好的设置)的配置文件。
所以我试了一下并设置了一个简单的 Spark 集群来与 Titan(和 Cassandra 作为存储后端)一起工作,这是我想出的:
高级概述
我这里只专注于集群的分析端,所以我把实时处理节点放出来了。
Spark由一个(或多个)master和多个slave(worker)组成。由于从服务器进行实际处理,因此他们需要访问他们处理的数据。因此 Cassandra 安装在 workers 上并保存来自 Titan 的图形数据。
作业从 Titan 节点发送到 spark master,spark master 将它们分发给他的工人。所以Titan基本上只和Spark master通信
之所以需要 HDFS,是因为 TinkerPop 将中间结果存储在其中。请注意,this changed in TinkerPop 3.2.0.
安装
HDFS
我刚刚学习了我找到的教程 here。对于 Titan,这里只有两件事要记住:
- 选择一个兼容的版本,对于Titan 1.0.0,这是1.2.1。
- 不需要来自 Hadoop 的 TaskTrackers 和 JobTrackers,因为我们只需要 HDFS 而不是 MapReduce。
火花
同样,版本必须兼容,Titan 1.0.0 也是 1.2.1。安装基本上意味着使用编译版本提取存档。最后,您可以通过导出 HADOOP_CONF_DIR
来配置 Spark 使用您的 HDFS,它应该指向 Hadoop 的 conf 目录。
泰坦的配置
您还需要在要从中启动 OLAP 作业的 Titan 节点上有一个 HADOOP_CONF_DIR
。它需要包含一个 core-site.xml
指定 NameNode 的文件:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://COORDINATOR:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
</configuration>
将 HADOOP_CONF_DIR
添加到您的 CLASSPATH
,TinkerPop 应该可以访问 HDFS。 TinkerPop documentation 包含更多相关信息以及如何检查 HDFS 是否配置正确。
最后,一个对我有用的配置文件:
#
# Hadoop Graph Configuration
#
gremlin.graph=org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph
gremlin.hadoop.graphInputFormat=com.thinkaurelius.titan.hadoop.formats.cassandra.CassandraInputFormat
gremlin.hadoop.graphOutputFormat=org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.GryoOutputFormat
gremlin.hadoop.memoryOutputFormat=org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat
gremlin.hadoop.deriveMemory=false
gremlin.hadoop.jarsInDistributedCache=true
gremlin.hadoop.inputLocation=none
gremlin.hadoop.outputLocation=output
#
# Titan Cassandra InputFormat configuration
#
titanmr.ioformat.conf.storage.backend=cassandrathrift
titanmr.ioformat.conf.storage.hostname=WORKER1,WORKER2,WORKER3
titanmr.ioformat.conf.storage.port=9160
titanmr.ioformat.conf.storage.keyspace=titan
titanmr.ioformat.cf-name=edgestore
#
# Apache Cassandra InputFormat configuration
#
cassandra.input.partitioner.class=org.apache.cassandra.dht.Murmur3Partitioner
cassandra.input.keyspace=titan
cassandra.input.predicate=0c00020b0001000000000b000200000000020003000800047fffffff0000
cassandra.input.columnfamily=edgestore
cassandra.range.batch.size=2147483647
#
# SparkGraphComputer Configuration
#
spark.master=spark://COORDINATOR:7077
spark.serializer=org.apache.spark.serializer.KryoSerializer
答案
这导致以下答案:
Is that setup correct?
好像是。至少它适用于此设置。
Should Titan also be installed on the 3 Spark slave nodes and / or the Spark master?
因为这不是必需的,所以我不会这样做,因为我更喜欢用户可以访问的 Spark 和 Titan 服务器的分离。
Is there another setup that you would use instead?
我很乐意听取具有不同设置的其他人的意见。
Will the Spark slaves only read data from the analytics DC and ideally even from Cassandra on the same node?
由于明确配置了 Cassandra 节点(来自分析 DC),因此 Spark 从站不应该能够从完全不同的节点中提取数据。但我仍然不确定第二部分。也许其他人可以在这里提供更多见解?