Пример #1
0
    def __init__(
            self,
            control_address,  # type: str
            credentials=None,
            worker_id=None,  # type: Optional[str]
            # Caching is disabled by default
        state_cache_size=0,
            # time-based data buffering is disabled by default
            data_buffer_time_limit_ms=0,
            profiler_factory=None,  # type: Optional[Callable[..., Profile]]
            status_address=None,  # type: Optional[str]
    ):
        self._alive = True
        self._worker_index = 0
        self._worker_id = worker_id
        self._state_cache = StateCache(state_cache_size)
        if credentials is None:
            _LOGGER.info('Creating insecure control channel for %s.',
                         control_address)
            self._control_channel = GRPCChannelFactory.insecure_channel(
                control_address)
        else:
            _LOGGER.info('Creating secure control channel for %s.',
                         control_address)
            self._control_channel = GRPCChannelFactory.secure_channel(
                control_address, credentials)
        grpc.channel_ready_future(self._control_channel).result(timeout=60)
        _LOGGER.info('Control channel established.')

        self._control_channel = grpc.intercept_channel(
            self._control_channel, WorkerIdInterceptor(self._worker_id))
        self._data_channel_factory = data_plane.GrpcClientDataChannelFactory(
            credentials, self._worker_id, data_buffer_time_limit_ms)
        self._state_handler_factory = GrpcStateHandlerFactory(
            self._state_cache, credentials)
        self._profiler_factory = profiler_factory
        self._fns = KeyedDefaultDict(
            lambda id: self._control_stub.GetProcessBundleDescriptor(
                beam_fn_api_pb2.GetProcessBundleDescriptorRequest(
                    process_bundle_descriptor_id=id)
            ))  # type: Mapping[str, beam_fn_api_pb2.ProcessBundleDescriptor]
        # BundleProcessor cache across all workers.
        self._bundle_processor_cache = BundleProcessorCache(
            state_handler_factory=self._state_handler_factory,
            data_channel_factory=self._data_channel_factory,
            fns=self._fns)

        if status_address:
            try:
                self._status_handler = FnApiWorkerStatusHandler(
                    status_address, self._bundle_processor_cache
                )  # type: Optional[FnApiWorkerStatusHandler]
            except Exception:
                traceback_string = traceback.format_exc()
                _LOGGER.warning(
                    'Error creating worker status request handler, '
                    'skipping status report. Trace back: %s' %
                    traceback_string)
        else:
            self._status_handler = None

        # TODO(BEAM-8998) use common
        # thread_pool_executor.shared_unbounded_instance() to process bundle
        # progress once dataflow runner's excessive progress polling is removed.
        self._report_progress_executor = futures.ThreadPoolExecutor(
            max_workers=1)
        self._worker_thread_pool = thread_pool_executor.shared_unbounded_instance(
        )
        self._responses = queue.Queue(
        )  # type: queue.Queue[beam_fn_api_pb2.InstructionResponse]
        _LOGGER.info(
            'Initializing SDKHarness with unbounded number of workers.')
Пример #2
0
 def default_factory(id):
   # type: (str) -> beam_fn_api_pb2.ProcessBundleDescriptor
   return self._control_stub.GetProcessBundleDescriptor(
       beam_fn_api_pb2.GetProcessBundleDescriptorRequest(
           process_bundle_descriptor_id=id))