Lucene初级教程

Lucene初级教程
Lucene初级教程

Lucene初级教程

2007-12-26 15:24 点击次数:0 次

1 lucene简介

1.1 什么是lucene

Lucene是一个全文搜索框架,而不是应用产品。因此它并不像https://www.360docs.net/doc/5013408910.html,或者google Desktop 那么拿来就能用,它只是提供了一种工具让你能实现这些产品。

2 lucene的工作方式

lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。

2.1写入流程

源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。

将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field 存储起来。

将索引写入存储器,存储器可以是内存或磁盘。

2.2读出流程

用户提供搜索关键词,经过analyzer处理。

对处理后的关键词搜索索引找出对应的Document。

用户根据需要从找到的Document中提取需要的Field。

3 一些需要知道的概念

3.1 analyzer

Analyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。

分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。

3.2 document

用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。

3.3 field

一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。

Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

3.4 term

term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。

3.5 tocken

tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。

3.6 segment

添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment。

4 如何建索引

4.1 最简单的能完成索引的代码片断

IndexWriter writer = new IndexWriter(“/data/index/”, new StandardAnalyzer(), true); Document doc = new Document();

doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED)); doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED)); writer.addDocument(doc);

writer.optimize();

writer.close();

下面我们分析一下这段代码。

首先我们创建了一个writer,并指定存放索引的目录为“/data/index”,使用的分析器为StandardAnal yzer,第三个参数说明如果已经有索引文件在索引目录下,我们将覆盖它们。然后我们新建一个document。

我们向document添加一个field,名字是“title”,内容是“lucene introduction”,对它进行存储并索引。再添加一个名字是“content”的field,内容是“lucene works well”,也是存储并索引。然后我们将这个文档添加到索引中,如果有多个文档,可以重复上面的操作,创建document并添加。

添加完所有document,我们对索引进行优化,优化主要是将多个segment合并到一个,有利于提高索引速度。

随后将writer关闭,这点很重要。

对,创建索引就这么简单!

当然你可能修改上面的代码获得更具个性化的服务。

4.2 索引文本文件

如果你想把纯文本文件索引起来,而不想自己将它们读入字符串创建field,你可以用下面的代码创建field:

Field field = new Field("content", new FileReader(file));

这里的file就是该文本文件。该构造函数实际上是读去文件内容,并对其进行索引,但不存储。

Lucene 2 教程

Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大,api也很简单。总得来说用Lucene来进行建立和搜索和操作数据库是差不多的(有点像),Document可以看作是数据库的一行记录,Field可以

看作是数据库的字段。用lucene实现搜索引擎就像用JDBC实现连接数据库一样简单。

Lucene2.0,它与以前广泛应用和介绍的Lucene 1.4.3并不兼容。Lucene2.0的下载地址是https://www.360docs.net/doc/5013408910.html,/lucene/java/

例子一:

1、在windows系统下的的C盘,建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件,随便起名啦,就叫"1.txt","2.txt"和"3.txt"啦

其中1.txt的内容如下:

中华人民共和国

全国人民

2006年

而"2.txt"和"3.txt"的内容也可以随便写几写,这里懒写,就复制一个和1.txt 文件的内容一样吧

2、下载lucene包,放在classpath路径中

建立索引:

package https://www.360docs.net/doc/5013408910.html,;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Date;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

/**

* author lighter date 2006-8-7

*/

public class TextFileIndexer {

public static void main(String[] args) throws Exception {

/*指明要索引文件夹的位置,这里是C盘的S文件夹下*/

File fileDir = new File( " c:\\s " );

/*这里放索引文件的位置*/

File indexDir = new File( " c:\\index " );

Analyzer luceneAnalyzer = new StandardAnalyzer();

IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyze r,

true);

File[] textFiles = fileDir.listFiles();

long startTime = new Date().getTime();

//增加document到索引去

for ( int i = 0 ; i < textFiles.length; i ++ ) {

if (textFiles[i].isFile()

&& textFiles[i].getName().endsWith( " .txt " )) {

System.out.println( " File " + textFiles[i].getCanonicalPath()

+ " 正在被索引. " );

String temp = FileReaderAll(textFiles[i].getCanonicalPath(),

" GBK " );

System.out.println(temp);

Document document = new Document();

Field FieldPath = new Field( " path " , textFiles[i].getPath(),

Field.Store.YES, Field.Index.NO);

Field FieldBody = new Field( " body " , temp, Field.Store.YES,

Field.Index.TOKENIZED,

Field.TermVector.WITH_POSITIONS_OFFSETS);

document.add(FieldPath);

document.add(FieldBody);

indexWriter.addDocument(document);

}

}

//optimize()方法是对索引进行优化

indexWriter.optimize();

indexWriter.close();

//测试一下索引的时间

long endTime = new Date().getTime();

System.out

.println( " 这花费了"

+ (endTime - startTime)

+ " 毫秒来把文档增加到索引里面去! "

+ fileDir.getPath());

}

public static String FileReaderAll(String FileName, String charset)

throws IOException {

BufferedReader reader = new BufferedReader( new InputStreamRead er(

new FileInputStream(FileName), charset));

String line = new String();

String temp = new String();

while ((line = reader.readLine()) != null) {

temp += line;

}

reader.close();

return temp;

}

}

索引的结果:

File C:\s\ 1 .txt正在被索引.

中华人民共和国全国人民2006年

File C:\s\ 2 .txt正在被索引.

中华人民共和国全国人民2006年

File C:\s\ 3 .txt正在被索引.

中华人民共和国全国人民2006年

这花费了297 毫秒来把文档增加到索引里面去! c:\s

3、建立了索引之后,查询啦....

package https://www.360docs.net/doc/5013408910.html,;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.queryParser.ParseException;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

public class TestQuery {

public static void main(String[] args) throws IOException, ParseExc eption {

Hits hits = null;

String queryString = " 中华" ;

Query query = null;

IndexSearcher searcher = new IndexSearcher( " c:\\index " );

Analyzer analyzer = new StandardAnalyzer();

try{

QueryParser qp = new QueryParser( " body " , analyzer);

query = qp.parse(queryString);

} catch (ParseException e) {

}

if (searcher != null) {

hits = searcher.search(query);

if (hits.length() > 0 ) {

System.out.println( " 找到: " + hits.length() + " 个结果! " );

}

}

}

}

其运行结果:

找到: 3 个结果!

Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索

来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西,叫搜索。

IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory 和RAMDirectory两个类。

Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

Field:字段。

IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;

Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。

QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。

Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。上面作了一大堆名词解释,下面就看几个简单的实例吧:

1、简单的的StandardAnalyzer测试例子

package https://www.360docs.net/doc/5013408910.html,;

import java.io.IOException;

import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.Token;

import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

public class StandardAnalyzerTest

{

//构造函数,

public StandardAnalyzerTest()

{

}

public static void main(String[] args)

{

//生成一个StandardAnalyzer对象

Analyzer aAnalyzer = new StandardAnalyzer();

//测试字符串

StringReader sr = new StringReader( " lighter javaeye com is the ar e on " );

//生成TokenStream对象

TokenStream ts = aAnalyzer.tokenStream( " name " , sr);

try{

int i = 0 ;

Token t = ts.next();

while(t != null)

{

//辅助输出时显示行号

i ++ ;

//输出处理后的字符

System.out.println( " 第" + i + " 行: " + t.termText());

//取得下一个字符

t = ts.next();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

显示结果:

第1行:lighter

第2行:javaeye

第3行:com

提示一下:

StandardAnalyzer是lucene中内置的"标准分析器",可以做如下功能:

1、对原有句子按照空格进行了分词

2、所有的大写字母都可以能转换为小写的字母

3、可以去掉一些没有用处的单词,例如"is","the","are"等单词,也删除了所有的标点

查看一下结果与"new StringReader("lighter javaeye com is the are on")"作一个比较就清楚明了。

这里不对其API进行解释了,具体见lucene的官方文档。需要注意一点,这里的代码使用的是lucene2的API,与1.43版有一些明显的差别。

2、看另一个实例,简单地建立索引,进行搜索

package https://www.360docs.net/doc/5013408910.html,;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.store.FSDirectory;

public class FSDirectoryTest {

//建立索引的路径

public static final String path = " c:\\index2 " ;

public static void main(String[] args) throws Exception {

Document doc1 = new Document();

doc1.add( new Field( " name " , " lighter javaeye com " ,Field.Store.Y ES,Field.Index.TOKENIZED));

Document doc2 = new Document();

doc2.add( new Field( " name " , " lighter blog " ,Field.Store.YES,Field.I ndex.TOKENIZED));

IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);

writer.setMaxFieldLength( 3 );

writer.addDocument(doc1);

writer.setMaxFieldLength( 3 );

writer.addDocument(doc2);

writer.close();

IndexSearcher searcher = new IndexSearcher(path);

Hits hits = null;

Query query = null;

QueryParser qp = new QueryParser( " name " , new StandardAnalyz er());

query = qp.parse( " lighter " );

hits = searcher.search(query);

System.out.println( " 查找\ " lighter\ " 共" + hits.length() + " 个结果" );

query = qp.parse( " javaeye " );

hits = searcher.search(query);

System.out.println( " 查找\ " javaeye\ " 共" + hits.length() + " 个结果" );

}

}

运行结果:

查找" lighter " 共2个结果

查找" javaeye " 共1个结果

到现在我们已经可以用lucene建立索引了

下面介绍一下几个功能来完善一下:

1.索引格式

其实索引目录有两种格式,

一种是除配置文件外,每一个Document独立成为一个文件(这种搜索起来会

影响速度)。

另一种是全部的Document成一个文件,这样属于复合模式就快了。

2.索引文件可放的位置:

索引可以存放在两个地方1.硬盘,2.内存

放在硬盘上可以用FSDirectory(),放在内存的用RAMDirectory()不过一关机就没了

FSDirectory.getDirectory(File file, boolean create)

FSDirectory.getDirectory(String path, boolean create)

两个工厂方法返回目录

New RAMDirectory()就直接可以

再和

IndexWriter(Directory d, Analyzer a, boolean create)

一配合就行了

如:

IndexWrtier indexWriter = new IndexWriter(FSDirectory.getDirectory(“c:\\in dex”,true), new StandardAnlyazer(), true);

IndexWrtier indexWriter = new IndexWriter( new RAMDirectory(), new St andardAnlyazer(), true);

3.索引的合并

这个可用

IndexWriter.addIndexes(Directory[] dirs)

将目录加进去

来看个例子:

public void UniteIndex() throws IOException

{

IndexWriter writerDisk = new IndexWriter(FSDirectory.getDirectory( " c:\\indexDisk " , true), new StandardAnalyzer(), true);

Document docDisk = new Document();

docDisk.add( new Field( " name " , " 程序员之家" ,Field.Store.YES,Field.

Index.TOKENIZED));

writerDisk.addDocument(docDisk);

RAMDirectory ramDir = new RAMDirectory();

IndexWriter writerRam = new IndexWriter(ramDir, new StandardAnal yzer(), true);

Document docRam = new Document();

docRam.add( new Field( " name " , " 程序员杂志" ,Field.Store.YES,Field. Index.TOKENIZED));

writerRam.addDocument(docRam);

writerRam.close(); //这个方法非常重要,是必须调用的

writerDisk.addIndexes( new Directory[] {ramDir} );

writerDisk.close();

}

public void UniteSearch() throws ParseException, IOException

{

QueryParser queryParser = new QueryParser( " name " , new Stand ardAnalyzer());

Query query = queryParser.parse( " 程序员" );

IndexSearcher indexSearcher = new IndexSearcher( " c:\\indexDisk " );

Hits hits = indexSearcher.search(query);

System.out.println( " 找到了" + hits.length() + " 结果" );

for( int i = 0 ;i

{

Document doc = hits.doc(i);

System.out.println(doc.get( " name " ));

}

}

这个例子是将内存中的索引合并到硬盘上来.

注意:合并的时候一定要将被合并的那一方的IndexWriter的close()方法调用。

4.对索引的其它操作:

IndexReader类是用来操作索引的,它有对Document,Field的删除等操作。

下面一部分的内容是:全文的搜索

全文的搜索主要是用:IndexSearcher,Query,Hits,Document(都是Query 的子类),有的时候用QueryParser

主要步骤:

1 . new QueryParser(Field字段,new分析器)

2 .Query query = QueryParser.parser(“要查询的字串”);这个地方我们可以用反射ap i看一下query究竟是什么类型

3 . new IndexSearcher(索引目录).search(query);返回Hits

4 .用Hits.doc(n);可以遍历出Document

5 .用Document可得到Field的具体信息了。

其实1,2两步就是为了弄出个Query 实例,究竟是什么类型的看分析器了。

拿以前的例子来说吧

QueryParser queryParser = new QueryParser( " name " , new StandardAn alyzer());

Query query = queryParser.parse( " 程序员" );

/*这里返回的就是org.apache.lucene.search.PhraseQuery*/

IndexSearcher indexSearcher = new IndexSearcher( " c:\\indexDisk " );

Hits hits = indexSearcher.search(query);

不管是什么类型,无非返回的就是Query的子类,我们完全可以不用这两步直接new个Query的子类的实例就ok了,不过一般还是用这两步因为它返回的是PhraseQuery这个是非常强大的query子类它可以进行多字搜索用QueryParser可以设置各个关键字之间的关系这个是最常用的了。IndexSearcher:

其实IndexSearcher它内部自带了一个IndexReader用来读取索引的,IndexSearcher有个close()方法,这个方法不是用来关闭IndexSearche的是用来关闭自带的IndexReader。

QueryParser呢可以用parser.setOperator()来设置各个关键字之间的关系(与还是或)它可以自动通过空格从字串里面将关键字分离出来。

注意:用QueryParser搜索的时候分析器一定的和建立索引时候用的分析器是一样的。

Query:

可以看一个lucene2.0的帮助文档有很多的子类:

BooleanQuery, ConstantScoreQuery, ConstantScoreRangeQuery,

DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, PrefixQuery, RangeQuery, SpanQuery, TermQuery

各自有用法看一下文档就能知道它们的用法了

下面一部分讲一下lucene的分析器:

分析器是由分词器和过滤器组成的,拿英文来说吧分词器就是通过空格把单词分开,过滤器就是把the,to,of等词去掉不被搜索和索引。

我们最常用的是StandardAnalyzer()它是lucene的标准分析器它集成了内部的许多的分析器。

最后一部分了:lucene的高级搜索了

1.排序

Lucene有内置的排序用IndexSearcher.search(query,sort)但是功能并不理想。我们需要自己实现自定义的排序。

这样的话得实现两个接口: ScoreDocComparator, SortComparatorSource 用IndexSearcher.search(query,new Sort(new SortField(String Field,SortComparatorSource)));

就看个例子吧:

这是一个建立索引的例子:

public void IndexSort() throws IOException

{

IndexWriter writer = new IndexWriter( " C:\\indexStore " , new Sta ndardAnalyzer(), true);

Document doc = new Document()

doc.add( new Field( " sort " , " 1 " ,Field.Store.YES,Field.Index.TOKENI ZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 4 " ,Field.Store.YES,Field.Index.TOKENI ZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 3 " ,Field.Store.YES,Field.Index.TOKENI ZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 5 " ,Field.Store.YES,Field.Index.TOKENI ZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 9 " ,Field.Store.YES,Field.Index.TOKENI ZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 6 " ,Field.Store.YES,Field.Index.TOKENI ZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 7 " ,Field.Store.YES,Field.Index.TOKENI ZED));

writer.addDocument(doc);

writer.close();

}

下面是搜索的例子:

[code]

public void SearchSort1() throws IOException, ParseException

{

IndexSearcher indexSearcher = new

IndexSearcher("C:\\indexStore");

QueryParser queryParser = new QueryParser("sort",new StandardAnalyzer());

Query query = queryParser.parse("4");

Hits hits = indexSearcher.search(query);

System.out.println("有"+hits.length()+"个结果");

Document doc = hits.doc(0);

System.out.println(doc.get("sort"));

}

public void SearchSort2() throws IOException, ParseException

{

IndexSearcher indexSearcher = new

IndexSearcher("C:\\indexStore");

Query query = new RangeQuery(new Term("sort","1"),new Term("sort","9"),true);//这个地方前面没有提到,它是用于范围的Query 可以看一下帮助文档.

Hits hits = indexSearcher.search(query,new Sort(new

SortField("sort",new MySortComparatorSource())));

System.out.println("有"+hits.length()+"个结果");

for(int i=0;i

{

Document doc = hits.doc(i);

System.out.println(doc.get("sort"));

}

}

public class MyScoreDocComparator implements ScoreDocComparator

{

private Integer[]sort;

public MyScoreDocComparator(String s,IndexReader reader, String fieldname) throws IOException

{

sort = new Integer[reader.maxDoc()];

for(int i = 0;i

{

Document doc =reader.document(i);

sort[i]=new Integer(doc.get("sort"));

}

}

public int compare(ScoreDoc i, ScoreDoc j)

{

if(sort[i.doc]>sort[j.doc])

return 1;

if(sort[i.doc]

return -1;

return 0;

}

public int sortType()

{

return SortField.INT;

}

public Comparable sortValue(ScoreDoc i)

{

// TODO 自动生成方法存根

return new Integer(sort[i.doc]);

}

}

public class MySortComparatorSource implements SortComparatorSource

{

private static final long serialVersionUID =

-9189690812107968361L;

public ScoreDocComparator newComparator(IndexReader reader, String fieldname)

throws IOException

{

if(fieldname.equals("sort"))

return new

MyScoreDocComparator("sort",reader,fieldname);

return null;

}

}[/code]

SearchSort1()输出的结果没有排序,SearchSort2()就排序了。

2.多域搜索MultiFieldQueryParser

如果想输入关键字而不想关心是在哪个Field里的就可以用MultiFieldQueryParser了

用它的构造函数即可后面的和一个Field一样。MultiFieldQueryParser. parse(String[] queries, String[] fields, BooleanClause.Occur[] flags, Analyzer

analyzer) ~~~~~~~~~~~~~~~~~ 第三个参数比较特殊这里也是与以前lucene1.4.3不一样的地方

看一个例子就知道了

String[] fields = {"filename", "contents", "description"};

BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.MUST,//在这个Field里必须出现的

BooleanClause.Occur.MUST_NOT};//在这个Field里不能出现

MultiFieldQueryParser.parse("query", fields, flags, analyzer);

1、lucene的索引不能太大,要不然效率会很低。大于1G的时候就必须考虑分布索引的问题

2、不建议用多线程来建索引,产生的互锁问题很麻烦。经常发现索引被lock,无法重新建立的情况

3、中文分词是个大问题,目前免费的分词效果都很差。如果有能力还是自己实现一个分词模块,用最短路径的切分方法,网上有教材和demo源码,可以参考。

4、建增量索引的时候很耗cpu,在访问量大的时候会导致cpu的idle为0

5、默认的评分机制不太合理,需要根据自己的业务定制

整体来说lucene要用好不容易,必须在上述方面扩充他的功能,才能作为一个商用的搜索引擎

Scala从基础到开发实战

Scala从基础到开发实战 对于进化缓慢的Java跟C++语言来说,目前Scala无疑更适应现代化特质的语言,语法简洁,同时兼备函数式编程与面向对象编程,具有令人耳目一新的编程范式。而运行在Java 虚拟机上的编译环境使得其具有很多的现有工具与类库,拥有快速的可靠的解释器和编译器。 本课程是Scala语言基础课程,面向没有或仅有少量编程语言基础的同学,当然,具有一定的Java或C、C++语言基础将有助于本课程的学习。在本课程内,将更注重scala的各种语言规则和应用,通过学习本课程能具备初步的Scala语言实际编程能力。 Scala最近的红火也得益于Spark分布式内存计算平台的兴起,由于其惊人的计算速度,Spark将要革命Hadoop的说法尘嚣日上,但学习Spark的一项瓶颈是其原生语言Scala并不为大众所熟知,即使是资深程序员,从未听说过Scala者大有人在,于是本门课程也可以称为Spark系列的前置课程,供深入学习大数据技术的同仁们进行热身运动。 课程大纲: 第一课:Scala介绍——如何安装Scala REPL、SBT、IDE,编写简单的Scala程序;函数式编程简介 第二课:Scala的class和object,Scala的变量、类的介绍 第三课:Scala的基本数据类型、控制语句 第四课:高阶函数、Currying、尾递归 第五课:数据结构:List、Map、Set 第六课:组合和继承 第七课:Trait 第八课:响应式编程介绍 第九课:Akka框架(一)——akka的基本用法 第十课:Akka框架(二)——actor的监控 第十一课:Akka框架(三)——网络编程 第十二课:Akka框架(四)——akka使用技巧

大数据开发新手学习指南(经典)

上市公司,官网:https://www.360docs.net/doc/5013408910.html, 大数据开发初学者该如何学习 导读: 第一章:初识Hadoop 第二章:更高效的WordCount 第三章:把别处的数据搞到Hadoop上 第四章:把Hadoop上的数据搞到别处去 第五章:快一点吧,我的SQL 第六章:一夫多妻制 第七章:越来越多的分析任务 第八章:我的数据要实时 第九章:我的数据要对外 第十章:牛逼高大上的机器学习 经常有初学者会问,自己想往大数据方向发展,该学哪些技术,学习路线是什么样的,觉得大数据很火,就业很好,薪资很高……首先,如果你确定了想往这个方面发展,先考虑自己的过去从业经历、专业、兴趣是什么。计算机专业——操作系统、硬件、网络、服务器?软件专业——软件开发、编程、写代码?还是数学、统计学专业——对数据和数字特别感兴趣? 其实这就是想告诉你大数据的三个发展方向,平台搭建/优化/运维/监控、大数据开发/设计/架构、数据分析/挖掘。 先扯一下大数据的4V特征: ?数据量大,TB->PB ?数据类型繁多,结构化、非结构化文本、日志、视频、图片、地理位置等;

上市公司,官网:https://www.360docs.net/doc/5013408910.html, ?商业价值高,但是这种价值需要在海量数据之上,通过数据分析与机器学习更快速的挖掘出来; ?处理时效性高,海量数据的处理需求不再局限在离线计算当中。 现如今,正式为了应对大数据的这几个特点,开源的大数据框架越来越多,越来越强,先列举一些常见的: 文件存储:Hadoop HDFS、Tachyon、KFS 离线计算:Hadoop MapReduce、Spark 流式、实时计算:Storm、Spark Streaming、S4、Heron K-V、NOSQL数据库:HBase、Redis、MongoDB 资源管理:YARN、Mesos 日志收集:Flume、Scribe、Logstash、Kibana 消息系统:Kafka、StormMQ、ZeroMQ、RabbitMQ 查询分析:Hive、Impala、Pig、Presto、Phoenix、SparkSQL、Drill、Flink、Kylin、Druid 分布式协调服务:Zookeeper 集群管理与监控:Ambari、Ganglia、Nagios、Cloudera Manager 数据挖掘、机器学习:Mahout、Spark MLLib 数据同步:Sqoop 任务调度:Oozie 1.1 学会百度与Google

用Apache Spark进行大数据处理——第一部分:入门介绍

用Apache Spark进行大数据处理——第一部分:入门介绍 什么是Spark Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。与Hadoop和Storm等其他大数据和MapReduce技术相比,Spark有如下优势。 首先,Spark为我们提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。 Spark可以将Hadoop集群中的应用在内存中的运行速度提升100倍,甚至能够将应用在磁盘上的运行速度提升10倍。 Spark让开发者可以快速的用Java、Scala或Python编写程序。它本身自带了一个超过80个高阶操作符集合。而且还可以用它在shell中以交互式地查询数据。 除了Map和Reduce操作之外,它还支持SQL查询,流数据,机器学习和图表数据处理。开发者可以在一个数据管道用例中单独使用某一能力或者将这些能力结合在一起使用。 在这个Apache Spark文章系列的第一部分中,我们将了解到什么是Spark,它与典型的MapReduce解决方案的比较以及它如何为大数据处理提供了一套完整的工具。 Hadoop和Spark Hadoop这项大数据处理技术大概已有十年历史,而且被看做是首选的大数据集合处理的解决方案。MapReduce是一路计算的优秀解决方案,不过对于需要多路计算和算法的用例来说,并非十分高效。数据处理流程中的每一步都需要一个Map阶段和一个Reduce阶段,而且如果要利用这一解决方案,需要将所有用例都转换成MapReduce模式。 在下一步开始之前,上一步的作业输出数据必须要存储到分布式文件系统中。因此,复制和磁盘存储会导致这种方式速度变慢。另外Hadoop解决方案中通常会包含难以安装和管理的集群。而且为了处理不同的大数据用例,还需要集成多种不同的工具(如用于机器学习的Mahout和流数据处理的Storm)。 如果想要完成比较复杂的工作,就必须将一系列的MapReduce作业串联起来然后顺序执行这些作业。每一个作业都是高时延的,而且只有在前一个作业完成之后下一个作业才能开始启动。 而Spark则允许程序开发者使用有向无环图(DAG)开发复杂的多步数据管道。而且还支持跨有向无环图的内存数据共享,以便不同的作业可以共同处理同一个数据。

利用Scala语言开发Spark应用程序

利用Scala语言开发Spark应用程序 park内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情。如果你对Scala语言还不太熟悉,可以阅读网络教程A Scala Tutorial for Java Programmers或者相关Scala书籍进行学习。 AD: Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情。如果你对Scala语言还不太熟悉,可以阅读网络教程A Scala Tutorial for Java Programmers或者相关Scala书籍进行学习。 本文将介绍3个Scala Spark编程实例,分别是WordCount、TopK和SparkJoin,分别代表了Spark 的三种典型应用。 1. WordCount编程实例 WordCount是一个最简单的分布式应用实例,主要功能是统计输入目录中所有单词出现的总次数,编写步骤如下: 步骤1:创建一个SparkContext对象,该对象有四个参数:Spark master位置、应用程序名称,Spark安装目录和jar存放位置,对于Spark On Y ARN而言,最重要的是前两个参数,第一个参数指定为yarn-standalone ,第二个参数是自定义的字符串,举例如下: valsc=newSparkContext(args(0), WordCount ,System.getenv( SPARK_HOME ),Seq(System.getenv( SPARK_TEST_JAR ))) 步骤2:读取输入数据。我们要从HDFS上读取文本数据,可以使用SparkCon valtextFile=sc.textFile(args(1)) 当然,Spark允许你采用任何Hadoop InputFormat,比如二进制输入格式SequenceFileInputFormat,此时你可以使用SparkContext中的hadoopRDD函数,举例如下: valinputFormatClass=classOf[SequenceFileInputFormat[Text,Text]]varhadoopRdd=sc.hadoopRDD(c onf,inputFormatClass,classOf[Text],classOf[Text]) 或者直接创建一个HadoopRDD对象: varhadoopRdd=newHadoopRDD(sc,conf,classOf[SequenceFileInputFormat[Text,Text,classOf[Text],c lassOf[Text]) 步骤3:通过RDD转换算子操作和转换RDD,对于WordCount而言,首先需要从输入数据中每行字符串中解析出单词,水草玛瑙 https://www.360docs.net/doc/5013408910.html,然后将相同单词放到一个桶中,最后统计每个桶中每个单词出现的频率,举例如下: valresult=hadoopRdd.flatMap{case(key,value)= value.toString().split( \\s+ }.map(word= (word,1)).reduceByKey(_+_) 其中,flatMap函数可以将一条记录转换成多条记录(一对多关系),map函数将一条记录转换为另一条记录(一对一关系),高山茶 https://www.360docs.net/doc/5013408910.html, reduceByKey函数将key相同的数据划分到一个桶中,并以key为单位分组进行计算,这些函数的具体含义可参考:Spark Transformation。步骤4:将产生的RDD数据集保存到HDFS上。可以使用SparkContext中的saveAsTextFile哈数将数据集保存到HDFS目录下,默认采用Hadoop提供的TextOutputFormat,每条记录以(key,value)的形式打印输出,你也可以采用saveAsSequenceFile函数将数据保存为SequenceFile格式等,举例如下: result.saveAsSequenceFile(args(2)) 当然,一般我们写Spark程序时,需要包含以下两个头文件: importorg.apache.spark._importSparkContext._ WordCount完整程序已在Apache Spark学习:利用Eclipse构建Spark集成开发环境一文中进行了介绍,在次不赘述。 需要注意的是,指定输入输出文件时,需要指定hdfs的URI,比如输入目录是hdfs:hadoop-testtmpinput,输出目录是hdfs:hadoop-testtmpoutput,其中,hdfs:hadoop-test 是由Hadoop配置文件core- site.xml中参数https://www.360docs.net/doc/5013408910.html,指定的,具体替换成你的配置即可。 2. TopK编程实例

51CTO学院-Scala深入浅出实战初级入门经典视频课程

51cto学院-Scala深入浅出实战初级入门经典视频课程 课程目标 为进一步推动大数据技术的发展和应用,在王家林的带领下联合大数据狂热爱好者和一线实践专家构建了“DT大数据梦工厂”公益团队,旨在免 费分享大数据最佳实践技术,帮助您和公司在大数据时代重铸强大IT大 脑,笑傲互联网+时代!在这里,先从Scala语言的编程开发实战学起。。。适用人群 Scala语言爱好者,Spark技术爱好者,大数据技术学习者 课程简介 《Scala深入浅出实战初级入门经典视频课程》 从Scala的开发环境的搭建起步,基于纯粹动手实战的原则,循序渐进的覆盖Scal a基础、Scala面向对象编程、Scala函数式编程、集合的操作深度实战、Scala测 试等实用实战内容,是《Scala深入浅出实战中级---进阶经典》和《Scala深入浅 出实战高级---高手之巅》的前置课程。纯粹的实战精华课程打造能够进行Scala编程实战的您! 从零开始,跟随着王家林老师每天早晨4点左右发布的一个绝对精华的约15分钟的大数据免费视频学习大数据方面的技术,先从Scala语言的编程开发实战学起。。。 Scala是一门以JVM为目标运行环境并将面向对象和函数式编程语言的最佳特性结合在一起的编程语言,此课程是大数据框架Spark的前置课程: 1、Spark框架是采用Scala语言编写的,精致而优雅。要想成为Spark高手,你 就必须阅读Spark的源代码,就必须掌握Scala;

2、虽然说现在的Spark可以采用多语言Java、Python等进行应用程序开发,但 是最快速的和支持最好的开发API依然并将永远是Scala方式的API,所以你必须掌握Scala来编写复杂的和高性能的Spark分布式程序; 3、本课程采用循序渐进的实战方式,深入浅出的讲解Scala所有核心内容和高级实 战技巧 课程 1 第1讲:Scala开发环境搭建和HelloWorld解析 24分钟 本视频介绍了Scala语言的特性,Java的安装,详细介绍了Scala的下载、Scala的环境变量配置,ScalaIDE工具的安装。在Scala的环境安装完成后又动手演示了一个在ScalaIDE中建立Sc ala工程的例子,并演示运行结果。 2 第2讲:Scala函数定义、流程控制、异常处理入门实战 24分钟 本视频以具体的例子代码详细介绍了1)Scala中函数的定义格式,以main函数为例介绍了ma in函数中的参数意义和返回值,同时还介绍了无参数函数的调用方式和有参数函数的调用方式。 2)介绍了Scala中流程控制do-while循环、for循环的使用方式。3)Scala中的异常处理try-catch-finally的使用流程。 3 第3讲:Tuple、Array、Map与文件操作入门实战 15分钟 本视频以具体的例子代码详细介绍了1)Scala中的元组的定义、元组的元素访问方式。2)Scal a中数组的定义、数组的遍历方式。3)Scala中Map集合的定义和访问方式。4)Scala中网络文件和本地文件的访问方式。 4

给大数据开发初学者的一些建议

IT=挨踢,这是IT人的自嘲,进入IT行业是有四五年了,也算得上是一个“老人”了吧,见了不少新人,面试了不少新人,也带了一些新人,多多少少还是有点发言权的。 新人们常常会说我看了多少多少的书,看过某某人写的书,仿佛书看了就会做了。其实不然,很多新人在面试的时候夸夸其谈,说啥啥都知道一点,到真正做的时候,啥都不会。归根到底是没有经验,技术这玩意儿经验非常重要,很多东西如果不是你碰到了,你从书上一辈子都找不到答案。 一般都是先把整个书翻一下,了解一下书的基本内容,然后在实际项目中遇到相应的问题再去翻书,当然这是因为我对技术已经有一定的了解,不需要通读整本书。初学者应该找一些适合自己的书,通读一遍,其中的例子要认真做,一定要自己去写代码,而不是Copy。我以前在学做网页的时候,别人都用Dreamweaver去做,只有我打开源代码编辑器学习HTML源代码的编写。 做完书的例子只能说明你会削木头了,但会削木头离会做柜子还有很远的路要走。还记得达·芬奇画鸡蛋的故事么?不停地重复肯定是枯燥的,所以你需要自己尝试去做一些实际的东西,比如做一个个人主页、一个留言本、一个通信地址本......在这些实际的东西中去实现你的创意,去实现你在书本上所学习的例子,并且将这些例子加入你的思想。 永远不要认为书本能给你带来多少东西,虽然它们很有用,但它们只是一个Key,一个引你入门的Key。 四川是旅游的天堂,无法拒绝她火辣辣的美食,无法拒绝她惊艳的自然风光,更无法拒绝她的古蜀文化。随着社会物质文明和精神文明的不断提高,越来越多的人在社会的残酷竞争中优胜劣汰!在追求男女平等的同时,男生和女生却面临同样的竞争,这就是社会生存潜

Spark 实战第 1 部分使用Scala 语言开发Spark 应用程序

Spark 实战,第1 部分: 使用Scala 语言开发Spark 应用程序 本文旨在通过具有实际意义的案例向读者介绍如何使用Scala 语言开发Spark 应用程序并在Spark 集群上运行。本文涉及的所有源数据都将从HDFS(Hadoop Distributed File System)读取,部分案例的输出结果也会写入到HDFS, 所以通过阅读本文,读者也会学习到Spark 和HDFS 交互的一些知识。 查看本系列更多内容|3评论: 王龙, 软件开发工程师, IBM 内容

关于Spark Spark 由加州大学伯克利分校AMP 实验室(Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的大数据处理的应用程序。并且提供了用于机器学习(MLlib), 流计算(Streaming), 图计算(GraphX) 等子模块,最新的1.4.0 版本更是提供了与R 语言的集成,这使得Spark 几乎成为了多领域通吃的全能技术。Spark 对数据的存储,转换,以及计算都是基于一个叫RDD(Resilient Distributed Dataset) 分布式内存的抽象,应用程序对需要计算的数据的操作都是通过对RDD 的一系列转化(Transformation) 和动作(Action) 算子完成的,其中转化算子可以把一个RDD 转成另一个RDD,如filter 算子可以通过添加过滤条件生成一个只包含符合条件的数据的新的RDD。动作算子负责完成最终的计算,如count 算子可以计算出整个RDD 表示的数据集中元素的个数。关于Spark 所支持的算子以及使用方法请参考Spark 官方网站。本文所使用的Spark 的发行版是1.3.1,读者可根据需要下载相应的版本。 回页首关于Scala Scala 语言是一门类Java 的多范式语言,其设计初衷就是为了继承函数式编程的面向对象编程的各种特性,正如Scala 语言官网描述的那样:Object-Oriented Meets Functional, 就是给出了一个关于Scala 语言特性的最简单明了的概括。 Spark 框架使用Scala 语言开发,那么使用Scala 语言开发Spark 应用程序就变成一件很自然的事情,虽然Spark 提供了面向Python,Java 等语言的编程接口,但是从各个方面来看使用Scala 编程都是最简单最容易理解的,特别是当程序出现异常或者是需要通过学习源码来定位问题时,您会发现学习Scala 语言来编写Spark 应用程序是多么有意义的事情。关于Scala 语言,如果您还没有基础,请参考 ?Scala 语言官网 ?Scala 中文网 ?Twitter 提供的Scala 课堂 ?面向Java 开发人员的Scala 指南系列 由于Spark 1.3.1 版本使用的是Scala 2.10.x 版本,所以本文将使用Scala 2.10.5 版本。 回页首搭建开发环境 1. 安装Scala IDE

零基础学习hadoop(编程篇)

1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如何编译hadoop源码? 阅读此篇文章,需要些基础下面两篇文章 零基础学习hadoop到上手工作线路指导(初级篇) 零基础学习hadoop到上手工作线路指导(中级篇) 如果看过的话,看这篇不成问题,此篇讲hadoop编程篇。 hadoop编程,hadoop是一个Java框架,同时也是编程的一次革命,使得传统开发运行程序由单台客户端(单台电脑)转换为可以由多个客户端运行(多台机器)运行,使得任务得以分解,这大大提高了效率。

hadoop既然是一个Java框架,因为我们必须要懂Java,网上有大量的资料,所以学习Java 不是件难事。但是学到什么程度,可能是我们零基础同学所关心的。 语言很多情况下都是相通的,如果你是学生,还处于打基础的阶段,那么难度对于你来说还是不小的。 1.初学者要求必须有理论基础,并且能够完成一个小项目,最起码能够完成几个小例子,例如图书馆里等。 初学者基本的要求: (1)懂什么是对象、接口、继续、多态 (2)必须熟悉Java语法 (3)掌握一定的常用包 (4)会使用maven下载代码 (5)会使用eclipse,包括里面的快捷键,如何打开项目 传统程序员,因为具有丰富的编程经验,因此只要能够掌握开发工具: (1)会使用maven下载代码 (2)会使用eclipse,包括里面的快捷键,如何打开项目 (3)简单熟悉Java语法 上面的只是基础,如果想开发hadoop,还需要懂得下面内容 (1)会编译hadoop (2)会使用hadoop-eclipse-plugin插件,远程连接集群 (3)会运行hadoop程序。 上面列出大概的内容,下面我们具体说一些需要学习的内容。 无论是传统开发人员还是学生,零基础下面都是需要掌握的: 我们就需要进入开发了。开发零基础,该如何,咱们提供了相关的内容分别介绍下面文章 学习hadoop----java零基础学习线路指导视频(1) 这一篇我们使用什么开发工具,甚至考虑使用什么操作系统。然后就是Java基础知识篇,包括变量、函数等。 学习hadoop---Java初级快读入门指导(2) 第一篇是属于思想篇,那么这一篇属于实战篇,通过不同的方式,交给你怎么编写第一个小

大数据Spark企业级实战书籍推荐

Life is short,you need Spark! Spark是当今大数据领域最活跃最热门的高效的大数据通用计算平台。基于RDD,Spark成功地构建起了一体化、多元化的大数据处理体系。 雅虎、Conviva、淘宝、网易、大众点评、优酷土豆、腾讯、华为等公司均在生产环境中部署了大规模的Spark。 《大数据Spark企业级实战》完全从企业处理大数据业务场景的角度出发,完全基于实战代码来组织内容,从零起步,不需任何基础,完全无痛地掌握Spark大数据处理实战技术,源码解析: Spark集群的动手构建 Spark架构 Spark内核的深入解析 Spark四大子框架的细致剖析和实战 Tachyon文件系统揭秘 Spark多语言编程 SparkR Spark性能调优和最佳实践 一站式实现Spark企业级开发实战! 内容简介: Spark是当今大数据领域最活跃、最热门、最高效的大数据通用计算平台,是Apache软件基金会下所有开源项目中三大顶级开源项目之一。 在“One Stack to rule them all”理念的指引下,Spark基于RDD成功地构建起了大数据处理的一体化解决方案,将MapReduce、Streaming、SQL、Machine Learning、Graph Processing等大数据计算模型统一到一个技术堆栈中,开发者使用一致的API操作Spark中的所有功能;更为重要的是Spark的Spark SQL、MLLib、GraphX、Spark Streaming等四大子框架之间可以在内存中完美的无缝集成并可以互相操作彼此的数据,这不仅打造了Spark在当今大数据计算领域其他任何计算框架都无可匹敌的优势,更使得Spark正在加速成为大数据处理中心首选的和唯一的计算平台。 《大数据Spark企业级实战》详细解析了企业级Spark开发所需的几乎所有技术内容,涵盖Spark的架构设计、Spark的集群搭建、Spark内核的解析、Spark SQL、MLLib、GraphX、Spark Streaming、Tachyon、SparkR、Spark多语言编程、Spark常见问题及调优等,并且结合Spark源码细致的解析了Spark内核和四大子框架,最后在附录中提供了的Spark的开发语言Scala快速入门实战内容,学习完此书即可胜任绝大多数的企业级Spark开发需要。 《大数据Spark企业级实战》从零起步,完全从企业处理大数据业务场景的角度出发,基于实战代码来组织内容,对于一名大数据爱好者来说,《大数据Spark企业级实战》内容可以帮助您一站式地完成从零起步到进行Spark企业级开发所需要的全部核心内容和实战需要。 作者简介: 王家林,Spark亚太研究院首席专家,中国移动互联网和云计算大数据集大成者。在Spark、Hadoop、Android等方面有丰富的源码、实务和性能优化经验。彻底研究了Spark从0.5.0到0.9.1共13个版本的Spark源码,并已完成2014年5月31日发布的Spark1.0源码研究。 目录: 第1章Spark编程模型 1.1 Spark:一体化、多元化的高速 大数据通用计算平台和库 1.1.1 为什么需要使用Spark 1.1.2 Spark技术生态系统简介 1.2 Spark大数据处理框架 1.2.1 Spark速度为何如此之快 1.2.2 RDD:分布式函数式编程 1.3 Spark子框架解析 1.3.1 图计算框架Spark GraphX 1.3.2 实时流处理框架 (Spark Streaming) 1.3.3 交互式SQL处理框架

Spark入门(Python)

Spark入门 Hadoop是对大数据集进行分布式计算的标准工具,这也是为什么当你穿过机场时能看到”大数据(Big Data)”广告的原因。它已经成为大数据的操作系统,提供了包括工具和技巧在内的丰富生态系统,允许使用相对便宜的商业硬件集群进行超级计算机级别的计算。2003和2004年,两个来自Google的观点使Hadoop 成为可能:一个分布式存储框架(Google文件系统),在Hadoop中被实现为HDFS;一个分布式计算框架(MapReduce)。 这两个观点成为过去十年规模分析(scaling analytics)、大规模机器学习(machine learning),以及其他大数据应用出现的主要推动力!但是,从技术角度上讲,十年是一段非常长的时间,而且Hadoop还存在很多已知限制,尤其是MapReduce。对MapReduce编程明显是困难的。对大多数分析,你都必须用很多步骤将Map和Reduce任务串接起来。这造成类SQL的计算或机器学习需要专门的系统来进行。更糟的是,MapReduce要求每个步骤间的数据要序列化到磁盘,这意味着MapReduce作业的I/O成本很高,导致交互分析和迭代算法(iterative algorithms)开销很大;而事实是,几乎所有的最优化和机器学习都是迭代的。 为了解决这些问题,Hadoop一直在向一种更为通用的资源管理框架转变,即YARN (Yet Another Resource Negotiator, 又一个资源协调者)。YARN实现了下一代的MapReduce,但同时也允许应用利用分布式资源而不必采用MapReduce进行计算。通过将集群管理一般化,研究转到分布式计算的一般化上,来扩展了MapReduce的初衷。 Spark是第一个脱胎于该转变的快速、通用分布式计算范式,并且很快流行起来。Spark使用函数式编程范式扩展了MapReduce模型以支持更多计算类型,可以涵盖广泛的工作流,这些工作流之前被实现为Hadoop之上的特殊系统。Spark使用内存缓存来提升性能,因此进行交互式分析也足够快速(就如同使用Python 解释器,与集群进行交互一样)。缓存同时提升了迭代算法的性能,这使得Spark 非常适合数据理论任务,特别是机器学习。 本文中,我们将首先讨论如何在本地机器上或者EC2的集群上设置Spark进行简单分析。然后,我们在入门级水平探索Spark,了解Spark是什么以及它如何工作(希望可以激发更多探索)。最后两节我们开始通过命令行与Spark进行交互,然后演示如何用Python写Spark应用,并作为Spark作业提交到集群上。 设置Spark 在本机设置和运行Spark非常简单。你只需要下载一个预构建的包,只要你安装了Java 6+和Python 2.6+,就可以在Windows、Mac OS X和Linux上运行Spark。确保java程序在PATH环境变量中,或者设置了JAVA_HOME环境变量。类似的,python也要在PATH中。

spark Scala 介绍 教程 入门 手册 调研

第一章Scala语法介绍 1.1阅读说明 本文档针对scala2.10.x,由于scala目前发展迅速,因此可能会和其他版本的不同。 本手册适合对象:有Java编程经验的程序员。阅读时如果发现难以理解,可以根据关键词自行上网搜索对应内容进行辅助学习。 *标注的小节,表示阅读优先级较低或者可以不用阅读。 阅读时遵循先易后难得准则,从有代码示例的地方着手会比较简单。 1.2第一个scala程序 参考:https://www.360docs.net/doc/5013408910.html,/documentation/getting-started.html object ScalaTest{ def main(args:Array[String]){ println("hello scala.") } } 1.2.1scala解释器 安装好scala并配置好PATH环境变量之后,就可以在终端中输入“scala”命令打开scala 解释器。在其中,你可以像使用shell一样,使用TAB补全、Ctrl+r搜索、上下方向键切换历史命令等等。退出scala解释器,可以使用命令:“:q”或者“:quit”。 由于解释器是输入一句执行一句,因此也常称为REPL。REPL一次只能看到一行代码,因此如果你要在其中粘贴代码段的话,可能会出现问题,这时你可以使用粘贴模式,键入如下语句: :paste 然后把代码粘贴进去,再按下Ctrl+d,这样REPL就会把代码段当作一个整体来分析。 1.2.2scala作为脚本运行 scala代码也可以作为脚本运行,只要你设置好代码文件的shell前导词(preamble),并将代码文件设置为可执行。如下: #!/usr/bin/env scala println("这是scala脚本") 设置代码文件为可执行,即可执行。 scala脚本的命令行参数保存在名为args的数组中,你可以使用args获取命令行输入的程序参数: hello.scala文件中:println("hello,"+args(0)) 在命令行中执行:scala hello.scala vitohuang

相关文档
最新文档