python读取HADOOP/HDFS中的h5py文件

问题:

python调用hdfs包从HADOOP上读取到的h5文件为二进制数据,没办法直接转换为h5的对象。pickle.loads、.decode()都不行。
传统方式下需要先通过open(path, “wb”)文件写入硬盘,然后再从硬盘读取文件。速度慢不说,硬盘还面临大量读写,加速报废。

解决思路:

看:官方文档
找:github解答

代码:

import os
import io
import h5py
from hdfs import InsecureClient

url = "http://xxx.xxx.xxx.xxx:xxx"
user = "xxx"
connect = InsecureClient(url, user=user)
with connect.read("/test.h5") as reader:
    data = reader.read()
bio = io.BytesIO(data)
with h5py.File(bio , "w") as h5_data:
	for i in h5_data.keys():
		temp = h5_data[i][:]

比我上一版方案优雅多了!

—————————————————————————以下为上一版方案——————————————————————

解决思路:

通过内存虚拟硬盘,模拟写入为文件又从文件读取的流程,加快速度,避免消耗硬盘。

虚拟硬盘设置:

  1. 创建一个目录作为虚拟硬盘的路径
sudo mkdir /mem
  1. 设置虚拟硬盘的空间
sudo mount -t tmpfs -o size=1024m tmpfs /mem

size为虚拟硬盘的最大空间,默认为内存的一半,不用时不占用内存。用了删除后,释放内存。

  1. 如果有需要设置开机自启动
su
echo "tmpfs /mem tmpfs size=1024m 0 0" >>/etc/fstab

注:每次重启都会导致虚拟硬盘的文件丢失

代码:

import os
import h5py
from hdfs import InsecureClient

url = "http://xxx.xxx.xxx.xxx:xxx"
user = "xxx"
connect = InsecureClient(url, user=user)
with connect.read("/test.h5") as reader:
    data = reader.read()
with open("/mem/test.h5", "wb") as f:
	f.write(data)
with h5py.File("/mem/test.h5", "r") as h5_data:
	for i in h5_data.keys():
		temp = h5_data[i][:]
os.remove('/mem/test.h5')

注:多进程时注意文件的覆盖和删除冲突,如果你有更好的方法,请在评论区留言。

你可能感兴趣的:(hadoop,hdfs,大数据,分布式,python)