Spark 와 관련 된 디자인 모델 - 창설 형 - 공장 방법 모델

Spark 와 관련 된 디자인 모델 - 창설 형 - 공장 방법 모델
글 목록
  • Spark 와 관련 된 디자인 모델 - 창설 형 - 공장 방법 모델
  • 공장 인터페이스
  • 공장 실현
  • 클 라 이언 트
  • 왜 추상 적 인 공장 모델 을 사용 하지 않 습 니까
  • 앞에서 한 말:
    공장 방법 모델 에 대해 말하자면 간단 한 공장 모델 (정적 방법 모델) 이 라 고 할 수 밖 에 없다. 간단 한 공장 모델 은 바로 그의 행위 가 매우 간단 하 다. 즉, 하나의 인 터 페 이 스 를 정의 하여 대상 을 만 드 는 것 이다.그러나 공장 류 를 만 들 때 클 라 이언 트 를 통 해 어떤 공장 을 만 들 지 결정 한다.이렇게 공장 하 나 를 추가 해 야 한다 면 이 공장 류 를 바 꿔 야 한다.이렇게 하면 개폐 원칙 에 위배 된다.한편, 공장 방법 모델 은 통 하지 않 는 다. 그 는 클 라 이언 트 를 통 해 어느 공장 을 실례 화하 여 결정 한 것 이다. 이렇게 수정 해 야 할 것 은 클 라 이언 트 와 새로운 공장 류 를 추가 하 는 것 이다.
    여 기 는 저희 가 RPC 를 참고 로...
    공장 인터페이스
    공장 방법 모델 은 반드시 한 공장 의 인 터 페 이 스 를 계승 해 야 한다. SparkRPC 의 공장 방법 에서 도 예외 가 없 을 것 이다. 물론 이곳 의 인 터 페 이 스 는 특질 이 고 특질 과 유형 이 다 르 면 한 개의 서브 클래스 에 여러 개의 특질 을 섞 을 수 있다.
    /**
     * A factory class to create the [[RpcEnv]]. It must have an empty constructor so that it can be
     * created using Reflection.
     */
    private[spark] trait RpcEnvFactory {
    
      def create(config: RpcEnvConfig): RpcEnv
    }
    
    

    공장 실현
    이 특질 을 계승 하 는 유형 은 NettyRpcEnvFactory, 즉 RpcEnvFactory 한 공장 만 이 실현 되 었 다.
    private[rpc] class NettyRpcEnvFactory extends RpcEnvFactory with Logging {
    
      def create(config: RpcEnvConfig): RpcEnv = {
        val sparkConf = config.conf
        // Use JavaSerializerInstance in multiple threads is safe. However, if we plan to support
        // KryoSerializer in future, we have to use ThreadLocal to store SerializerInstance
        val javaSerializerInstance =
          new JavaSerializer(sparkConf).newInstance().asInstanceOf[JavaSerializerInstance]
        val nettyEnv =
          new NettyRpcEnv(sparkConf, javaSerializerInstance, config.advertiseAddress,
            config.securityManager, config.numUsableCores)
        if (!config.clientMode) {
          val startNettyRpcEnv: Int => (NettyRpcEnv, Int) = { actualPort =>
            nettyEnv.startServer(config.bindAddress, actualPort)
            (nettyEnv, nettyEnv.address.port)
          }
          try {
            Utils.startServiceOnPort(config.port, startNettyRpcEnv, sparkConf, config.name)._1
          } catch {
            case NonFatal(e) =>
              nettyEnv.shutdown()
              throw e
          }
        }
        nettyEnv
      }
    }
    

    클 라 이언 트
    공장 이 생 긴 후에 공장 을 바 꾸 는 유형, 즉 클 라 이언 트 를 사용 하면 RpcEnv 제품 을 편리 하 게 예화 할 수 있다.구체 적 인 클 라 이언 트 코드 를 살 펴 보 겠 습 니 다.마지막 코드 new NettyRpcEnvFactory().create(config) 입 니 다. 여 기 는 RpcEnv 의 Rpc 통신 환경 을 만 들 었 습 니 다.
    private[spark] object RpcEnv {
    
      def create(
          name: String,
          host: String,
          port: Int,
          conf: SparkConf,
          securityManager: SecurityManager,
          clientMode: Boolean = false): RpcEnv = {
        create(name, host, host, port, conf, securityManager, 0, clientMode)
      }
    
      def create(
          name: String,
          bindAddress: String,
          advertiseAddress: String,
          port: Int,
          conf: SparkConf,
          securityManager: SecurityManager,
          numUsableCores: Int,
          clientMode: Boolean): RpcEnv = {
        val config = RpcEnvConfig(conf, name, bindAddress, advertiseAddress, port, securityManager,
          numUsableCores, clientMode)
        new NettyRpcEnvFactory().create(config)
      }
    }
    

    왜 추상 적 인 공장 모델 을 쓰 지 않 습 니까?
    그러면 여기 서 왜 추상 적 인 공장 모델 이 아니 라 공장 방법 모델 을 사 용 했 는 지 생각해 보 세 요.
    추상 적 인 공장 모델 이 지원 하 는 장면 이 다 르 기 때문이다.
    추상 적 인 공장 모델 의 형성 은 공장 방법 모델 에서 모든 공장 이 하나의 제품 만 생산 하 는 것 을 해결 하 는 것 이다. 만약 에 두 개의 제품 이 혼합 되 어야 하 는 제품 이 존재 한다 면 공장 을 다시 만들어 야 한다. 이렇게 해서 발생 하 는 공장 류 의 복잡 한 문 제 를 다시 만들어 야 한다.하지만 이 경우 다른 제품 은 필요 없습니다.SparkRpc 가 Akka 에서 Netty 로 이전 할 때 도 제품 통합 보 다 는 새로운 실현 공장 을 만들어 야 합 니 다.
    공장 을 다시 세 워 야 합 니 다.하지만 이 경우 다른 제품 은 필요 없습니다.SparkRpc 가 Akka 에서 Netty 로 이전 할 때 도 제품 통합 보 다 는 새로운 실현 공장 을 만들어 야 합 니 다.
    이 장면 에서 NettyRpcEnv 의 직책 은 RpcEnv 만 생산 하 는 것 이 고 Spark 구조 에서 우리 가 필요 로 하 는 것 은 RpcEnv 라 는 제품 일 뿐 다른 Rpc 제품 이 필요 하지 않 습 니 다.

    좋은 웹페이지 즐겨찾기