【问题标题】:How to fix Failed to open native connection to Cassandra at {server ip}:9042如何修复无法在 {server ip}:9042 打开到 Cassandra 的本机连接
【发布时间】:2019-08-20 02:13:39
【问题描述】:

我正在尝试使用 spark-cassandra-connector 连接 spark 和 Cassandra。连接已建立,但是当我尝试对 JavaRDD 执行操作时,我正面临着。

   java.io.IOException: Failed to open native connection to Cassandra at {10.0.21.92}:9042

这是我正在尝试实现的配置和代码:

    SparkConf sparkConf = new SparkConf().setAppName("Data Transformation").set("spark.serializer","org.apache.spark.serializer.KryoSerializer").setMaster("local[4]");
    sparkConf.set("spark.cassandra.connection.host", server ip);
    sparkConf.set("spark.cassandra.connection.port", "9042");
    sparkConf.set("spark.cassandra.connection.timeout_ms", "5000");
    sparkConf.set("spark.cassandra.read.timeout_ms", "200000");
    sparkConf.set("spark.cassandra.auth.username", user_name);
    sparkConf.set("spark.cassandra.auth.password", password);

    JavaSparkContext sparkContext = new JavaSparkContext(sparkConf);

下面是我在 javardd 上执行操作的代码:

    CassandraJavaRDD<CassandraRow> cassandraRDD = CassandraJavaUtil.javaFunctions(sparkContext).cassandraTable(keySpaceName, tableName);
    JavaRDD<GenericTriggerEntity> rdd = cassandraRDD.map(new Function<CassandraRow, GenericTriggerEntity>() {

    private static final long serialVersionUID = -165799649937652815L; 

    @Override
    public GenericTriggerEntity call(CassandraRow row) throws Exception {
    GenericTriggerEntity genericTriggerEntity = new GenericTriggerEntity();
    if(row.getString("end") != null)                        genericTriggerEntity.setEnd(row.getString("end"));
    if(row.getString("key") != null)
    genericTriggerEntity.setKey(row.getString("key"));
    genericTriggerEntity.setKeyspacename(row.getString("keyspacename"));
    genericTriggerEntity.setPartitiondeleted(row.getString("partitiondeleted"));
    genericTriggerEntity.setRowdeleted(row.getString("rowDeleted"));
    genericTriggerEntity.setRows(row.getString("rows"));
    genericTriggerEntity.setStart(row.getString("start"));
    genericTriggerEntity.setTablename("tablename");
    genericTriggerEntity.setTriggerdate(row.getString("triggerdate"));
    genericTriggerEntity.setTriggertime(row.getString("triggertime"));
    genericTriggerEntity.setUuid(row.getUUID("uuid"));
    return genericTriggerEntity;
    }               

    });

这是我正在执行的 JavaRDD 操作


    JavaRDD<String> jsonDataRDDwords = rdd.flatMap(s -> Arrays.asList(SPACE.split((CharSequence) s)));
    JavaPairRDD<String, Integer> jsonDataRDDones = jsonDataRDDwords.mapToPair(s -> new Tuple2<>(s, 1));
    JavaPairRDD<String, Integer> jsonDataRDDcounts = jsonDataRDDones.reduceByKey((i1, i2) -> i1 + i2);
    List<Tuple2<String, Integer>> jsonDatRDDoutput = jsonDataRDDcounts.collect();

我什至尝试 telnet 到 Cassandra 服务器,端口是开放的。

我能够建立连接,但在执行 reduceByKey 时出现上述异常。

我无法弄清楚问题所在。 javardd 操作有问题。 任何帮助,将不胜感激。 提前致谢。

【问题讨论】:

  • 可以尝试执行cqlsh IP吗?
  • 我在本地安装了 Cassandra 并尝试了 cqlsh 127.0.0.0 它给出了错误连接错误:('无法连接到任何服务器',{'127.0.0.0':错误(101,“尝试连接到 [('127.0.0.0', 9042)]。最后一个错误:网络无法访问")})
  • 试试127.0.0.1
  • 是的,连接到 127.0.0.1 但没有解决本机连接问题。谢谢:)

标签: java spring-boot apache-spark cassandra spark-cassandra-connector


【解决方案1】:

上述错误是由于cassandra驱动核心的一些依赖问题。 通过在我的 pom.xml 中添加度量依赖来解决它

<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>3.2.2</version>
</dependency>

【讨论】:

    【解决方案2】:

    您可以使用 socat 命令将本地端口转发到远程 cassandra 端口:

    apt-get install socat
    socat tcp-listen:9042,fork tcp:10.0.21.92:9042 &
    

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 2021-08-04
      • 2015-09-04
      • 1970-01-01
      • 2017-05-06
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      相关资源
      最近更新 更多