从PySpark中的工作节点访问ADLS上的二进制文件的最有效方法是什么?

时间:2017-01-20 16:36:28

标签: python apache-spark pyspark azure-data-lake

我已经为Azure Data Lake Store上的所有目录部署了一个具有rwx权限的Azure HDInsight群集,该目录也可用作其存储帐户。在头节点上,我可以加载例如使用以下命令从ADLS获取图像数据:

my_rdd = sc.binaryFiles('adl://{}.azuredatalakestore.net/my_file.png')

工作人员无权访问SparkContext的binaryFiles()功能。我可以使用azure-datalake-store Python SDK加载文件,但这似乎要慢得多。我假设是因为它没有实现集群和ADLS之间关联的好处。

是否有更快的方法从工作人员的关联ADLS加载文件?

如果需要,还有其他背景信息:

我正在使用PySpark将训练有素的深度学习模型应用于大量图像。由于模型需要很长时间才能加载,我的理想是:

  • 向每个工作人员发送要处理的部分图像URI列表(通过将mapPartition()应用于包含完整列表的RDD)
  • 让工作人员一次加载一张图像的数据,以便使用模型进行评分
  • 返回图像集的模型结果

由于我不知道如何有效地将图像加载到工人身上,我现在最好的选择是对包含图像字节数据的RDD进行分区,这(我假设)是内存效率低下并造成瓶颈通过让头节点完成所有数据加载。

1 个答案:

答案 0 :(得分:1)

HDInsight群集的主存储仅作为HDFS根目录提供。

mAdapter = new FirebasePostQueryAdapter(postPaths,
                                    new FirebasePostQueryAdapter.OnSetupViewListener() {
                                @Override
                                public void onSetupView(PostViewHolder holder, Post post, int position, String postKey) {
                                    setupPost(holder, post, position, postKey);
                                }
                            });
mRecyclerView.setAdapter(mAdapter);

在pyspark:

hdfs dfs -ls /user/digdug/images/
Found 3 items
-rw-r--r--   1    digdug supergroup       4957 2017-01-24 07:59 /user/digdug/images/a.png
-rw-r--r--   1    digdug supergroup       4957 2017-01-24 07:59 /user/digdug/images/b.png
-rw-r--r--   1    digdug supergroup       1945 2017-01-24 08:01 /user/digdug/images/c.png

输出:

rdd = sc.binaryFiles("/user/digdug/images")

def f(iterator):
    sizes = []
    for i in iterator:
        sizes.append(len(i[1]))
    return sizes

rdd.mapPartitions(f).collect()