hadoop—在amazon elastic mapreduce和s3中读取参数文件

8yoxcaq7  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(415)

我试图在amazon弹性mapreduce系统中运行hadoop程序。我的程序从本地文件系统获取一个输入文件,其中包含程序运行所需的参数。但是,由于文件通常是从本地文件系统读取的,因此 FileInputStream 任务在aws环境中执行时失败,错误为未找到参数文件。注意,我已经把这个文件上传到amazons3了。我怎样才能解决这个问题?谢谢。下面是我用来读取参数表文件并读取文件中参数的代码。

FileInputStream fstream = new FileInputStream(path);
            FileInputStream os = new FileInputStream(fstream);
            DataInputStream datain = new DataInputStream(os);
            BufferedReader br = new BufferedReader(new InputStreamReader(datain));

            String[] args = new String[7];

            int i = 0;
            String strLine;
            while ((strLine = br.readLine()) != null) {
                args[i++] = strLine;
            }
30byixjq

30byixjq1#

如果必须从本地文件系统读取文件,可以将emr作业配置为使用boostrap操作运行。在该操作中,只需使用s3cmd或类似命令将文件从s3复制到本地文件。
您还可以通过hadoop文件系统类来读取文件,因为我非常确定emr支持这样的直接访问。例如:

FileSystem fs = FileSystem.get(new URI("s3://my.bucket.name/"), conf);
DataInputStream in = fs.open(new Path("/my/parameter/file"));
xeufq47z

xeufq47z2#

我还没有尝试amazonelastic,但是它看起来像一个典型的分布式缓存应用程序。您可以使用添加文件缓存 -files 选项(如果您实施 Tool / ToolRunner )或者 job.addCacheFile(URI uri) 方法,并像它在本地存在一样访问它。

0ejtzxu1

0ejtzxu13#

您可以将此文件添加到分布式缓存,如下所示:

...
String s3FilePath = args[0];
DistributedCache.addCacheFile(new URI(s3FilePath), conf);
...

稍后,在mapper/reducer的configure()中,可以执行以下操作:

...
Path s3FilePath;
@Override
public void configure(JobConf job) {
s3FilePath = DistributedCache.getLocalCacheFiles(job)[0];
FileInputStream fstream = new FileInputStream(s3FilePath.toString());
...
}

相关问题