2017-09-26 6 views
0

요청을 DynamoDB에 보내는 스파크 코드가 있습니다. 데이터베이스와 연결하는 데 사용되는 AmazonDynamoDBClient은 직렬화 할 수 없습니다. Spark에서 비 직렬화 코드를 테스트하는 방법

그래서 나는이 같은 스칼라에 mapPartition 메서드 내에서이 클래스의 인스턴스를 만들고있어 ->

recordsToWrite.mapPartitions { iter => 
    var credentials = new BasicAWSCredentials(awsAccess, awsSecret) 
    var client= new AmazonDynamoDBClient(credentials) 
    var dynamoDB=new DynamoDB(client) 
    var optTable=dynamoDB.getTable(tableName) 
    iter.map { x => 
    //some code.... 
    optTable.updateItem(x) 
    } 
} 

문제는 내가 지방의 불꽃 (스파크 및 테스트 기반) 및 DynamoDB의이 코드를 테스트 할 수있다 단위 테스트에서.

나는 (예외가 스파크에 의해 발생됩니다)

답변

1

당신은, 두 가지 구현과 함께, "진짜"한과를 직렬화하는 DynamoDBFactory 특성을 만들 수는 직렬화되지 이후 mapPartition에서 AmazonDynamoDBClient을받을 수 없어 "테스트"하나 (내가 있으리라 믿고있어 문제가 테스트 클라이언트를 "주입"하는 방법입니다) :

trait DynamoDBFactory extends Serializable { 
    def createClient(awsAccess: String, awsSecret: String): DynamoDB 
} 

class RealDynamoDBFactory extends DynamoDBFactory { 
    def createClient(awsAccess: String, awsSecret: String): DynamoDB = { 
    var credentials = new BasicAWSCredentials(awsAccess, awsSecret) 
    var client= new AmazonDynamoDBClient(credentials) 
    new DynamoDB(client) 
    } 
} 

class TestDynamoDBFactory extends DynamoDBFactory { 
    def createClient(awsAccess: String, awsSecret: String): DynamoDB = { 
    // return your test stub/mock/whatever you need 
    } 
} 

그리고, 당신의 테스트 코드가 DynamoDBFactory의 인스턴스를 기대 테스트에서 올바른 인스턴스를 전달했다/생산 코드 :

val dynamoDBFactory: DynamoDBFactory = // ...get it from caller 
recordsToWrite.mapPartitions { iter => 
    var dynamoDB = dynamoDBFactory.createClient(awsAccess, awsSecret) 
    var optTable=dynamoDB.getTable(tableName) 
    iter.map { x => 
    //some code.... 
    optTable.updateItem(x) 
    } 
} 
+0

사소한 수정을해야했지만 효과가있었습니다. 감사 :) – cmbendre