使用python操作hdfs,并grep想要的数据

本文介绍了一种从HDFS中提取特定日期范围内的数据,并使用Python进行处理的方法。通过遍历日期和小时,构建文件名和HDFS路径,执行hdfs dfs-text命令读取数据,筛选符合特定条件的记录,最后将结果写入本地文件。

代码如下:

import subprocess


for day in range(24, 30):
    for h in range(0, 24):
        filename = "tls-metadata-2018-10-%02d-%02d.txt" % (day, h)
        cmd = "hdfs dfs -text /data/2018/10/%02d/%02d/*.snappy" % (day, h)
        print(cmd)
        #cmd = "cat *.py"
        cmd = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
        f = open(filename, "w")
        for line in cmd.stdout:
            try:
              arr = line.split("^")
              if len(arr) >= 120 and arr[6] == "6" and arr[25] == "SSL" and arr[107]:
                #print(line)
                f.write("^".join(arr[:32]) + "^" + arr[95] + "^" + "^".join(arr[105:119])+ "\n")
            except Exception as e:
                print(e, "fuck error", line)
        f.close()
        #import sys
        #sys.exit(0)

 

### HDFS中`hdfs dfs -rm -r`命令删除文件夹失败的原因分析与解决方案 当执行 `hdfs dfs -rm -r` 命令时如果遇到删除失败的情况,可能由多种原因引起。以下是常见的几种情况及其对应的解决方法: #### 1. 权限不足 HDFS中的操作通常受到权限控制的影响。如果尝试删除的文件或目录不属于当前用户,则可能会因权限不足而失败。 - **验证权限**:可以先通过 `-ls` 或者 `-stat` 查看目标路径的具体属性。 ```bash hdfs dfs -ls /path/to/directory/ ``` - 如果发现权限不足,可以通过修改文件所属权或者更改访问模式来解决问题: ```bash # 修改所有权给当前用户 hdfs dfs -chown username /path/to/directory/ # 更改读写权限(如赋予所有人可写的权限) hdfs dfs -chmod -R 777 /path/to/directory/ ``` 上述命令会递归地改变整个目录树上的权限设置[^3]。 #### 2. 文件被锁定或正在使用 某些情况下,文件可能正被其他进程占用而导致无法正常移除。这常见于MapReduce作业运行期间产生的中间数据文件。 - 使用以下命令确认是否有活动的应用程序关联到该位置: ```bash yarn application -list | grep 'application_' ``` 一旦找到相关联的任务ID(`application_ID`),可以选择终止它以便释放资源锁住的状态: ```bash yarn application -kill application_ID ``` 之后再试一次删除动作应该就能成功完成[^1]。 #### 3. 路径错误或不存在的目标对象 输入不正确的路径也可能造成看似合理的删除请求却得不到预期响应的现象发生。因此,在实际执行前最好再次核实所指定的位置确实存在指向想要处理的对象上。 - 验证路径是否存在以及其内容结构如何: ```bash hdfs dfs -test -e /path/to/check/exist; echo $? hdfs dfs -ls /path/to/check/listing; ``` 返回值为零表示测试通过即路径有效;非零则意味着未匹配任何条目[^2]。 #### 4. 特殊字符干扰解析逻辑 有时候文件名里包含了特殊符号比如空格、括号之类的成分会让shell解释器误解我们的意图从而引发异常状况。针对这种情况我们需要适当调整语法表达方式以规避潜在风险。 对于含有复杂命名规则的内容建议加上双引号包裹起来明确界限范围: ```bash hdfs dfs -rm -r "/full/path with spaces/" ``` 另外还可以考虑转义特定的关键字部分避免冲突误判现象的发生: ```bash hdfs dfs -rm -r \/another\/example\(escaped\)/folder ``` 以上就是关于HDFS环境下利用`hdfs dfs -rm -r`指令清除目录过程中可能出现的一些障碍因素探讨连同相应的对策措施介绍完毕。 ```python # Python脚本辅助批量清理符合条件的小型文档实例演示 from subprocess import call def remove_small_files(directory, threshold=1024): # 默认单位byte cmd_template = f"hdfs dfs -find {directory} -type f -size {{{threshold}-}}c" result = call(cmd_template.split()) if not result: print(f"No files larger than {threshold} bytes found.") else: delete_cmd = ["hdfs", "dfs", "-rm", "-r"] + list(result.stdout.decode().splitlines()) confirm = input("Proceed to delete these items? (y/n)") if confirm.lower() == 'y': call(delete_cmd) remove_small_files("/tmp/sample_data/") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值