我使用Angular 6前端,Django 1.11后端和Hadoop构建用于数据分析的Web应用程序。我需要以尽可能最快的方式将任何大小和格式的文件发送到Hadoop。我想同时支持私人用户和公司。我想知道将任何大小和格式的文件发送到Hadoop的最快方法是什么?
我的解决方案:
file = request.FILES['file']
path = default_storage.save(str(file), ContentFile(file.read()))
os.path.join(settings.MEDIA_ROOT, path)
command = 'hadoop fs -put ' + str(file) + ' /user/' + str(user_name) + '/' + str(file)
os.system(command)
command = 'rm -r ' + str(file)
os.system(command)
答案 0 :(得分:1)
Hadoop FS put命令将使用hdfs / webhdfs,但是即使最小的文件启动进程的开销也会使此操作受到损害。我将看看将hadoop copyfromlocal
与尽可能多的源文件和每个核心1-2个线程一起使用。
适用于处理多GB文件的任何人; hadoop fs -appendToFile
应该允许您从本地部分构建更大的文件,尽管它在命令行中不支持任何范围(实际上可以)。最新版本的Hadoop主干中正在进行一些工作,以便为HDFS提供更好的分段上传API,并设计用于并行上传块并最终合并的对象存储。
答案 1 :(得分:0)
允许任意大小的唯一方法是遵循HDFS RPC写入协议。例如。 hdfs dfs -put
否则,webhdfs或NFS网关可能对大型文件(超过几个GB)超时。
如果您不使用HDFS,请使用各自的存储库。例如Azure或S3
比上传文件更好的解决方案是使用一些RDMBS或Cassandra进行分析,然后使用Sqoop或Spark将数据以并行方式导出到Hadoop
答案 2 :(得分:0)
如果您正在使用Sqoop导入,则可以尝试使用如下所述的性能改进参数:
1. --fetch-size数字
2.-直接
3.-分割
4. -m计数
5.边界查询
在sqoop工具中