O MaxCompute executa jobs MapReduce e funções definidas pelo usuário (UDFs) em modo distribuído dentro de um sandbox do Java. Esse sandbox garante que seu código atue apenas sobre os dados recebidos e retorne um resultado, sem acessar o sistema subjacente ou causar efeitos colaterais. Isso mantém a execução distribuída segura e isolada entre jobs concorrentes.
O sandbox se aplica somente ao código de tarefas MapReduce e a UDFs executadas em modo distribuído. A função principal do MapReduce não está sujeita a essas restrições.
Restrições
O sandbox bloqueia seis categorias de operações. Para cada categoria, há uma alternativa listada quando disponível.
|
Categoria |
Restrição |
Alternativa |
|
Acesso a arquivos locais |
E/S direta de arquivos não é permitida. |
Acesse arquivos de recursos, pacotes JAR e tabelas de recursos por meio das APIs do MaxCompute MapReduce ou MaxCompute Graph. Visualize logs gravados em |
|
Sistema de arquivos distribuído |
Acesso direto a sistemas de arquivos distribuídos não é permitido. |
Use o MaxCompute MapReduce ou MaxCompute Graph para ler e gravar tabelas. |
|
JNI |
Chamadas à Java Native Interface (JNI) são proibidas. |
— |
|
Threads |
Criação de threads Java não é permitida. Não é possível executar comandos Linux a partir de sub-threads. |
— |
|
Acesso à rede |
Todas as operações de rede são bloqueadas, incluindo a obtenção de endereços IP locais. |
— |
|
Reflexão Java |
A permissão |
— |
APIs restritas
Chamar qualquer um dos métodos ou construtores a seguir gera uma exceção access denied. Esta lista abrange todas as APIs bloqueadas pelo sandbox.
E/S de arquivos
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)
Carregamento de classes e runtime
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)
O método System.getProperty permite apenas as seguintes chaves:
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()
Reflexão
java.lang.reflect.AccessibleObject
setAccessible(AccessibleObject[] array, boolean flag)
setAccessible(boolean flag)
Rede
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(...)
Segurança
java.security.AccessControlContext
AccessControlContext(AccessControlContext acc, DomainCombiner combiner)
getDomainCombiner()