当前位置: 首页 > 知识库问答 >
问题:

定期删除EMR群集日志

危寒
2023-03-14

我有一个EMR集群,运行一个火花流作业成功了几天。但几天后,群集因步骤失败而终止。我查了日志上面写着

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f8cb0854000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)
Command exiting with ret '1'

对于此错误,我进行了检查,发现对于JRE内存不足。
我发现集群创建EMR steps日志并存储在路径/mnt/var/logs/hadoop/steps/step_id/上,在创建集群时,我给出了一个logUri路径,日志根据该路径复制到s3位置。所以我的猜测是,由于这些日志,步骤失败正在发生。

谁能建议我如何定期从集群中删除这些emr步骤日志,以便集群不会耗尽内存?

共有1个答案

酆英达
2023-03-14

您可以使用以下boto3代码(我确信这也可以在Java中用AWS SDK for Java完成)来删除日志,对于定期删除,您有如下选项

  1. 使用像Airflow这样的工作流调度程序,请参见下面的示例
  2. 使用它作为lambda函数并安排它定期运行(容易得多)
  3. 本地使用cron jon(不太可行)

函数删除日志(输入即将到期的阈值桶名前缀,可以是“logs/sparksteps/j-”)

def clean_s3(buck, match_prefix,exp_threshold):

    s3_client = boto3.client('s3')
    key_names = []
    file_timestamp = []
    file_size = []
    kwargs = {"Bucket": buck, "Prefix": match_prefix}
    while True:
        result = s3_client.list_objects_v2(**kwargs)
        for obj in result["Contents"]:

            if "." in obj["Key"]:
                key_names.append(obj["Key"])
                file_timestamp.append(obj["LastModified"].timestamp())
                file_size.append(obj["Size"])
        try:
            kwargs["ContinuationToken"] = result["NextContinuationToken"]
        except KeyError:
            break

    key_info = {
        "key_path": key_names,
        "timestamp": file_timestamp,
        "size": file_size
    }
    #print(f'All Keys in {buck} with {prefix} Prefix found!')
    s3_file = key_info
    for i, fs in enumerate(s3_file["timestamp"]):
            #file_expired = is_expired(fs)
            #print(fs)
            if fs < exp_threshold: #if True is recieved
                    print("Deleting %s" % {s3_file["key_path"][i]})
                    s3_client.delete_object(Bucket=buck, Key=s3_file["key_path"][i])

您可以计算您需要通过的过期阈值(以纪元秒为单位),如下所示

date_now = time.time()
days = 7 # 7 days
total_time = 86400*days 
exp_threshold = date_now-total_time
  s3_cleanup = PythonOperator(
        task_id='s3cleanup',
        python_callable=clean_s3,
        op_kwargs={
            'buck': '<you bucket>',
            'match_prefix': "logs/sparksteps/j-",
            'exp_threshold':exp_threshold,
            
    },dag=dag)

或者,使用apporach 2,您可以使用AWS lamda调度它,请参见此处的lambda调度指南

 类似资料:
  • 命令用于删除集群及其所有相关内容。 这个操作是永久的并且回滚。 以下语句是命令的基本语法。 其中定义要移除的群集的名称,定义要移除的群集的ID。 示例 尝试使用以下命令删除群集。 如果上述查询成功执行,您将得到以下输出。

  • 问题内容: 我当前的光泽配置设置如下所示: 并且想知道如何删除设置的 “ max_bytes_per_sec” 部分。 你能给我一个建议吗? 问题答案: 好的。我发现了如何删除持久性设置:您转到主节点的已定义数据路径,更具体地说(在我的情况下),然后删除全局状态文件。然后重新启动elasticsearch。

  • 本部分将删除该教程所创建的全部计算资源。 计算节点 删除所有的控制节点和 worker 节点: gcloud -q compute instances delete controller-0 controller-1 controller-2 worker-0 worker-1 worker-2 网路 删除外部负载均衡器以及网络资源: gcloud -q compute forwardin

  • 大家好,所以我有这个MYSQl代码,我插入日期,当它发送和输入的日子,可以是从1做7。我怎样才能让MYSQl在输入天之后删除一行?例如:我在2021年22.03.2021下午3:54创建了一个产品,输入的过期天数是6天。我想删除产品后正好6天。

  • 本文向大家介绍nginx日志按天生成和定期删除日志的方法,包括了nginx日志按天生成和定期删除日志的方法的使用技巧和注意事项,需要的朋友参考一下 问题:nginx会按照nginx.conf的配置生成access.log和error.log,随着访问量的增长,日志文件会越来越大,既会影响访问的速度(写入日志时间延长),也会增加查找日志的难度,nginx没有这种按天或更细粒度生成日志的机制。所以下面

  • Tiller在我的kubernetes集群中工作不正常。我要删除所有的蒂勒。分蘖(2.5.1)有1个展开,1个复制集和1个荚。 null 结果为“replicaset”tiller-deploy-2745651589“deleted” 但是,会立即重新创建tiller-deploy-2745651589 Kubectl get RS-N kube-system显示tiller-deploy-274