
    &`iB                     $   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
  ej        d          Zd Zd Zd Zdddd	Zd
 Zd Z	 d%dZd Zd Zd Zd Zd ZdZdZd Zd Zd ZdZdZdZ dZ!dZ"dZ#d Z$d  Z%d! Z&d" Z'd# Z(d$ Z)dS )&    N)is_ipv6zray.util.spark.utilsc                      dt           j        v S )NDATABRICKS_RUNTIME_VERSION)osenviron     h/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/ray/util/spark/utils.pyis_in_databricks_runtimer      s    '2:55r	   c                 n    d                     |           }d                     |          }d| d| d| dS )N  zCommand z failed with return code z", tail output are included below.

)join)cmdreturn_codetail_output_dequecmd_strtail_outputs        r
   gen_cmd_exec_failure_msgr      sW    hhsmmG''+,,K	,7 	, 	,[ 	, 	,'	, 	, 	,r	   c                     | j                             dd                                          }t          |d d                   }|d         }ddddd}|||         z  S )	Nzspark.executor.memory1g   i   i   @l        )kmgt)confgetlowerint)spark	value_str	value_num
value_unitunit_maps        r
   *get_configured_spark_executor_memory_bytesr(      sl    
6==CCEEIIcrcN##I2J&	 H x
+++r	   T)	extra_envsynchronousc                  	 t          |                                                              h d          }|rt          dt	          |                     |                    dd          }||t          d          ||ni t          j        |}t          j	        | f|dt          j
        t          j        d|t          j        d	          		fd
}t          j        |d                                           |s	fS                                 }|dk    rt%          t'          | |	                    dS )a  
    A convenience wrapper of `subprocess.Popen` for running a command from a Python
    script.
    If `synchronous` is True, wait until the process terminated and if subprocess
    return code is not 0, raise error containing last 100 lines output.
    If `synchronous` is False, return an `Popen` instance and a deque instance holding
    tail outputs.
    The subprocess stdout / stderr output will be streamly redirected to current
    process stdout.
    >   textstderrstdoutz`kwargs` cannot contain envNz5`extra_env` and `env` cannot be used at the same timeT)r/   r,   r.   r-   d   )maxlenc                      j         D ]6}                     |            t          j                             |            7d S N)r.   appendsyswrite)lineprocessr   s    r
   redirect_log_thread_fnz(exec_cmd.<locals>.redirect_log_thread_fnP   sM    N 	# 	#D$$T*** JT""""	# 	#r	   r   )targetargsr   )setkeysintersection
ValueErrorlistpopr   r   
subprocessPopenPIPESTDOUTcollectionsdeque	threadingThreadstartwaitRuntimeErrorr   )
r   r)   r*   kwargsillegal_kwargsr/   r9   r   r8   r   s
           @@r
   exec_cmdrO   *   s   " ''445Q5Q5QRRN LJD4H4HJJKKK
**UD
!
!CPQQQ"##(C2:(C(CC    G $)555# # # # # # 2<<<BBDDD *))),,..Ka$S+7HII
 
 	
 r	   c                     dd l }ddlm}  ||                     t          |           r|j        n|j        |j                            5 }|                    | |f          dk    cd d d            S # 1 swxY w Y   d S )Nr   )closing)socket
contextlibrQ   r   AF_INET6AF_INETSOCK_STREAM
connect_ex)hostportrR   rQ   socks        r
   is_port_in_user[   d   s    MMM""""""	&t}}@FOO&.&BT	
 	

 
 2 
d|,,12 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   
A22A69A6c                     t          j                     }t          j                     |z
  |k     r@t          | |          rdS t          j        d           t          j                     |z
  |k     @dS )NT   F)timer[   sleep)rX   rY   timeoutbeg_times       r
   _wait_service_uprb   p   sf    y{{H
)++
 7
*
*$%% 	4
1 )++
 7
*
*
 5r	   r     r0   c                     t          j                    }|pg }t          |          D ]1}|                    ||          }||v rt	          | |          s|c S 2t          d| d| d          )z!
    Get random unused port.
    z!Get available port between range z and z failed.)randomSystemRandomrangerandintr[   rL   )rX   min_portmax_portmax_retriesexclude_listrng_rY   s           r
   get_random_unused_portro   {   s     


C%2L;  {{8X..<dD)) 	KKK	
MHMM8MMM  r	   c                  \    ddl m}  |                                 }|t          d          |S )Nr   )SparkSessionzSpark session haven't been initiated yet. Please use `SparkSession.builder` to create a spark session and connect to a spark cluster.)pyspark.sqlrq   getActiveSessionrL   )rq   spark_sessions     r
   get_spark_sessionru      sJ    (((((( 1133M
 
 	

 r	   c                 6    | j                             d          S )Nzspark.driver.host)r   r    )r#   s    r
   !get_spark_application_driver_hostrw      s    :>>-...r	   c                    | j                                         }|ld }|                     dgd                              |                              |                                           |                    |j                  S |                    |                                	                                          S )z0Gets the current max number of concurrent tasks.Nc                     d S r3   r   )rn   s    r
   dummpy_mapperz3get_max_num_concurrent_tasks.<locals>.dummpy_mapper   s    Dr	   r]   )
_jscscparallelizewithResourcesmapcollectmaxNumConcurrentTasks_java_resource_profileresourceProfileManagerdefaultResourceProfile)spark_contextresource_profilesscrz   s       r
   get_max_num_concurrent_tasksr      s     



!
!C#	 	 	 	!!1#q))778HIIMM	
 	

')))(()9)PQQQ((&&((??AA
 
 	
r	   c                      dd l } t          t          j        v r$t	          t          j        t                             S |                                 j        S Nr   )psutil)RAY_ON_SPARK_WORKER_PHYSICAL_MEMORY_BYTESr   r   r"   virtual_memorytotal)r   s    r
   '_get_spark_worker_total_physical_memoryr      sC    MMM0BJ>>2:GHIII  ""((r	   c                      dd l } t          t          j        v r$t	          t          j        t                             S  | j        d          j        S Nr   z/dev/shm)shutil'RAY_ON_SPARK_WORKER_SHARED_MEMORY_BYTESr   r   r"   
disk_usager   )r   s    r
   %_get_spark_worker_total_shared_memoryr      sD    MMM."*<<2:EFGGG6Z((..r	   g?c                    dd l }dd l}t          t          j        v r%t          t          j        t                             }n|                                j        }|t          z  }t          t          j        v r%t          t          j        t                             }n |j
        d          j        }|t          z  }t          ||| |          \  }}}|t                              |           ||fS r   )r   r   )RAY_ON_SPARK_DRIVER_PHYSICAL_MEMORY_BYTESr   r   r"   r   r   '_RAY_ON_SPARK_NODE_MEMORY_BUFFER_OFFSET'RAY_ON_SPARK_DRIVER_SHARED_MEMORY_BYTESr   _calc_mem_per_ray_node_loggerwarning)	configured_heap_memory_bytesconfigured_object_store_bytesr   r   available_physical_memavailable_shared_memheap_mem_bytesobject_store_byteswarning_msgs	            r
   calc_mem_ray_head_noder      s    MMMMMM0BJ>>!$J@A"
 "
 "(!6!6!8!8!> 	!HH  /"*<<"2:.U#VWW0v0<<B 	FF  7M$%	7 73N& $$$---r	   c                     t          || z  t          z            }t          || z  t          z            }t          ||||          S r3   )r"   r   r   )num_task_slotsphysical_mem_bytesshared_mem_bytesr   r   available_physical_mem_per_nodeavailable_shared_mem_per_nodes          r
   _calc_mem_per_ray_worker_noder      sb     '*^+.UU' '# %(>),SS% %! "'%$%	  r	   c                 @   ddl m}m} d }|p| |z  }t          j                            d          s||k    r|}| t          z  }||k    r|}d}||k     r||k    rd| d}nd| d}|}t          |          }|t          | |z
            }	nt          |          }	|	||fS )	Nr   )&DEFAULT_OBJECT_STORE_MEMORY_PROPORTION!OBJECT_STORE_MINIMUM_MEMORY_BYTES#RAY_OBJECT_STORE_ALLOW_SLOW_STORAGEzzYour configured `object_store_memory_per_node` value is too high and it is capped by 80% of per-Ray node allocated memory.zYour operating system is configured with too small /dev/shm size, so `object_store_memory_worker_node` value is configured to minimal size (z- bytes),Please increase system /dev/shm size.zYou configured too small Ray node object store memory size, so `object_store_memory_worker_node` value is configured to minimal size (zI bytes),Please increase 'object_store_memory_worker_node' argument value.)ray._private.ray_constantsr   r   r   r   r    0_RAY_ON_SPARK_MAX_OBJECT_STORE_MEMORY_PROPORTIONr"   )
r   r   r   r   r   r   r   r   object_store_bytes_upper_boundr   s
             r
   r   r   	  sI          
 K6 '*PP  :>>?@@ ? ===!> 	(
:	; #
 :::;  	 ===!>>>9$E9 9 9 KT$ET T T  ?/00#+<?QQRR9::-{::r	   RAY_ON_SPARK_WORKER_CPU_CORESRAY_ON_SPARK_WORKER_GPU_NUMr   r   r   r   c                      dd l } t          t          j        v r$t	          t          j        t                             S |                                 S r   )multiprocessingr   r   r   r"   	cpu_count)r   s    r
   _get_cpu_coresr   Y  sE    $
22 2:;<===$$&&&r	   c                     t           t          j        v r$t          t          j        t                              S t	          j        d          dS 	 t          j        ddddd          } t          | j	        
                                                    d                    S # t          $ r5}t                              dt          |                      Y d }~dS d }~ww xY w)Nz
nvidia-smir   z1nvidia-smi --query-gpu=name --format=csv,noheaderT)shellcheckr,   capture_outputr   zU'nvidia-smi --query-gpu=name --format=csv,noheader' command execution failed, error: )r   r   r   r"   r   whichrB   runlenr.   stripsplit	Exceptionr   inforepr)completed_proces     r
   _get_num_physical_gpusr   g  s    "bj00 2:9:;;;|L!!)q#?
 
 
 >(..0066t<<===   ("1gg( (	
 	
 	
 qqqqqs   AB! !
C +*CC c                     || k    rt          d| d|  d          | |z  }|dk    r*||k    rt          d| d| d          |||z  k    r||z  }|S )Nzscpu number per Ray worker node should be <= spark worker node CPU cores, you set cpu number per Ray worker node to z* but spark worker node CPU core number is .r   z|gpu number per Ray worker node should be <= spark worker node GPU number, you set GPU devices number per Ray worker node to z- but spark worker node GPU devices number is )r?   )num_cpusnum_gpusnum_cpus_per_nodenum_gpus_per_nodenum_ray_node_slotss        r
   _get_local_ray_node_slotsr     s     8##@9J@ @4<@ @ @
 
 	

 "%661x''"$" " " " "   ,= ===!)->!>r	   c                     t                      }|dk    rt                      }nd}t          ||| |          }t                      }t	                      }t          |||||          \  }	}
}|	|
d|fS )z
    Returns tuple of (
        ray_worker_node_heap_mem_bytes,
        ray_worker_node_object_store_bytes,
        error_message, # always None
        warning_message,
    )
    r   N)r   r   r   r   r   r   )r   r   heap_memory_per_nodeobject_store_memory_per_noder   r   r   r   r   ray_worker_node_heap_mem_bytes"ray_worker_node_object_store_bytesr   s               r
   "_get_avail_mem_per_ray_worker_noder     s     H1)++2(-/@  ABB<>> 	&$	 		&* 	'*	 r	   c                    fd}| j                             dgd                              |                                          d         \  }}}}	|t	          d| d          |	t
                              |	           ||fS )a<  
    Return the available heap memory and object store memory for each ray worker,
    and error / warning message if it has.
    Return value is a tuple of
    (ray_worker_node_heap_mem_bytes, ray_worker_node_object_store_bytes,
     error_message, warning_message)
    NB: We have one ray node per spark task.
    c                     	 t                    S # t          $ rQ}dd l}d                    |                    |j                            }ddt          |          |z   d fcY d }~S d }~ww xY w)Nr   r   r   )r   r   	tracebackr   	format_tb__traceback__r   )rn   r   r   	trace_msgr   r   r   r   s       r
   mapperz1get_avail_mem_per_ray_worker_node.<locals>.mapper  s    	55!!$,	    	5 	5 	5		)"5"5ao"F"FGGIr477Y.4444444		5s    
A0AA+%A0+A0r]   r   Nz:Inferring ray worker node available memory failed, error: a  . You can bypass this error by setting following spark configs: spark.executorEnv.RAY_ON_SPARK_WORKER_CPU_CORES, spark.executorEnv.RAY_ON_SPARK_WORKER_GPU_NUM, spark.executorEnv.RAY_ON_SPARK_WORKER_PHYSICAL_MEMORY_BYTES, spark.executorEnv.RAY_ON_SPARK_WORKER_SHARED_MEMORY_BYTES.)sparkContextr}   r   r   rL   r   r   )
r#   r   r   r   r   r   'inferred_ray_worker_node_heap_mem_bytes+inferred_ray_worker_node_object_store_byteserrr   s
    ````     r
   !get_avail_mem_per_ray_worker_noder     s     5 5 5 5 5 5 5 5. 	&&sA..226::BBDDQG/3
 I I I I
 
 	
 $$$/3 r	   c                     dt           j        v r=d t           j        d                             d          D             fd| D             S | S )NCUDA_VISIBLE_DEVICESc                 P    g | ]#}t          |                                          $S r   )r"   r   ).0devs     r
   
<listcomp>z9get_spark_task_assigned_physical_gpus.<locals>.<listcomp>  s5     !
 !
 !
!$C		!
 !
 !
r	   ,c                      g | ]
}|         S r   r   )r   addrvisible_cuda_dev_lists     r
   r   z9get_spark_task_assigned_physical_gpus.<locals>.<listcomp>  s    FFF%d+FFFr	   )r   r   r   )gpu_addr_listr   s    @r
   %get_spark_task_assigned_physical_gpusr   	  si    ++!
 !
(*
3I(J(P(PQT(U(U!
 !
 !
 GFFFFFFFr	   )r   rc   r0   N)*rF   loggingr   re   r   rB   r5   rH   r^   ray._common.network_utilsr   	getLoggerr   r   r   r(   rO   r[   rb   ro   ru   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r
   <module>r      s&        				       



      - - - - - -
'
2
3
36 6 6  
, 
, 
,  	7
 7
 7
 7
 7
t	2 	2 	2   HL   *
 
 
/ / /
 
 
*) ) )/ / / 47 0 +. '#. #. #.L  *=; =; =;J !@ ; ,W )*S ' -X )*S '' ' '  :  8+ + +\8 8 8v    r	   