2011-12-15 1 views
1

저는 매우 큰 MySQL 테이블을 가지고 있습니다. (수십억 행이 있습니다.) Cassandra의 ColumnFamily로 변환하고 싶습니다. 나는 헥터를 사용하고있어.MySQL 테이블을 Cassandra의 ColumnFamily로 변환하십시오. Hector가있는 느린 배치 변이

내가 먼저 같은 내 스키마를 만들 :

String clusterName = "Test Cluster"; 
    String host = "cassandra.lanhost.com:9160"; 
    String newKeyspaceName = "KeyspaceName"; 
    String newColumnFamilyName = "CFName"; 

    ThriftCluster cassandraCluster; 
    CassandraHostConfigurator cassandraHostConfigurator; 

    cassandraHostConfigurator = new CassandraHostConfigurator(host); 
    cassandraCluster = new ThriftCluster(clusterName, cassandraHostConfigurator); 

    BasicColumnFamilyDefinition columnFamilyDefinition = new BasicColumnFamilyDefinition(); 
    columnFamilyDefinition.setKeyspaceName(newKeyspaceName); 
    columnFamilyDefinition.setName(newColumnFamilyName);  
    columnFamilyDefinition.setDefaultValidationClass("UTF8Type"); 
    columnFamilyDefinition.setKeyValidationClass(ComparatorType.UTF8TYPE.getClassName()); 
    columnFamilyDefinition.setComparatorType(ComparatorType.UTF8TYPE); 

    BasicColumnDefinition columnDefinition = new BasicColumnDefinition(); 
    columnDefinition.setName(StringSerializer.get().toByteBuffer("id")); 
    columnDefinition.setIndexType(ColumnIndexType.KEYS); 
    columnDefinition.setValidationClass(ComparatorType.INTEGERTYPE.getClassName()); 
    columnDefinition.setIndexName("id_index"); 
    columnFamilyDefinition.addColumnDefinition(columnDefinition); 

    columnDefinition = new BasicColumnDefinition(); 
    columnDefinition.setName(StringSerializer.get().toByteBuffer("status")); 
    columnDefinition.setIndexType(ColumnIndexType.KEYS); 
    columnDefinition.setValidationClass(ComparatorType.ASCIITYPE.getClassName()); 
    columnDefinition.setIndexName("status_index"); 
    columnFamilyDefinition.addColumnDefinition(columnDefinition); 

     ....... 

    ColumnFamilyDefinition cfDef = new ThriftCfDef(columnFamilyDefinition); 

    KeyspaceDefinition keyspaceDefinition = 
     HFactory.createKeyspaceDefinition(newKeyspaceName, "org.apache.cassandra.locator.SimpleStrategy", 1, Arrays.asList(cfDef)); 

    cassandraCluster.addKeyspace(keyspaceDefinition); 

를이 완료되면, 나는 목록에 저장된 내 데이터를로드 I는 같은 namedParametersJdbcTemplate와 MySQL의 데이터를 가져 오는거야 가입일 :

String clusterName = "Test Cluster"; 
String host = "cassandra.lanhost.com:9160"; 
String KeyspaceName = "KeyspaceName"; 
String ColumnFamilyName = "CFName"; 
final StringSerializer serializer = StringSerializer.get(); 

public void insert(List<SqlParameterSource> dataToInsert) throws ExceptionParserInterrupted { 

    Keyspace workingKeyspace = null; 
    Cluster cassandraCluster = HFactory.getOrCreateCluster(clusterName, host); 
    workingKeyspace = HFactory.createKeyspace(KeyspaceName, cassandraCluster); 
    Mutator<String> mutator = HFactory.createMutator(workingKeyspace, serializer); 

    ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(workingKeyspace, ColumnFamilyName, serializer, serializer); 

    long t1 = System.currentTimeMillis(); 

    for (SqlParameterSource data : dataToInsert) { 

     String keyId = "id" + (Integer) data.getValue("id"); 

    mutator.addInsertion(keyId, ColumnFamilyName, HFactory.createColumn("id", (Integer) data.getValue("id"), StringSerializer.get(), IntegerSerializer.get())); 
    mutator.addInsertion(keyId,ColumnFamilyName, HFactory.createStringColumn("status", data.getValue("status").toString())); 

      ............... 

    } 

    mutator.execute(); 

    System.out.println(t1 - System.currentTimeMillis()); 

대략 100 시간의 라인을 대략 1 시간 안에 삽입합니다. 실제로 느립니다. 내 삽입물을 멀티 스레딩하는 것에 대해 들었지만,이 특별한 경우에는 무엇을해야할지 모르겠다. BatchMutate를 사용해야합니까?

답변

1

예를 살펴 가질 수 있습니다 성능을

, 당신은 여러 스레드에서 삽입 코드를 실행해야합니다. hector를 사용하여 효율적으로 수행하는 방법에 대한 예제는 다음 스트레스 테스트 코드를 참조하십시오. https://github.com/zznate/cassandra-stress

삽입 성능 문제의 추가 소스는 열 패밀리에 적용 할 보조 인덱스 수 각 보조 색인은 '두포'아래에 추가 열 패밀리를 작성합니다.

올바르게 설계된 데이터 모델에는 많은 수의 2 차 인덱스가 필요하지 않습니다. 다음 기사에서는 카산드라의 데이터 모델링에 대한 개요를 제공합니다 : http://www.datastax.com/docs/1.0/ddl/index

+0

제가 보조 인덱스에 대해 맞다 고 생각합니다. 더 나은 퍼포먼스를 얻기 위해 그들을 제한하려고 노력할 것입니다. – Xavier

1

이를 달성하는 또 다른 방법이 있습니다. https://github.com/impetus-opensource/Kundera을 시도해 볼 수 있습니다. 너는 그것을 좋아할 것이다.

Kundera는 NoSQL Datastore를위한 JPA 2.0 호환 Object-Datastore 매핑 라이브러리이며 현재 Cassandra, HBase, MongoDB 및 모든 관계형 데이터 스토어를 지원합니다 (Kundera는 내부적으로 모든 관계형 데이터 스토어에 대해 Hibernate를 사용함).

기존 개체를 JPA 주석과 함께 사용하여 Cassandra에 저장할 수 있습니다. Kundera는 다중 언어 영속성을 지원하기 때문에 대부분의 데이터에는 MySQL을 사용하고 트랜잭션 데이터에는 Cassandra를 사용할 수있는 MySQL + Cassandra 조합을 사용합니다. 객체 및 JPA 주석에 관심을 가져야하므로 작업이 훨씬 수월합니다. 당신이 https://github.com/impetus-opensource/Kundera/wiki/Kundera-Performance

+0

꼭 한번 살펴 보겠습니다. 팁 주셔서 감사합니다 – Xavier