MaxCompute exécute les tâches MapReduce et les fonctions définies par l'utilisateur (UDF) en mode distribué au sein d'un sandbox Java. Ce mécanisme garantit que votre code traite uniquement les données qu'il reçoit et renvoie un résultat, sans accéder au système sous-jacent ni provoquer d'effets secondaires. Cette isolation assure la sécurité de l'exécution distribuée entre les tâches concurrentes.
Le sandbox s'applique uniquement au code des tâches MapReduce et aux UDF exécutées en mode distribué. La fonction principale MapReduce n'est pas soumise à ces restrictions.
Restrictions
Le sandbox bloque six catégories d'opérations. Pour chaque catégorie, une alternative est proposée lorsqu'elle existe.
| Catégorie | Restriction | Alternative |
|---|---|---|
| Accès aux fichiers locaux | Les opérations d'E/S directes sur les fichiers sont interdites. | Accédez aux fichiers de ressources, aux packages JAR et aux tables de ressources via les API MaxCompute MapReduce ou MaxCompute Graph. Consultez les journaux écrits dans System.out et System.err à l'aide de la commande Log sur le client MaxCompute. |
| Système de fichiers distribué | L'accès direct aux systèmes de fichiers distribués est interdit. | Utilisez MaxCompute MapReduce ou MaxCompute Graph pour lire et écrire dans les tables. |
| JNI | Les appels à l'interface native Java (JNI) sont interdits. | — |
| Threads | La création de threads Java est interdite. L'exécution de commandes Linux depuis des sous-threads est impossible. | — |
| Accès réseau | Toutes les opérations réseau sont interdites, y compris l'obtention des adresses IP locales. | — |
| Réflexion Java | L'autorisation suppressAccessChecks n'est pas accordée. Les champs privés et les méthodes privées ne peuvent pas être rendus accessibles. |
— |
API restreintes
L'appel de l'une des méthodes ou de l'un des constructeurs suivants déclenche une exception access denied. Cette liste couvre toutes les API bloquées par le sandbox.
E/S de fichiers
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)
Chargement de classes et exécution
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)
La méthode System.getProperty n'autorise que les clés suivantes :
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
Threads
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()
Réflexion
java.lang.reflect.AccessibleObject
setAccessible(AccessibleObject[] array, boolean flag)
setAccessible(boolean flag)
Réseau
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(...)
Sécurité
java.security.AccessControlContext
AccessControlContext(AccessControlContext acc, DomainCombiner combiner)
getDomainCombiner()