现在我有一个4阶段MapReduce作业如下:
Input-> Map1 -> Reduce1 -> Reducer2 -> Reduce3 -> Reduce4 -> Output
Run Code Online (Sandbox Code Playgroud)
我注意到ChainMapperHadoop 中有一个类可以将几个映射器链接到一个大映射器,并在映射阶段之间保存磁盘I/O成本.还有一个ChainReducer类,但它不是一个真正的"减速器".它只能支持以下工作:
[Map+/ Reduce Map*]
Run Code Online (Sandbox Code Playgroud)
我知道我可以为我的任务设置四个MR作业,并使用默认的映射器来完成最后三个作业.但是这将耗费大量磁盘I/O,因为reducers应该将结果写入磁盘,让以下映射器访问它.是否还有其他Hadoop内置功能可以将我的Reducer连接起来以降低I/O成本?
我正在使用Hadoop 1.0.4.
我在Lucene的Similarity类public float idf(Term term, Searcher searcher)方法javadoc 上找到了这个:
请注意,使用Searcher.maxDoc()代替IndexReader#numDocs(),因为还使用了Searcher.docFreq(Term),当后者不准确时,Searcher.maxDoc()也是如此,并且方向相同.此外,Searcher.maxDoc()的计算效率更高.
这对我来说没有多大意义.这是否与IndexReader中的文档删除有关?
我在伪分布式模式下使用Hadoop 1.0.3.我的conf/core-site.xml设置如下:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>mapred.child.tmp</name>
<value>/home/administrator/hadoop/temp</value>
</property>
</configuration>
Run Code Online (Sandbox Code Playgroud)
所以我相信我的默认文件系统设置为HDFS.但是,当我运行以下代码时:
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Run Code Online (Sandbox Code Playgroud)
我认为fs应该是一个DistributedFileSystem实例.但事实证明是LocalFileSystem实例.
但是,如果我运行以下代码:
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://localhost:9000");
FileSystem fs = FileSystem.get(conf);
Run Code Online (Sandbox Code Playgroud)
然后我可以得到一个DistributedFileSystemfs.
我的默认文件系统是不是在core-site.xml中设置为HDFS?如果没有,我应该如何设置?
我对lucene得分策略感到有些困惑.我知道Lucene的评分公式如下:
score(q,d) = coord(q,d) x queryNorm(q) X SUM <t_in_q> ( tf(t_in_d) x idf(t)^2 x t.getBoost() x norm(t,d))
Run Code Online (Sandbox Code Playgroud)
我理解除了queryNorm(q)之外的这个公式中的每个组件.正如官方文件所解释的那样,
queryNorm(q)是一个归一化因子,用于使查询之间的分数相当.此因素不会影响文档排名(因为所有排名的文档都乘以相同的因子),而只是尝试从不同的查询(甚至不同的索引)进行比较.
为什么我需要比较不同查询之间的分数?换句话说,你能举例说明queryNorm(q)在哪个上下文中有用吗?
要实现Writable接口,可以在Hadoop中序列化对象.那么Hadoop Writable和java.io.serialization?之间的联系和区别是什么?
我使用perl来处理一些文本文件.我想使用perl文件名外卡来查找文件夹中的所有有用文件并逐个解决它们,但我的文件名中有空格.然后我发现文件名通配符无法正确处理这些文件名.这是我的代码:
my $term = "Epley maneuver";
my @files = <rawdata/*$term*.csv>;
my $infiles;
foreach $infilename (@files) {
if($infilename =~ m/(\d+)_.*\.csv/)
{
$infiles{$infilename} = $1;
print $1."\n";
}
}
Run Code Online (Sandbox Code Playgroud)
文件名如下:
34_Epley maneuver_2012_4_6.csv
33_Epley maneuver_2012_1_3.csv
32_Epley maneuver_2011_10_12.csv
...
Run Code Online (Sandbox Code Playgroud)
它们位于名为"rawdata"的文件夹中.
当我将这个用于不包含空格的术语时,比如"头晕",它运作良好.但是,当该术语包含空格时,它就会停止工作.我在Google上搜索了这个,但找不到有用的信息.
会发生什么,我该如何正确地做到这一点?任何帮助都会很好.非常感谢.
我有一个String数组,现在我想将它传递给JSNI函数.我尝试JsArrayString在GWT中使用,但是我发现它无法直接初始化,因为它没有可见的构造函数.那么如何将我的String数组传递给JSNI函数并在我的javascript代码中使用它?代码如下所示:
public void callJSNI() {
String[] stringArray = xxx;
//How should I convert the array into a JSNI-readable format here?
}
private native void JSNIMethod(JsArrayString array) /*-{
//some code to use the array in javascript
}-*/
Run Code Online (Sandbox Code Playgroud) 我正在尝试修改java代码以将某些内容写入txt文件.原始代码是:
try {
out = new PrintStream(system.out, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我使用FileOutputStream来执行此操作,并将代码修改为:
try {
FileOutputStream os = new FileOutputStream("wiki.txt", true);
out = new PrintStream(os, true, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,错误是:
Wikipedia2Txt.java:56: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
FileOutputStream os = new FileOutputStream("wiki.txt");
^
1 error
Run Code Online (Sandbox Code Playgroud)
我尝试了两种方法:1,我在磁盘上手动创建一个wiki.txt文件; 2,运行代码之前不存在wiki.txt.但要么不起作用.它在编译时就停止了.
那么发生了什么?谢谢.
我d3.js用来创建数据访问工具.我在d3文档中读到可以使用selection.on(type[, listener[, capture]])API 注册事件监听器.正如这里记录的那样:
https://github.com/mbostock/d3/wiki/Selections#wiki-on
但是,我找不到d3支持的事件类型列表.现在我知道有'click'事件,'mouseover'事件和'mouseout'事件.还有什么支持?
非常感谢.
现在我有几个Lucene索引集(我称之为分片),它索引不同的文档集.它们是独立的,这意味着我可以在不阅读其他内容的情况下对每个进行搜索.然后我收到一个查询请求.我想在每个索引集上搜索它并将结果组合起来形成最终的顶级文档.
我知道,在对文档进行评分时,Lucene需要知道每个术语的< idf >,不同的索引集将为同一个术语提供不同的< idf >(因为不同的索引集包含不同的文档集).据我所知,我无法直接比较不同索引集的文档得分.那么我应该如何生成最终结果呢?
一个明显的解决方案是首先合并索引,然后对大索引执行搜索.然而,这对我来说太耗费时间,因此是不可接受的.谁有其他更好的解决方案?
PS:除了Lucene和Hadoop之外,我不想使用任何软件包或软件(如Katta).