0

问题:是否可以在不购买昂贵的企业解决方案的情况下使用 EMR、Spark 3.0 和 S3 实现行级过滤?

我想确保我没有错过任何东西。EMR-Ranger 文档说集成支持 Spark,但它看起来完全没用,因为:

  1. 如果通过 EMR 记录服务器工作
    ,它应该提供细粒度的访问控制,但Ranger 插件文档说 EMR Spark 插件不支持写入操作、写入 CSV 和 Auro、Delta 和 Hudi、行过滤和数据屏蔽。
  2. 如果通过 EMRFS S3 Ranger Plugin 工作,则
    仅限粗粒度(db-/table-/column-级别)访问控制。没有行级过滤或数据屏蔽(由于存储级身份验证)。请参阅Ranger 插件文档

PS Hive 不是一个选项,Lake Formation 不支持 EMR 6.x (Spark 3.x)。

4

1 回答 1

2

问题:您的 Q1) .. 是否可以使用 EMR、Spark 3.0 和 S3 实现行级过滤.. 无需昂贵的解决方案..?您的 Q2 2) ..仅粗粒度(db-/table-/column-级别)访问控制。No row-level filtering or data...我在下面列出了代码片段来处理下面的问题..

回答:为了避免支付 privacera 之类的费用,我通过强制执行策略并将其传递 a来实现自己 的报告,请参阅下面的 1)和 2)示例/选项,希望您能够根据您的自定义需求扩展它。row-level filteringrowfilter"rowFilterPolicyItems"JSONJava


AWS DOCS 很烂..:

截至 2021 年 8 月,可以进行读取,但不支持写入(无论插件如何),请参阅此处的 AWS Ranger 文档。

... 以下是在 Amazon EMR 上启用 Apache Ranger 集成之前的一些注意事项和限制。1/ 当前仅 Apache Hive 支持行级授权和数据屏蔽策略。2/ EMR Ranger-Spark 插件在使用带有 Java、Scala、R 和 Pyspark 的 Spark API 读取和写入数据时强制执行细粒度授权。However, writing data using Spark SQL on Ranger-Enabled Clusters is currently not supported; 仅支持使用 SparkSQL 读取数据。...

Amazon EMR 行级过滤操作写入与读取


更新 1:即使 AWS 自己的示例也不知道如何解决它,如下所示,所以我通过查看 Apache 中的代码推出了自己的示例......

在此处输入图像描述

回答: 解决方法——所以我在自己的内部ranger rowfilter和内部实现了这些。"rowFilterPolicyItems"

  1. 选项 1 JSON 设置

{
  "rowFilterInfo" : {
    "filterExpr" : "..."
  },
  "roles" : [ "...", "..." ],
  "groups" : [ "...", "..." ],
  "conditions" : [ {
    "type" : "...",
    "values" : [ "...", "..." ]
  }, {
    "type" : "...",
    "values" : [ "...", "..." ]
  } ],
  "delegateAdmin" : true,
  "accesses" : [ {
    "type" : "...",
    "isAllowed" : true
  }, {
    "type" : "...",
    "isAllowed" : true
  } ],
  "users" : [ "...", "..." ]
}

例如,您必须实施 "rowFilterPolicyItems",您可以使用我在下面提供的示例..

  // you would setup/pass this in your JSON file
  // Or, you can also do it Programmatically in Java
  "rowFilterPolicyItems": [
    {
      "rowFilterInfo": {
        "filterExpr": "page='ranger-aws-emr3.tykt.org'"
      },
      "accesses": [
        {
          // **** I Would tinker with this access type,
          // if you are doing it Java I will paste a sample below
          "type": "select",
          "isAllowed": true
        }
      ],
      "users": [
        "reports"
      ],
      "groups": [],
      "conditions": [],
      "delegateAdmin": false
    }
  ], ...

  1. 选项 2 JAva 设置

在 Java 中,您可以按如下方式以编程方式设置RangerPolicy.RangerPolicyItem policyItem = new RangerPolicy.RangerPolicyItem();这些策略可以添加到行过滤器项中。由于 AWS 缺少此功能,因此我必须自己完成所有这些操作。大量的试验和错误,但它得到了回报。

 void createTyktPolicies(RangerService createdTyktRecordsPolicyService) throws Exception {
    RangerBaseService svc = serviceMgr.getRangerServiceByService(createdTyktRecordsPolicyService, this);
    if (svc != null) {
        List<String> serviceCheckUsers = getServiceCheckUsers(createdTyktRecordsPolicyService);
        // *** your policy as needed
        List<RangerPolicy.RangerPolicyItemAccess> allAccesses = svc.getAndAllowAllAccesses();
        List<RangerPolicy> defaultPolicies = svc.getDefaultRangerPolicies();
        if (CollectionUtils.isNotEmpty(defaultPolicies)) {
            createDefaultPolicyUsersAndGroups(defaultPolicies);
            for (RangerPolicy defaultPolicy : defaultPolicies) {
                if (CollectionUtils.isNotEmpty(serviceCheckUsers) && StringUtils.equalsIgnoreCase(defaultPolicy.getService(), createdTyktRecordsPolicyService.getName())) {

                // this is where I am creating my policy in code
                // You CAN MODIFY THE POLICY ACCORDINGLY to your needs and try
                    RangerPolicy.RangerPolicyItem policyItem = new RangerPolicy.RangerPolicyItem();
                    policyItem.setUsers(serviceCheckUsers);
                    policyItem.setAccesses(allAccesses);
                    policyItem.setDelegateAdmin(true);
                    defaultPolicy.getPolicyItems().add(policyItem);
                }
                createPolicy(defaultPolicy);
            }
        }
    }
}
于 2021-08-28T10:45:23.487 回答