0

私はSpark経由で書き込みをしようとしています。 私は、クラスタ内の6つのノードを持っており、それに私がデータを書き込みしたい鍵空間を作った:Cassandra ClusterはSpark経由でノードを見ることができません

私はスパークから書き込みをしようとしている
CREATE KEYSPACE traffic WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '2'} AND durable_writes = true; 

、私はこの種のエラーを取得しています

:私は nodetool describeclusterを実行する場合、私はこの結果を得、また

import org.apache.spark.sql.SQLContext 
import org.apache.spark.{SparkConf, SparkContext} 
import org.apache.spark 
import org.apache.spark.storage.StorageLevel 
import org.apache.spark.sql.types.{StructType, StructField, DateType, IntegerType}; 




object ff { 
def main(string: Array[String]) { 

val conf = new SparkConf() 
    .set("spark.cassandra.connection.host", "127.0.0.1") 
    .set("spark.cassandra.connection.host","ONE") 
    .setMaster("local[4]") 
    .setAppName("ff") 

val sc = new SparkContext(conf) 
val sqlContext = new SQLContext(sc) 

val df = sqlContext.read 
    .format("com.databricks.spark.csv") 
    .option("header", "true") // Use first line of all files as header 
    .option("inferSchema", "true") 
    .load("test.csv") 

df.registerTempTable("ff_table") 
//df.printSchema() 

df.count 
time { 
    df.write 
    .format("org.apache.spark.sql.cassandra") 
    .options(Map("table" -> "ff_table", "keyspace" -> "traffic")) 
    .save() 
} 
def time[A](f: => A) = { 
    val s = System.nanoTime 
    val ret = f 
    println("time: " + (System.nanoTime - s)/1e6 + "ms") 
    ret 
} 



} 
} 

16/08/17 16:14:57 ERROR QueryExecutor: Failed to execute: [email protected] 
com.datastax.driver.core.exceptions.UnavailableException: Not enough replicas available for query at consistency ONE (1 required but only 0 alive) 

この は私が正確に何をやっているコードのスニペットです

Cluster Information: 
Name: Test Cluster 
Snitch: org.apache.cassandra.locator.DynamicEndpointSnitch 
Partitioner: org.apache.cassandra.dht.Murmur3Partitioner 
Schema versions: 
    bf6c3ae7-5c8b-3e5d-9794-8e34bee9278f: [127.0.0.1, 127.0.0.2, 127.0.0.3, 127.0.0.4, 127.0.0.5, 127.0.0.6] 

私はreplication_factorの行にCLIに挿入しよう:ので、すべてのノードがお互いを見ることができる、2、それが働いています。 なぜSparkは、Sparkからデータを挿入しようとしている間にノードが見えないのか、それ以外は何も挿入できないのですか?

答えて

2

ループバックによって1台のマシンで6つのノードを実行しているようです。これは、このマシンのリソースが購読を超過している可能性が高いことを意味します。さまざまなカサンドラのインスタンスは、重い荷物の下で紛失する可能性が高いため、ターンやスワッピングを行う可能性が最も高いです。レプリケーションファクタを増やすと、有効なターゲットがアップしているが、さらに負荷が増加する可能性が高くなります。

C *では、システムのいくつかの異なるリソースが必要です。いずれかがボトルネックになると、ノードが十分な時間にゴシップに応答しなくなる可能性があります。

これらのリソースは です。RAM - JVMが取得できるメモリ量は、OSスワップの影響を受けます。つまり、大規模なJVMを割り当てても、OSがディスクにスワップすると、大きなパフォーマンス上の問題が発生する可能性があります。同じマシン上に複数のノードがある場合は、起動するすべてのノードのJVMに十分なRAMがあることを確認する必要があります。さらに、いずれかのインスタンスのJVMが完全に近づいている場合は、GCとおそらくGC Stormを入力します。これは基本的にそのインスタンスをロックします。これらの詳細の多くは、system.logで明らかになります。

CPU - 少なくとも1つのCPUに排他的にアクセスすることなく、C *で重要なスレッドを持つことがほとんど保証され、それらの間に長い遅延があります。これにより、ゴシップスレッドが無視され、ゴシップが失敗する可能性があります。これにより、一部のノードには、障害が発生したマシンのあるクラスタのビューが表示され、使用できないエラーが発生します。

ディスク - すべてのCassandraインスタンスは、独自のCommitLogファイルとHDファイルを保持します。コミットログは10秒ごとにフラッシュされ、複数のインスタンスと1つのハードドライブしか持たない場合、コミットログと通常のmemtablesの間のフラッシュは簡単に互いにブロックできます。これは、別の大量のIOを必要とする圧縮によってさらに複雑になります。

NETWORK - これは同じマシン上の複数のノードでは問題ありませんが、

合計で C *インスタンスに割り当てられたリソースが、インスタンスが別のインスタンスのspace/ram/cpuをオーバーランしないように十分小さいことを確認することが重要です。そうすると、上記のリソースの1つにボトルネックがあるため、ロード時に通信が失敗するクラスタになります。これは、同じマシン上で複数のノードを実行することは不可能ではありませんが、プロビジョニングに注意する必要があることを意味します。また、書き込み速度を抑えることで負荷を軽減して、ノードが互いにぶつかる可能性を減らすこともできます。

+0

Hmだから、その量のノードをローカルでテストすることは不可能だと言っていますか? 私がCassandraに保存しようとしているcsvは約3.2GB、私のSSDには約30GBの空き容量があります。あなたが数えしようとすると、その数を上回ってはいけません。あるいは、コピーを開始し、後でエラー「メモリ不足」を出すか、それとも何かを思い出す必要があります。私は正しい? 私も4つのノードと 'replication_factor':2で試しましたが、彼は切断していました:http://stackoverflow.com/questions/38978886/cant-write-to-cluster-if-replication-factor-is-greater-than -1?noredirect = 1#comment65315513_38978886 –

+0

詳細については私の解答を編集します – RussS

+0

後日、6つのノードに 'replication_factor:1'と書くことができました。私は書き込みの一貫性のレベルで実験を始めましたが、すべてが崩壊しました。今はこのエラーのために私は全く書くことができません。 また、すべてのノードはSSDの1つのパーティションにありますが、私がHDDの別のパーティションを作成し、そこに3つのノード(SSDに3つ、HDDに3つ)を設定すると、何かできますか?私はちょうどこれがなぜ働いていたのか分かりませんし、突然デフォルトにロールバックしていないのです。また、上記のコメントで私があなたに与えた2番目のスレッドを見たことがありますか? –

関連する問題