7

Dokładna Wyjątek jest następującyDatastax Cassandro sterownik wyrzucanie CodecNotFoundException

com.datastax.driver.core.exceptions.CodecNotFoundException: kodek nie znaleziono żądanej operacji: [-> varchar < java.math.BigDecimal]

są to wersje oprogramowania używam Spark 1,5 Datastax-Cassandra 3.2.1 CDH 5.5.1

Kod próbuję wykonać to program Spark używając java API i to w zasadzie odczytuje dane (csv's) m hdfs i ładuje go do tabel kassandra. Używam połączenia iskrobcandra. Miałem wiele problemów związanych z konfliktem biblioteki Google'a na początku, które udało mi się rozwiązać poprzez zacienianie biblioteki guawy i tworzenie słoików snap-shot z wszystkimi zależnościami.

Jednak udało mi się załadować dane dla niektórych plików, ale dla niektórych plików otrzymałem wyjątek Codec. Podczas badania tego problemu otrzymałem następujące wątki dotyczące tego samego problemu.

https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/yZyaOQ-wazk

https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/yZyaOQ-wazk

Po przejściu tych dyskusji co rozumiem to albo jest to źle wersja Cassandra-kierowca używam. Lub nadal istnieje kwestia ścieżki klasowej związanej z biblioteką guawy, ponieważ kassandra 3.0 i nowsze wersje używają guava 16.0.1, a powyższe dyskusje mówią, że na ścieżce klas może być niższa wersja guawy.

Oto pom.xml plik

<dependencies> 
<dependency> 
<groupId>org.apache.spark</groupId> 
<artifactId>spark-core_2.10</artifactId> 
<version>1.5.0</version> 
</dependency> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>3.8.1</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
<groupId>com.datastax.spark</groupId> 
<artifactId>spark-cassandra-connector-java_2.10</artifactId> 
<version>1.5.0-M3</version> 
</dependency> 
<dependency> 
<groupId>org.apache.cassandra</groupId> 
<artifactId>cassandra-clientutil</artifactId> 
<version>3.2.1</version> 
</dependency> 

</dependencies> 
    <build> 
<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.3</version> 
     <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>shade</goal> 
       </goals> 
       <configuration> 
       <filters> 
    <filter> 
     <artifact>*:*</artifact> 
     <excludes> 
      <exclude>META-INF/*.SF</exclude> 
      <exclude>META-INF/*.DSA</exclude> 
      <exclude>META-INF/*.RSA</exclude> 
     </excludes> 
    </filter> 
</filters> 
        <relocations> 
         <relocation> 
          <pattern>com.google</pattern> 
          <shadedPattern>com.pointcross.shaded.google</shadedPattern> 
         </relocation> 

        </relocations> 
        <minimizeJar>false</minimizeJar> 
        <shadedArtifactAttached>true</shadedArtifactAttached> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
</project> 

i są to zależności, które zostały pobrane przy użyciu powyższej pom

spark-core_2.10-1.5.0.jar 
spark-cassandra-connector- java_2.10-1.5.0-M3.jar 
spark-cassandra-connector_2.10-1.5.0-M3.jar 
spark-repl_2.10-1.5.1.jar 
spark-bagel_2.10-1.5.1.jar 
spark-mllib_2.10-1.5.1.jar 
spark-streaming_2.10-1.5.1.jar 
spark-graphx_2.10-1.5.1.jar 
guava-16.0.1.jar 
cassandra-clientutil-3.2.1.jar 
cassandra-driver-core-3.0.0-alpha4.jar 

powyżej to tylko niektóre z głównych zależnościami w moim słoiku snap-shot .

Y jest wyjątkiem CodecNotFoundException? Czy to ze względu na ścieżkę klasową (guava)? lub cassandra-driver (cassandra-driver-core-3.0.0-alpha4.jar dla datastax cassandra 3.2.1) lub z powodu kodu.

Kolejny punkt to wszystkie daty, które wstawiam do kolumn, których typem danych jest znacznik czasu.

Również kiedy robię iskrownik, widzę ścieżkę klasy w dziennikach. Są też inne wersje guawy, które są pod bibliotekami hadoopów. R powodują problem?

W jaki sposób określić ścieżkę klasy użytkownika podczas tworzenia polecenia z iskrą. Czy to pomoże?

Z przyjemnością zdobędę kilka punktów. Dzięki

Poniżej znajduje się StackTrace

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [timestamp <-> java.lang.String] 
at com.datastax.driver.core.CodecRegistry.notFound(CodecRegistry.java:689) 
at com.datastax.driver.core.CodecRegistry.createCodec(CodecRegistry.java:550) 
at com.datastax.driver.core.CodecRegistry.findCodec(CodecRegistry.java:530) 
at com.datastax.driver.core.CodecRegistry.codecFor(CodecRegistry.java:485) 
at com.datastax.driver.core.AbstractGettableByIndexData.codecFor(AbstractGettableByIndexData.java:85) 
at com.datastax.driver.core.BoundStatement.bind(BoundStatement.java:198) 
at com.datastax.driver.core.DefaultPreparedStatement.bind(DefaultPreparedStatement.java:126) 
at com.cassandra.test.LoadDataToCassandra$1.call(LoadDataToCassandra.java:223) 
at com.cassandra.test.LoadDataToCassandra$1.call(LoadDataToCassandra.java:1) 
at org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction$1.apply(JavaPairRDD.scala:1027) 
at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1555) 
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1121) 
at org.apache.spark.rdd.RDD$$anonfun$count$1.apply(RDD.scala:1121) 
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1850) 
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:1850) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
at org.apache.spark.scheduler.Task.run(Task.scala:88) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

Dostałam też

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [Math.BigDecimal <-> java.lang.String] 
+0

Czy możesz udostępnić ślad stosu? –

+0

Udostępniam stacktrace –

Odpowiedz

10

Po wywołaniu bind(params...) na PreparedStatement kierowca oczekuje na podanie wartości W typów/JAVA że mapę do CQI typy.

Ten błąd ([timestamp <-> java.lang.String]) informuje użytkownika, że ​​nie istnieje taki kodek zarejestrowany, który mapuje java String na cql timestamp. W sterowniku java typ timestamp jest mapowany na java.util.Date. Więc masz 2 możliwości:

  1. Jeżeli kolumna jest związany jest znacznik czasu, zapewniają Date wartość -typed zamiast String.
  2. Utwórz kodek, który mapuje timestamp <-> String. W tym celu można utworzyć sub klasę MappingCodec jak opisano na documentation site, że mapy String do timestamp:
public class TimestampAsStringCodec extends MappingCodec<String, Date> { 
    public TimestampAsStringCodec() { super(TypeCodec.timestamp(), String.class); } 

    @Override 
    protected Date serialize(String value) { ... } 

    @Override 
    protected String deserialize(Date value) { ... } 
} 

wtedy musiałaby zarejestrować Kodek:

cluster.getConfiguration().getCodecRegistry() 
    .register(new TimestampAsStringCodec()); 
+0

Dzięki temu podaję teraz wartość typu daty. Jeszcze jedno jest to, że cassandra-driver-core-3.0.0-alpha4.jar jest wystarczająco stabilny? Kiedy próbuję innych sterowników, takich jak cassandra-driver-core-3.0.0 lub 3.0.1, otrzymuję następujący błąd wyjątku DEFAULT_SSL_CIPHER_SUITES. –

+0

O ile sobie przypominam, nie było większych błędów w alfa4, ale mówiło się, że jest to alfa i lepszym wyborem byłaby wersja wydana przez GA (najlepiej 3.0.2). Czy możesz utworzyć nowe pytanie z błędem DEFAULT_SSL_CIPHER_SUITES? Jedna zmiana wprowadzona w wersji 3.0 polegała na tym, aby nie wymagać jawnego podawania zestawów szyfrów. Zgaduję, że to ma coś wspólnego z tym. –

+0

Mam mój typ kolumna tablica kassandra jako timeuuid. Czy możesz zasugerować, jaki powinien być typ danych w klasie Datastax Mapper: –

-1

lepszym rozwiązaniem jest pod warunkiem here

Prawidłowe mapowania, które kierowca oferuje po wyjęciu z pudełka dla typów tymczasowych to:

DATE  <-> com.datastax.driver.core.LocalDate : use getDate()