MaxCompute ejecuta los trabajos de MapReduce y las funciones definidas por el usuario (UDF) en modo distribuido dentro de un sandbox de Java. Este entorno garantiza que su código procese únicamente los datos que recibe y devuelva un resultado, sin acceder al sistema subyacente ni generar efectos secundarios. De esta manera, la ejecución distribuida se mantiene segura y aislada entre trabajos concurrentes.
El sandbox aplica solo al código de las tareas de MapReduce y a las UDF que se ejecutan en modo distribuido. La función principal de MapReduce no está sujeta a estas restricciones.
Restricciones
El sandbox bloquea seis categorías de operaciones. A continuación se indica una alternativa para cada categoría cuando existe alguna.
|
Categoría |
Restricción |
Alternativa |
|
Acceso a archivos locales |
No se permite la E/S directa de archivos. |
Acceda a los archivos de recursos, paquetes JAR y tablas de recursos mediante las API de MaxCompute MapReduce o MaxCompute Graph. Consulte los registros escritos en |
|
Sistema de archivos distribuido |
No se permite el acceso directo a sistemas de archivos distribuidos. |
Use MaxCompute MapReduce o MaxCompute Graph para leer y escribir tablas. |
|
JNI |
No se permiten las llamadas a Java Native Interface (JNI). |
— |
|
Hilos |
No se permite crear hilos de Java. Tampoco es posible ejecutar comandos de Linux desde subhilos. |
— |
|
Acceso a la red |
Se bloquean todas las operaciones de red, incluida la obtención de direcciones IP locales. |
— |
|
Reflexión de Java |
No se permite el permiso |
API restringidas
La llamada a cualquiera de los métodos o constructores que se muestran a continuación genera una excepción access denied. Esta lista abarca todas las API que bloquea el sandbox.
E/S de archivos
java.io.File
delete()
deleteOnExit()
exists()
canRead()
isFile()
isDirectory()
isHidden()
lastModified()
length()
list()
list(FilenameFilter filter)
listFiles()
listFiles(FilenameFilter filter)
listFiles(FileFilter filter)
canWrite()
createNewFile()
createTempFile(String prefix, String suffix)
createTempFile(String prefix, String suffix, File directory)
mkdir()
mkdirs()
renameTo(File dest)
setLastModified(long time)
setReadOnly()
java.io.RandomAccessFile
RandomAccessFile(String name, String mode)
RandomAccessFile(File file, String mode)
java.io.FileInputStream
FileInputStream(FileDescriptor fdObj)
FileInputStream(String name)
FileInputStream(File file)
java.io.FileOutputStream
FileOutputStream(FileDescriptor fdObj)
FileOutputStream(File file)
FileOutputStream(String name)
FileOutputStream(String name, boolean append)
Carga de clases y tiempo de ejecución
java.lang.Class
getProtectionDomain()
java.lang.ClassLoader
ClassLoader()
ClassLoader(ClassLoader parent)
java.lang.Runtime
exec(String command)
exec(String command, String[] envp)
exec(String[] cmdarray)
exec(String[] cmdarray, String[] envp)
exit(int status)
runFinalizersOnExit(boolean value)
addShutdownHook(Thread hook)
removeShutdownHook(Thread hook)
load(String lib)
loadLibrary(String lib)
java.lang.System
exit(int status)
runFinalizersOnExit(boolean value)
load(String filename)
loadLibrary(String libname)
getProperties()
setProperties(Properties props)
getProperty(String key) // Only the keys listed below are allowed
getProperty(String key, String def) // Only the keys listed below are allowed
setProperty(String key, String value)
setIn(InputStream in)
setOut(PrintStream out)
setErr(PrintStream err)
setSecurityManager(SecurityManager s)
System.getProperty admite únicamente a continuación claves:
java.version
java.vendor
java.vendor.url
java.class.version
os.name
os.version
os.arch
file.separator
path.separator
line.separator
java.specification.version
java.specification.vendor
java.specification.name
java.vm.specification.version
java.vm.specification.vendor
java.vm.specification.name
java.vm.version
java.vm.vendor
java.vm.name
file.encoding
user.timezone
Hilos
java.lang.Thread
Thread()
Thread(Runnable target)
Thread(String name)
Thread(Runnable target, String name)
Thread(ThreadGroup group, ...)
checkAccess()
interrupt()
suspend()
resume()
setPriority(int newPriority)
setName(String name)
setDaemon(boolean on)
stop()
stop(Throwable obj)
enumerate(Thread[] tarray)
setContextClassLoader(ClassLoader cl)
java.lang.ThreadGroup
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent, String name)
checkAccess()
enumerate(Thread[] list)
enumerate(Thread[] list, boolean recurse)
enumerate(ThreadGroup[] list)
enumerate(ThreadGroup[] list, boolean recurse)
getParent()
setDaemon(boolean daemon)
setMaxPriority(int pri)
suspend()
resume()
destroy()
interrupt()
stop()
Reflexión
java.lang.reflect.AccessibleObject
setAccessible(AccessibleObject[] array, boolean flag)
setAccessible(boolean flag)
Red
java.net.InetAddress
getHostName()
getAllByName(String host)
getLocalHost()
java.net.DatagramSocket
DatagramSocket(...)
getLocalAddress()
receive(DatagramPacket p)
java.net.Socket
Socket(...)
java.net.ServerSocket
ServerSocket(...)
accept()
implAccept(Socket s)
setSocketFactory(...)
setSocketImplFactory(...)
java.net.MulticastSocket
MulticastSocket(...)
java.net.URL
URL(...)
setURLStreamHandlerFactory(...)
java.net.URLConnection
setContentHandlerFactory(...)
setFileNameMap(FileNameMap map)
java.net.HttpURLConnection
setFollowRedirects(boolean set)
java.net.URLClassLoader
URLClassLoader(...)
Seguridad
java.security.AccessControlContext
AccessControlContext(AccessControlContext acc, DomainCombiner combiner)
getDomainCombiner()