![](/img/trans.png)
[英]How to read multiple image files as input from hdfs in map-reduce?
[英]How to pass multiple input format files to map-reduce job?
我在写map-reduce程序来查询cassandra column-family。 我只需要从一个列族中读取行的子集(使用行键)。 我有要阅读的行的行键集。 如何将“行键集”传递给地图归约作业,以便它只能输出cassandra columnfamily中的那些行子集?
抽象:
enter code here
class GetRows()
{
public set<String> getRowKeys()
{
logic.....
return set<string>;
}
}
class MapReduceCassandra()
{
inputformat---columnFamilyInputFormat
.
;
also need input key-set .. How to get it?
}
谁能建议从Java应用程序调用mapreduce的最佳方法,以及如何将一组键传递给mapreduce?
从Java调用map reduce
为此,可以从Java应用程序中使用org.apache.hadoop.mapreduce
命名空间中的类(可以使用非常相似的方法使用较旧的mapred
,只需检查API文档):
Job job = Job.getInstance(new Configuration());
// configure job: set input and output types and directories, etc.
job.setJarByClass(MapReduceCassandra.class);
job.submit();
将数据传递给mapreduce作业
如果您的行键集非常小,则可以将其序列化为字符串,并将其作为配置参数传递:
job.getConfiguration().set("CassandraRows", getRowsKeysSerialized()); // TODO: implement serializer
//...
job.submit();
在作业旁边,您将可以通过上下文对象访问参数:
public void map(
IntWritable key, // your key type
Text value, // your value type
Context context
)
{
// ...
String rowsSerialized = context.getConfiguration().get("CassandraRows");
String[] rows = deserializeRows(rowsSerialized); // TODO: implement deserializer
//...
}
但是,如果您的集合可能不受限制,那么将其作为参数传递将是一个坏主意。 相反,您应该在文件中传递密钥,并利用分布式缓存。 然后,您可以在提交作业之前将此行添加到上面的部分:
job.addCacheFile(new Path(pathToCassandraKeySetFile).toUri());
//...
job.submit();
在作业内部,您将可以通过上下文对象访问此文件:
public void map(
IntWritable key, // your key type
Text value, // your value type
Context context
)
{
// ...
URI[] cacheFiles = context.getCacheFiles();
// find, open and read your file here
// ...
}
注意 :所有这些都是针对新API( org.apache.hadoop.mapreduce
)的。 如果您使用的是org.apache.hadoop.mapred
该方法非常相似,但是在不同的对象上会调用一些相关的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.