是否可以将文件保存在Hadoop中而不将其保存在本地文件系统中?我想做如下所示的操作,但是我想直接将文件保存在HDFS中。目前,我将文件保存在文档目录中,然后才可以使用hadoop fs -put
将它们保存在HDFS中。
class DataUploadView(GenericAPIView):
def post(self, request):
myfile = request.FILES['photo']
fs = FileSystemStorage(location='documents/')
filename = fs.save(myfile.name, myfile)
local_path = 'my/path/documents/' + str(myfile.name)
hdfs_path = '/user/user1/' + str(myfile.name)
run(['hadoop', 'fs', '-put', local_path, hdfs_path], shell=True)
答案 0 :(得分:1)
Hadoop具有REST API,可让您通过WebHDFS创建文件。
因此,您可以使用create
之类的python库基于REST API编写自己的requests
来进行HTTP。但是,也有几个支持Hadoop / HDFS并已使用REST API或通过libhdfs
使用RPC机制的python库。
只需确保您寻找的是如何创建文件,而不要让python库调用hdfs dfs -put
或hadoop fs -put
。
有关更多信息,请参见以下内容:
答案 1 :(得分:0)
以下是使用Pydoop将文件直接下载到HDFS的方法:
import os
import requests
import pydoop.hdfs as hdfs
def dl_to_hdfs(url, hdfs_path):
r = requests.get(url, stream=True)
with hdfs.open(hdfs_path, 'w') as f:
for chunk in r.iter_content(chunk_size=1024):
f.write(chunk)
URL = "https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz"
dl_to_hdfs(URL, os.path.basename(URL))
以上代码段适用于通用网址。如果您已经将文件作为Django UploadedFile
,则可以使用其.chunks
方法来遍历数据。
答案 2 :(得分:-2)
Python已安装在Linux中。它只能访问本地文件。它不能直接访问HDFS中的文件。
为了将文件直接保存/放入HDFS,您需要使用以下任何一种方法:
火花:使用Dstream传输文件
Kafka:设置配置文件的问题。最适合流式传输数据。
Flume:设置配置文件。最适合静态文件。