## Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements. See the NOTICE file distributed with# this work for additional information regarding copyright ownership.# The ASF licenses this file to You under the Apache License, Version 2.0# (the "License"); you may not use this file except in compliance with# the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#from __future__ import print_functionfrom pyjava.api.mlsql import PythonContextfrom pyjava.cache.code_cache import CodeCachefrom pyjava.utils import *# 'resource' is a Unix specific module.has_resource_module = Truetry:import resourceexcept ImportError:has_resource_module = Falseimport tracebackimport loggingfrom pyjava.serializers import \write_with_length, \write_int, \read_int, read_bool, SpecialLengths, UTF8Deserializer, \PickleSerializer, ArrowStreamPandasSerializer, ArrowStreamSerializerif sys.version >= '3':basestring = strelse:pass# logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level='DEBUG')pickleSer = PickleSerializer()utf8_deserializer = UTF8Deserializer()globals_namespace = globals()def read_command(serializer, file):command = serializer.load_stream(file)return commanddef chain(f, g):"""chain two functions together """return lambda *a: g(f(*a))def main(infile, outfile):try:try:import rayexcept ImportError:pass# set up memory limitsmemory_limit_mb = int(os.environ.get('PY_EXECUTOR_MEMORY', "-1"))if memory_limit_mb > 0 and has_resource_module:total_memory = resource.RLIMIT_AStry:(soft_limit, hard_limit) = resource.getrlimit(total_memory)msg = "Current mem limits: {0} of max {1}\n".format(soft_limit, hard_limit)logging.info(msg)# convert to bytesnew_limit = memory_limit_mb * 1024 * 1024if soft_limit == resource.RLIM_INFINITY or new_limit < soft_limit:msg = "Setting mem limits to {0} of max {1}\n".format(new_limit, new_limit)logging.info(msg)resource.setrlimit(total_memory, (new_limit, new_limit))except (resource.error, OSError, ValueError) as e:# not all systems support resource limits, so warn instead of failinglogging.warning("WARN: Failed to set memory limit: {0}\n".format(e))split_index = read_int(infile)logging.info("split_index:%s" % split_index)if split_index == -1: # for unit testssys.exit(-1)is_barrier = read_bool(infile)bound_port = read_int(infile)logging.info(f"is_barrier {is_barrier}, port {bound_port}")conf = {}for i in range(read_int(infile)):k = utf8_deserializer.loads(infile)v = utf8_deserializer.loads(infile)conf[k] = vlogging.debug(f"conf {k}:{v}")command = utf8_deserializer.loads(infile)ser = ArrowStreamSerializer()timezone = conf["timezone"] if "timezone" in conf else Noneout_ser = ArrowStreamPandasSerializer(timezone, True, True)is_interactive = os.environ.get('PY_INTERACTIVE', "no") == "yes"import uuidcontext_id = str(uuid.uuid4())if not os.path.exists(context_id):os.mkdir(context_id)def process():try:input_data = ser.load_stream(infile)code = CodeCache.get(command)if is_interactive:global data_managerglobal contextdata_manager = PythonContext(context_id, input_data, conf)context = data_managerglobal globals_namespaceexec(code, globals_namespace, globals_namespace)else:data_manager = PythonContext(context_id, input_data, conf)n_local = {"data_manager": data_manager, "context": data_manager}exec(code, n_local, n_local)out_iter = data_manager.output()write_int(SpecialLengths.START_ARROW_STREAM, outfile)out_ser.dump_stream(out_iter, outfile)finally:try:import shutilshutil.rmtree(context_id)except:passtry:if hasattr(out_iter, 'close'):out_iter.close()except:passtry:del data_managerexcept:passprocess()except Exception:try:write_int(SpecialLengths.ARROW_STREAM_CRASH, outfile)write_int(SpecialLengths.PYTHON_EXCEPTION_THROWN, outfile)write_with_length(traceback.format_exc().encode("utf-8"), outfile)except IOError:# JVM close the socketpassexcept Exception:# Write the error to stderr if it happened while serializingprint("Py worker failed with exception:", file=sys.stderr)print(traceback.format_exc(), file=sys.stderr)sys.exit(-1)write_int(SpecialLengths.END_OF_DATA_SECTION, outfile)flag = read_int(infile)if flag == SpecialLengths.END_OF_STREAM:write_int(SpecialLengths.END_OF_STREAM, outfile)else:# write a different value to tell JVM to not reuse this workerwrite_int(SpecialLengths.END_OF_DATA_SECTION, outfile)sys.exit(-1)if __name__ == '__main__':# Read information about how to connect back to the JVM from the environment.java_port = int(os.environ["PYTHON_WORKER_FACTORY_PORT"])(sock_file, _) = local_connect_and_auth(java_port)main(sock_file, sock_file)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。