2

У меня есть некоторые данные теста в моей кассандре. Я пытаюсь извлечь эти данные из искры, но я получаю сообщение об ошибке, как:Не удается подключиться к cassandra от Spark

py4j.protocol.Py4JJavaError: An error occurred while calling o25.load. 

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

Это то, что я сделал до сих пор:

  1. начал ./bin/cassandra
  2. созданных тестовых данных с помощью cql с keyspace ="testkeyspace2" и table="emp" и некоторые ключи и соответствующие значения.
  3. Написал standalone.py
  4. Ran следующий pyspark команды оболочки.

    sudo ./bin/spark-submit --jars spark-streaming-kafka-assembly_2.10-1.6.0.jar \ 
    --packages TargetHolding:pyspark-cassandra:0.2.4 \ 
    examples/src/main/python/standalone.py 
    
  5. У Указана ошибка.


standalone.py:

from pyspark import SparkContext, SparkConf 
from pyspark.sql import SQLContext 

conf = SparkConf().setAppName("Stand Alone Python Script") 
sc = SparkContext(conf=conf) 
sqlContext = SQLContext(sc) 
loading=sqlContext.read.format("org.apache.spark.sql.cassandra")\ 
         .options(table="emp", keyspace = "testkeyspace2")\ 
         .load()\ 
         .show() 

Я также попытался с --packages datastax:spark-cassandra-connector:1.5.0-RC1-s_2.11, но я получаю ту же ошибку.


Debug:

Я проверил

netstat -tulpn | grep -i listen | grep <cassandra_pid> 

и увидел, что он прослушивает порт 9042.


Полный журнал трассировки:

Traceback (most recent call last): 
    File "~/Dropbox/Work/ITNow/spark/spark-1.6.0/examples/src/main/python/standalone.py", line 8, in <module> 
    .options(table="emp", keyspace = "testkeyspace2")\ 
    File "~/Dropbox/Work/ITNow/spark/spark-1.6.0/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 139, in load 
    File "~/Dropbox/Work/ITNow/spark/spark-1.6.0/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__ 
    File "~/Dropbox/Work/ITNow/spark/spark-1.6.0/python/lib/pyspark.zip/pyspark/sql/utils.py", line 45, in deco 
    File "~/Dropbox/Work/ITNow/spark/spark-1.6.0/python/lib/py4j-0.9-src.zip/py4j/protocol.py", line 308, in get_return_value 
py4j.protocol.Py4JJavaError: An error occurred while calling o25.load. 
: java.io.IOException: Failed to open native connection to Cassandra at {127.0.1.1}:9042 
    at com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:164) 
    at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:150) 
    at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:150) 
    at com.datastax.spark.connector.cql.RefCountedCache.createNewValueAndKeys(RefCountedCache.scala:31) 
    at com.datastax.spark.connector.cql.RefCountedCache.acquire(RefCountedCache.scala:56) 
    at com.datastax.spark.connector.cql.CassandraConnector.openSession(CassandraConnector.scala:81) 
    at com.datastax.spark.connector.cql.CassandraConnector.withSessionDo(CassandraConnector.scala:109) 
    at com.datastax.spark.connector.rdd.partitioner.CassandraRDDPartitioner$.getTokenFactory(CassandraRDDPartitioner.scala:176) 
    at org.apache.spark.sql.cassandra.CassandraSourceRelation$.apply(CassandraSourceRelation.scala:203) 
    at org.apache.spark.sql.cassandra.DefaultSource.createRelation(DefaultSource.scala:57) 
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:158) 
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:119) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) 
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381) 
    at py4j.Gateway.invoke(Gateway.java:259) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:209) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.1.1:9042 (com.datastax.driver.core.TransportException: [/127.0.1.1:9042] Cannot connect)) 
    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:227) 
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:82) 
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1307) 
    at com.datastax.driver.core.Cluster.getMetadata(Cluster.java:339) 
    at com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:157) 
    ... 22 more 

Я что-то не так?

Я действительно новичок во всем этом, поэтому я мог бы использовать некоторые советы. Благодаря!

+0

Что такое настроенный rpc_address и broadcast_rpc_address (если установлен) в cassandra.yaml на вашем узле cassandra? –

+0

rpc_address: localhost, rpc_port: 9160 и broadcast_rpc_address не установлен. – HackCode

+1

А, я уверен, что происходит, что cassandra разрешает localhost как 127.0.0.1 и прислушивается к этому конкретно. Я просто тестировал это на местном уровне, и это, по-видимому, имеет место, по крайней мере, для меня. «cqlsh 127.0.0.1» работает, но «cqlsh 127.0.1.1» этого не делает. Можете ли вы попробовать это и проверить, действительно ли это так? –

ответ

3

Основываясь на наших беседах в комментариях к вопросу, проблема в том, что «localhost» использовался для rpc_address в вашем файле cassandra.yaml. Кассандра использовала ОС для разрешения «localhost» до 127.0.0.1 и прослушивала этот интерфейс явно.

Чтобы это исправить, необходимо либо обновить rpc_address к 127.0.1.1 в cassandra.yaml и перезапустить Кассандру или обновить SparkConf ссылаться на 127.0.0.1, то есть:

conf = SparkConf().setAppName("Stand Alone Python Script") 
        .set("spark.cassandra.connection.host", "127.0.0.1") 

Хотя одна вещь, которая кажется странным я понял, что spark.cassandra.connection.host также по умолчанию имеет значение «localhost», поэтому мне странно, что соединитель искры cassandra разрешил «localhost» как «127.0.1.1», но кассандра разрешила его как «127.0.0.1».

+0

Я пробовал оба метода, и я получаю ошибку 'Не удалось открыть собственное подключение к Cassandra по адресу {127.0.1.1}: 9042'. Поэтому я столкнулся с той же проблемой, но только теперь с другим адресом. – HackCode

+0

Вы уверены, что изменили настройку rpc_address и перезапустили cassandra? Работает ли «cqlsh 127.0.1.1»? Вы случайно на OS X? Если это так, вам может потребоваться добавить этот интерфейс вручную, то есть «sudo ifconfig lo0 alias 127.0.1.1 up». –

+0

Да, я уверен, что я изменил rpc_address, а также перезапустил casandra. cqlsh 127.0.1.1 работает нормально, и вот вывод 'netstat -tulpn | grep -i слушать | grep 'http://justpaste.it/qo7j. Когда я начинаю cassandra, он говорит в конце 'INFO 17:25:49 Node localhost/127.0.0.1 state jump to NORMAL' – HackCode

0

Я проверил мой хост файл Линукс в /etc/hosts и содержание было как

127.0.0.1  localhost 
127.0.1.1  <my hostname> 

Я изменил его:

127.0.0.1  localhost 
127.0.0.1  <my hostname> 

и он работал отлично.

Как вы можете видеть в своем собственном файле журнала line number 58, он упоминает Your hostname, ganguly resolves to a loopback address: 127.0.1.1; using 192.168.1.32 instead (on interface wlan0), который, как я полагаю, применим и к вашему делу.

0

Добавьте это рядом с вашей зависимостью --packages, это сработало для меня отлично. --conf spark.cassandra.connection.host = "127.0.0.1"

Смежные вопросы