我有一个带两个节点的卡桑德拉群集。 我已经设置了spark作业,可以从具有3651568个键的cassandra集群中进行查询。
import com.datastax.spark.connector.rdd.ReadConf
import org.apache.spark.sql.cassandra
import org.apache.spark.sql.SparkSession
val conf = new SparkConf(true).set("spark.cassandra.connection.host", "hostname)
val sc = new SparkContext(conf)
val spark = SparkSession.builder().master("local").appName("Spark_Cassandra").config("spark.cassandra.connection.host", "hostname").getOrCreate()
val studentsDF = spark.read.cassandraFormat("keyspacename", "tablename").options(ReadConf.SplitSizeInMBParam.option(32)).load()
studentsDF.show(1000)
我能够查询前1000行,但无法找到从1001th
行到第2000行的读取方式,因此我可以使用spark作业从Cassandra表中批量读取数据。
根据我开始使用Java驱动程序的建议
我必须使用datastax Java驱动程序从cassandra数据库中查询。我正在使用datastax Java驱动程序版本cassandra-java-driver-3.5.1
和apache-cassandra版本apache-cassandra-3.0.9
,并且我尝试通过安装罐子来解决依赖关系还检查了yaml文件seed,listen_address和rpc_address都指向我的主机,并且start_native_transport设置为true
这是我的Java代码,用于建立与cassandra数据库的连接
import java.net.InetAddress;
import com.datastax.driver.core.Metadata;
import java.net.UnknownHostException;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Cluster.Builder;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
public class Started {
public void connect()
{
try
{
Cluster cluster;
Session session;
cluster = Cluster.builder().addContactPoints("***.***.*.*").build();
cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(2000);
System.out.println("Connected to cluster:");
session= cluster.connect("demo");
Row row = session.execute("SELECT ename FROM demo.emp").one();
System.out.println(row.getString("ename"));
cluster.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
Started st = new Started();
st.connect();
}
}
`
我在cassandra集群中只有一个节点,它已经启动并正在运行。我也可以在9042端口上使用它。 到目前为止一切顺利,但是当我运行我的Java程序时,却收到此错误或异常消息...
Connected to cluster:
`
com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /***.***.*.*:9042 (com.datastax.driver.core.exceptions.TransportException: [/***.***.*.*:9042] Cannot connect))
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:232)
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)
at com.datastax.driver.core.Cluster$Manager.negotiateProtocolVersionAndConnect(Cluster.java:1631)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1549)
at com.datastax.driver.core.Cluster.init(Cluster.java:160)
at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:342)
at com.datastax.driver.core.Cluster.connect(Cluster.java:292)
at Started.connect(Started.java:22)
at Started.main(Started.java:34)
`
任何人都可以帮忙!
答案 0 :(得分:1)
这可能不适合Spark。例如显示只显示1000条记录,但不能保证记录的顺序。多次调用可能会产生不同的结果。
如果您想分页浏览,最好的选择是在Spark中以本地迭代器的形式获取结果,但这又不是最好的方法。 Spark是一个用于处理远程集群上的数据的系统。这意味着您需要在数据框api中进行处理。
如果您真的只想缓慢地翻阅记录,则可以使用toLocalIterator
将批次抓回驱动程序机器(不推荐)。但是,只需使用Java驱动程序执行Select(*),就可以完成类似的操作。返回给您的结果集迭代器将在您逐步浏览结果时自动浏览结果。
https://docs.datastax.com/en/developer/java-driver/3.2/manual/paging/
ResultSet rs = session.execute("your query");
for (Row row : rs) {
// Process the row ...
// By default this will only pull a new "page" of data from cassandra
// when the previous page has been fully iterated through. See the
// docs for more details
}
RDD Docs for Cassandra Dataframe Docs for Cassandra // RDD API sparkContext.cassandraTable(“ ks”,“ tab”)。foreach(row => // processRow)
//Dataframe API - although similar foreach is available here as well
spark.read.format("org.apache.spark.sql.cassandra")
.load()
.select(//do some transforms)
.write(//pickoutput of request)
Why you might want to do this with an example
// This reads all data in large blocks to executors, those blocks are then pulled one at a time back to the Spark Driver.
sparkContext.cassandraTable("ks","tab").toLocalIterator
答案 1 :(得分:0)
这是驱动程序兼容性的问题。最初我使用cassandra-java-driver-3.5.1和apache-cassandra-3.0.9。
切换到cassandra-java-driver-3.0.8和apache-cassandra-3.0.9
并安装几个jar文件:slf4j-log4j12-1.7.7.jar
,log4j-1.2.17.jar
,netty-all-4.0.39.Final.jar
..
对我有用:)