尝试在Azure上创建目录时出现AccessControlException

时间:2018-08-07 09:22:15

标签: java azure azure-storage azure-data-lake

我正在尝试使用azure数据湖依赖性在azureDataLake中创建目录

<dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-data-lake-store-sdk</artifactId>
            <version>2.1.5</version>
</dependency>

使用以下方法:

private ADLStoreClient client; 
public boolean createDirectory(String path) {
        try {

            // create directory
            client.createDirectory(path);

        } catch (ADLException ex) {
            printExceptionDetails(ex);
            return false;
        } catch (Exception ex) {
            log.error(" Exception in createDirectory : {}", ex);
            return false;
        }
        return true;
    } 

我得到了这个例外:

Error creating directory /gx-zweappdhd004/home/azhdipaasssh2/ADH/Compta/1458/1533632735200/RAPPORTS/
Operation MKDIRS failed with HTTP403 : AccessControlException 

我检查了权限,并拥有所有权限,因此与权限无关。

更新

更具体地讲,方法isSuccessfulResponse()内发生的问题,确切地说是在此行HttpTransport.java#L137内,因为httpResponseCode等于403,任何人都可以对此进行解释。

Update2

我发现此行返回403状态:HttpTransport.java#L288,我也尝试评估conn.getErrorStream().read(),并得到了stream is closed,仅供参考,这是错误的,有时但并非总是如此。

1 个答案:

答案 0 :(得分:1)

我没有重现您的问题,您可以参考我的工作代码:

import com.microsoft.aad.adal4j.AuthenticationContext;
import com.microsoft.aad.adal4j.AuthenticationResult;
import com.microsoft.aad.adal4j.ClientCredential;
import com.microsoft.azure.datalake.store.ADLStoreClient;

import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CreateDirectory {

    static ADLStoreClient client;

    public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
        setup();
    }

    public static void setup() throws IOException, ExecutionException, InterruptedException {
        String APP_ID = "<your app id>";
        String APP_SECRET = "<your app secret>";
        String dirName = "/jay";
        String StoreAcct = "jaygong";

        String authority = "https://login.microsoftonline.com/<your tenant id>";
        String resourcUrl = "https://management.core.windows.net/";
        ExecutorService service = Executors.newFixedThreadPool(1);

        AuthenticationContext context = new AuthenticationContext(authority, true, service);

        // Acquire Token
        Future<AuthenticationResult> result = context.acquireToken(
                resourcUrl,
                new ClientCredential(APP_ID, APP_SECRET),
                null
        );
        String token = result.get().getAccessToken();
        System.out.println(token);

        String account = StoreAcct + ".azuredatalakestore.net";
        client = ADLStoreClient.createClient(account, token);

        client.createDirectory(dirName);
        System.out.println("finish.....");

    }
}

enter image description here

不要忘记为您的客户端授予访问权限ADL许可。

enter image description here

enter image description here

希望它对您有帮助。