杂记

从今天开始笔记记在这里,除了csdn中的以外,印象笔记太不方便了,前面是计划,后面是笔记。坚持才会看到希望。

 

 

4.11 1

4.12 4

4.13 6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.11 

Plan:看完jquery,svn,

学nutch ,抓紧看hadoop的东西

 

Labin,nutch,heritrix三者关系

Larbin
开发语言:C++
http://larbin.sourceforge.net/index-eng.html
larbin是个基于C++的web爬虫工具,拥有易于操作的界面,不过只能跑在Linux下,在一台普通PC下larbin每天可以爬5百万个页面(当然啦,需要拥有良好的网络)

简介

Larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。
Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。
Latbin最初的设计也是依据设计简单但是高度可配置性的原则,因此我们可以看到,一个简单的larbin的爬虫可以每天获取500万的网页,非常高效。
功能
      1. larbin 获取单个、确定网站的所有联结,甚至可以镜像一个网站。
      2. larbin建立 url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3 。
      3. larbin 定制后可以作为搜索引擎的信息的来源(例如可以将抓取下来的网页每2000一组存放在一系列的目录结构里面)。

问题
Labin的主要问题是,:

仅提供保存网页保存功能,没有进行进一步的网页解析;

不支持分布式系统;

功能相对简单,提供的配置项也不够多;

不支持网页自动重访,更新功能;

从2003年底以后,Labin已经放弃更新,目前处于荒芜长草的状态

**********

Nutch
开发语言:Java
http://lucene.apache.org/nutch/

简介:

Apache的子项目之一,属于Lucene项目下的子项目。

Nutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中。 
 总体上Nutch可以分为2个部分:抓取部分和搜索部分。抓取程序抓取页面并把抓取回来的数据做成反向索引,搜索程序则对反向索引搜索回答用户的请求。抓取程序和搜索程序的接口是索引,两者都使用索引中的字段。抓取程序和搜索程序可以分别位于不同的机器上。下面详细介绍一下抓取部分。

抓取部分:
  抓取程序是被Nutch的抓取工具驱动的。这是一组工具,用来建立和维护几个不同的数据结构: web database, a set of segments, and the index。下面逐个解释这三个不同的数据结构
    1、The web database, 或者WebDB。这是一个特殊存储数据结构,用来映像被抓取网站数据的结构和属性的集合。WebDB 用来存储从抓取开始(包括重新抓取)的所有网站结构数据和属性。WebDB 只是被 抓取程序使用,搜索程序并不使用它。WebDB 存储2种实体:页面 和 链接。页面 表示 网络上的一个网页,这个网页的Url作为标示被索引,同时建立一个对网页内容的MD5 哈希签名。跟网页相关的其它内容也被存储,包括:页面中的链接数量(外链接),页面抓取信息(在页面被重复抓取的情况下),还有表示页面级别的分数 score 。链接 表示从一个网页的链接到其它网页的链接。因此 WebDB 可以说是一个网络图,节点是页面,链接是边。
    2、Segment 。这是网页的集合,并且它被索引。Segment的Fetchlist 是抓取程序使用的url列表,它是从 WebDB中生成的。Fetcher 的输出数据是从 fetchlist 中抓取的网页。Fetcher的输出数据先被反向索引,然后索引后的结果被存储在segment 中。 Segment的生命周期是有限制的,当下一轮抓取开始后它就没有用了。默认的 重新抓取间隔是30天。因此删除超过这个时间期限的segment是可以的。而且也可以节省不少磁盘空间。Segment 的命名是日期加时间,因此很直观的可以看出他们的存活周期。
    3、The index。索引库是反向索引所有系统中被抓取的页面,它并不直接从页面反向索引产生,而是合并很多小的segment的索引产生的。Nutch 使用 Lucene 来建立索引,因此所有Lucene相关的工具 API 都用来建立索引库。需要说明的是Lucene的segment 的概念和Nutch的segment概念是完全不同的,不要混淆。简单来说 Lucene 的 segment 是 Lucene 索引库的一部分,而Nutch 的Segment是WebDB中被抓取和索引的一部分。
抓取过程详解:

      抓取是一个循环的过程:抓取工具从WebDB中生成了一个 fetchlist 集合;抽取工具根据fetchlist从网络上下载网页内容;工具程序根据抽取工具发现的新链接更新WebDB;然后再生成新的fetchlist;周而复始。这个抓取循环在nutch中经常指: generate/fetch/update 循环。
    一般来说同一域名下的 url 链接会被合成到同一个 fetchlist。这样做的考虑是:当同时使用多个工具抓取的时候,不会产生重复抓取的现象。Nutch 遵循 Robots Exclusion Protocol, 可以用robots.txt 定义保护私有网页数据不被抓去。
    上面这个抓取工具的组合是Nutch的最外层的,也可以直接使用更底层的工具,自己组合这些底层工具的执行顺序达到同样的结果。这是Nutch吸引人的地方。下面把上述过程分别详述一下,括号内就是底层工具的名字:
    1、创建一个新的WebDB (admin db -create)。
    2、把开始抓取的跟Url 放入WebDb (inject)。
    3、从WebDb的新 segment 中生成 fetchlist (generate)。
    4、根据 fetchlist 列表抓取网页的内容 (fetch)。
    5、根据抓取回来的网页链接url更新 WebDB (updatedb)。
    6、重复上面3-5个步骤直到到达指定的抓取层数。
    7、用计算出来的网页url权重 scores 更新 segments (updatesegs)。
    8、对抓取回来的网页建立索引(index)。
    9、在索引中消除重复的内容和重复的url (dedup)。
    10、合并多个索引到一个大索引,为搜索提供索引库(merge)

*****************

Heritrix
开发语言:Java
http://crawler.archive.org/
Heritrix是一个开源,可扩展的web爬虫项目。Heritrix设计成严格按照robots.txt文件的排除指示和META robots标签。
简介

Heritrix与Nutch对比

和 Nutch。二者均为Java开源框架,Heritrix 是 SourceForge上的开源产品,Nutch为Apache的一个子项目,它们都称作网络爬虫/蜘蛛( Web Crawler),它们实现的原理基本一致:深度遍历网站的资源,将这些资源抓取到本地,使用的方法都是分析网站每一个有效的URI,并提交Http请求,从而获得相应结果,生成本地文件及相应的日志信息等。

Heritrix 是个 "archival crawler" -- 用来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒,不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫通过Web用户界面启动、监控、调整,允许弹性的定义要获取的URL。

 

Nutch和Heritrix的差异:

Nutch 只获取并保存可索引的内容。Heritrix则是照单全收。力求保存页面原貌

Nutch 可以修剪内容,或者对内容格式进行转换。

Nutch 保存内容为数据库优化格式便于以后索引;刷新替换旧的内容。而Heritrix 是添加(追加)新的内容。

Nutch 从命令行运行、控制。Heritrix 有 Web 控制管理界面。

Nutch 的定制能力不够强,不过现在已经有了一定改进。Heritrix 可控制的参数更多。

Heritrix提供的功能没有nutch多,有点整站下载的味道。既没有索引又没有解析,甚至对于重复爬取URL都处理不是很好。

Heritrix的功能强大 但是配置起来却有点麻烦。

*********************

三者的比较
一、从功能方面来说,Heritrix与Larbin的功能类似。都是一个纯粹的网络爬虫,提供网站的镜像下载。而Nutch是一个网络搜索引擎框架,爬取网页只是其功能的一部分。

二、从分布式处理来说,Nutch支持分布式处理,而另外两个好像尚且还没有支持。

三、从爬取的网页存储方式来说,Heritrix和 Larbin都是将爬取下来的内容保存为原始类型的内容。而Nutch是将内容保存到其特定格式的segment中去。

四,对于爬取下来的内容的处理来说,Heritrix和 Larbin都是将爬取下来的内容不经处理直接保存为原始内容。而Nutch对文本进行了包括链接分析、正文提取、建立索引(Lucene索引)等处理。

五,从爬取的效率来说,Larbin效率较高,因为其是使用c++实现的并且功能单一。

crawler

开发

语言

功能

单一

支持分布式

爬取

效率

镜像

保存

Nutch

Java

×

×

Larbin

C++

×

Heritrix

Java

×

 

 

 

4.12

Plan:nutch要学的lucene,hadoop,maven,ant

Alt+shift+/ 添加多行注释

Alt+shift+\ 去掉多行注释

 

Hadoop和nutch和lucene的关系

Hadoop 是一个开源的可运行于大规模集群上的分布式并行编程框架,由于分布式存储对于分布式编程来说是必不可少的,这个框架中还包含了一个分布式文件系统 HDFS( Hadoop Distributed File System )。与Hadoop 一脉相承的另外两个开源项目 Nutch 和 Lucene ( 三者的创始人都是 Doug Cutting ),那绝对是大名鼎鼎。Lucene 是一个用 Java 开发的开源高性能全文检索工具包,它不是一个完整的应用程序,而是一套简单易用的 API 。在全世界范围内,已有无数的软件系统,Web 网站基于 Lucene 实现了全文检索功能,后来 Doug Cutting 又开创了第一个开源的 Web 搜索引擎(http://www.nutch.org) Nutch, 它在 Lucene 的基础上增加了网络爬虫和一些和 Web 相关的功能,一些解析各类文档格式的插件等,此外,Nutch 中还包含了一个分布式文件系统用于存储数据。从 Nutch 0.8.0 版本之后,Doug Cutting 把 Nutch 中的分布式文件系统以及实现 MapReduce 算法的代码独立出来形成了一个新的开源项 Hadoop。Nutch 也演化为基于 Lucene 全文检索以及 Hadoop 分布式计算平台的一个开源搜索引擎。

 

描述的比较详细~

1. Nutch是基于Lucene的,Lucene是提供全文文本搜索的开源函数库,Lucene为Nutch提供了文本索引和搜索的API。

2.Hadoop起源于Nutch项目,最先是Nutch的一部分,是Nutch的分布式计算模块,后来分离出来,独立发展了。

3.Nutch是一个系统的搜索框架,包括爬虫、索引、查询等,而Hadoop只是让Nutch可以以分布式的方式去工作(这也是Hadoop最先创建的起因)。

4.Lucene,Nutch,Hadoop都是采用Java语言开发的。

NB的是,Lucene,Nutch,Hadoop 都由一个人--Doug Cutting创建,他是这三个项目的创始人,现在是Apache基金会主席。

如果你对他感兴趣,可以参考以下几个介绍:

http://www.programmer.com.cn/15929/

http://labs.chinamobile.com/groups/10216_12301

http://blogoscoped.com/archive/2004_05_28_index.html

 

以下参考信息来源于网上,供惨考:

1.明确以上关系后,我应该使用Lucene还是Nutch?

最简单的回答是:

1)如果你有本地数据源,不再需要抓取数据,应该使用Lucene。

   常见的应用场合是:你有数据源,需要为这些数据提供一个搜索页面,在这种情况下,最好的方式是直接从数据库中取出数据并用Lucene API 建立索引。

2)如果你没有本地数据源或者数据源非常分散的情况下,需要抓取数据,应该使用Nutch。

 

2.Nutch和Lucene的区别

   Nutch是基于Lucene的,即Nutch是在Lucene的基础上增加了网络爬虫(Crawler)和Searcher两个功能模块。

   Lucene不是一个应用软件,它实际上提供的是全文文本搜索的API;而Nutch是一个真正的完整的Web搜索应用程序。

   Lucene主要用来对站内信息源建立索引,而Nutch则不但包含Lucene的所有功能,而且增加了爬取网页和处理用户搜索查询请求的功能,具备一个商业搜索引擎,如谷歌搜索引擎的主要功能。

   选择用Nutch还是Lucene的标准是看你是否需要抓取数据,如果不需要则用Lucene,否则用Nutch。

 

3.Doug Cutting的原话:

1)Lucene其实是一个提供全文文本搜索的函数库,它不是一个应用软件。它提供很多API函数让你可以运用到各种实际应用程序中。

2)Nutch是一个建立在Lucene核心之上的Web搜索的实现,它是一个真正的应用程序。也就是说,你可以直接下载下来拿过来用。它在Lucene的基础上加了网络爬虫(Crawler)和一些和Web相关的东东。其目的就是想从一个简单的站内索引和搜索推广到全球网络的搜索上,就像Google和Yahoo一样。

 

 

 

 

 

 

 

4.13

Plan:继续学lucene,结合 nutch和solr

 

Analyzer,或者说文本分析的过程,实质上是将输入文本转化为文本特征向量的过程。这里所说的文本特征,可以是词或者是短语。它主要包括以下四个步骤:

  • 分词,将文本解析为单词或短语
  • 归一化,将文本转化为小写
  • 停用词处理,去除一些常用的、无意义的词
  • 提取词干,解决单复数、时态语态等问题


Lucene Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似拦截器的东东,其参数可以使TokenStream、Tokenizer,甚至是另一个TokenFilter。整个Lucene Analyzer的过程如下图所示:


上图中的一些名词的解释如下表所示:

说明

Token

表示文中出现的一个词,它包含了词在文本中的位置信息

Analyzer

将文本转化为TokenStream的工具

TokenStream

文本符号的流

Tokenizer

在字符级别处理输入符号流

TokenFilter

在字符级别处理输入符号流,其输入可以是TokenStream、Tokenizer或者TokenFilter



Lucene Analyzer中,Tokenizer和TokenFilter的组织架构如下图所示:


Lucene提供了数十种内置的Tokenizer、TokenFilter以及Analyzer供开发人员使用,事实上大部分时候我们只会需要使用其中的某几种,比如标准分词器StandardTokenizer、空格分词器WhitespaceTokenizer、转化为小写格式的LowCaseFilter、提取词干的PoterStemFilter以及组合使用StandardTokenizer和多种TokenFilter的StandardAnalyzer,有关这些的资料网上很多了,这里就不再详细介绍了。

有些时候,Lucene内置提供的Analyzer或许不能满足我们的需求。下面一个例子叙述了如何使用定制的Analyzer。它的功能是提取词干、将输入规范化为小写并且使用指定的停用词表: 

 

 

public class PorterStemStopWordAnalyzer extends Analyzer {

public static final String[] stopWords = { "and", "of", "the", "to", "is",

"their", "can", "all", "i", "in" };

 

public TokenStream tokenStream(String fieldName, Reader reader) {

Tokenizer tokenizer = new StandardTokenizer(reader);

TokenFilter lowerCaseFilter = new LowerCaseFilter(tokenizer);

TokenFilter stopFilter = new StopFilter(lowerCaseFilter, stopWords);

TokenFilter stemFilter = new PorterStemFilter(stopFilter);

return stemFilter;

}

 

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

Analyzer analyzer = new PorterStemStopWordAnalyzer();

String text = "Holmes, who first appeared in publication in 1887, was featured in four novels and 56 short stories. The first story, A Study in Scarlet, appeared in Beeton's Christmas Annual in 1887 and the second, The Sign of the Four, in Lippincott's Monthly Magazine in 1890. The character grew tremendously in popularity with the beginning of the first series of short stories in Strand Magazine in 1891; further series of short stories and two novels published in serial form appeared between then and 1927. The stories cover a period from around 1880 up to 1914.";

Reader reader = new StringReader(text);

TokenStream ts = analyzer.tokenStream(null, reader);

Token token = ts.next();

while (token != null) {

System.out.println(token.termText());

token = ts.next();

}

 

}

}

 

从结果我们可以看出:

  • StandardTokenizer将文本按照空格或标点分成词语
  • LowerCaseFilter所有的输入都被转化为小写
  • StopFilter消除了文中的停用词,比如"appeared between then and 1927"中的"and"
  • PorterStemFilter提取了文中的词根,比如story和stories都被转化为stori

 

 

 

 

 

 

 

 

 

 

文章:Nutch+Hadoop集群搭建

 

1、Apache Nutch

   Apache Nutch是一个用于网络搜索的开源框架,它提供了我们运行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬虫。

1.1、Nutch的组件结构

WebDB:存储网页数据和连接信息

Fetch lists:将WebDB所存储的连接分成多个组,来用于分布式检索

Fetchers:检索Fetch list中的内容并下载到本地,共有两项输出:分别是连接的update

信息和内容content

Updates:更新WebDB的页面检索状态

WebDB、updates、fetch lists和fetchers组成循环结构,不断运行下去,来确保所得到的Web镜像是最新的

Content:界面内容,获取内容之后,Nutch便可以根据它来创建索引并执行查询操作

Indexers:对目标Content创建索引,当索引内容较大时,可把索引划分成多个索引片段,然后分配给不同的seracher实现并行检索

Searchers:实现查询功能的同时也会缓存content

Webservers:有两种角色:

1处理用户的交互请求(Nutch Search Client)

2从searchers中获取查询结果(HTTP Server)

注:fetchers和searchers两个节点所对应的操作可放到分布式环境(hadoop)中去完成

创建索引及查询的操作可通过solr框架来实现

1.2、Nutch的数据结构:

Nutch数据包含3个目录结构,分别是:

1、Crawldb:用于存储Nutch将要检索的url信息,以及检索状态(是否检索、何时检索)

2、Linkdb:用于存储每一个url所包含的超链接信息(包括锚点)

3、Segments:一组url的集合,他们作为一个检索单元,可用于分布式检索

Segment目录包含以下子目录信息:

(1)   crawl_generate:定义将要检索的url集合(文件类型为SequenceFile)

(2)   crawl_fetch:存储每一个url的检索状态(文件类型为MapFile)

(3)   content:存储每一个url所对应的二进制字节流(文件类型为MapFile)

(4)   parse_text:存储每一个url所解析出的文本内容(文件类型为MapFile)

(5)   parse_data:存储每一个url所解析出的元数据(文件类型为MapFile)

(6)   crawl_parse:用于及时更新crawldb中的内容(如要检索的url已不存在等情况)--文件类型为SequenceFile

注:结合Nutch的数据结构和组件结构来看,crawldb相当于WebDB,而segment相当于是fetchlists.

分布式crawl过程中,每个MapReduce Job都会生成一个segment,名称以时间来命名

2、Apache Hadoop

       Nutch的单机采集(local方式)并不复杂,然而当所采集的数据源较大时,一台机器难以满足性能上的需求,因此通常的做法是将Nutch集成到Hadoop环境中以完成分布式采集和分布式查询的效果(deploy方式)。

       Hadoop框架在功能划分上包含3个子框架,分别是:

       MapReduce:用于分布式并行计算

       HDFS:用于分布式存储

       Common:封装HDFS和MapReduce所需要的实用类

2.1、MapReduce工作流程

1.将输入源(Inputfiles)切割成不同的片段,每个片段的大小通常在16M-64M之间(可通过参数配置),然后启动云端程序。

2.MapReduce程序基于master/slaves方式部署,在云端机器中选中一台机器运行master程序,职责包括:调度任务分配给slaves,监听任务的执行情况。

3.在图形中,slave的体现形式为worker,当worker接到Map任务时,会读取输入源片段,从中解析出Key/Value键值对,并作为参数传递到用户自定义的Map功能函数之中,Map功能函数的输出值同样为Key/Value键值对,这些键值对会临时缓存在内存里面。

4.缓存之后,程序会定期将缓存的键值对写入本地硬盘(执行如图所示的local write操作),并且把存储地址传回给master,以便master记录它们的位置用以执行Reduce操作。

5.当worker被通知执行Reduce操作时,master会把相应的Map输出数据所存储的地址也发送给该worker,以便其通过远程调用来获取这些数据。得到这些数据之后,reduce worker会把具有相同Key值的记录组织到一起来达到排序的效果。

6.Reduce Worker会把排序后的数据作为参数传递到用户自定义的Reduce功能函数之中,而函数的输出结果会持久化存储到output file中去。

7.当所有的Map任务和Reduce任务结束之后,Master会重新唤醒用户主程序,至此,一次MapReduce操作调用完成。

2.2、HDFS组件结构

同MapReduce部署结构类似,HDFS同样具备master/slaves主仆结构

1.如图所示中,NameNode充当master角色,职责包括:管理文档系统的命名空间(namespace);调节客户端访问到需要的文件(存储在DateNode中的文件)

注:namespace—映射文件系统的目录结构

2.DataNodes充当slaves角色,通常情况下,一台机器只部署一个Datenode,用来存储MapReduce程序需要的数据

Namenode会定期从DataNodes那里收到Heartbeat和Blockreport反馈

Heartbeat反馈用来确保DataNode没有出现功能异常;

Blockreport包含DataNode所存储的Block集合

2.3、hadoop资源

http://wiki.apache.org/nutch/NutchHadoopTutorial基于Nutch和Hadoop完成分布式采集和分布式查询

 

3、环境搭建

3.1、需要准备

       3.1.1两台或以上Linux机器(这里假定为两台)

        一台机器名称设置为master,另一台设置为slave01,两台机器具有相同的登录用户名nutch,并且将两台机器的etc/hosts文件设置成相同的内容,如:
       192.168.7.11          master

       192.168.7.12         slave01

        ……

       这样,便可以通过主机名找到对应的机器

       3.1.2搭建ssh环境

       ssh的安装可通过如下命令完成:

       $ sudo apt-get install ssh

       $ sudo apt-get install rsync

       3.1.3安装JDK

       $ apt-get install openjdk-6-jdkopenjdk-6-jre

       3.1.4下载最近版本的hadoop和nutch

              下载地址:

              Hadoop: http://www.apache.org/dyn/closer.cgi/hadoop/common/

              Nutch: http://www.apache.org/dyn/closer.cgi/nutch/

3.2、搭建配置

       3.2.1SSH登录配置

       (1)在master机器上通过以下命令生成证书文件authorized_keys

       $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa 
       $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

       (2)将证书文件复制到其他机器的用户主目录下

       $scp /home/nutch/.ssh authorized_keysnutch@slave01:/home/nutch/.ssh/authorized_keys

       通过以上两步操作,master机器便可以在不需要密码的情况下ssh到slave01机器上

       3.2.2HADOOP配置

       同ssh登录证书的配置类似,HADOOP配置同样是在master机器上完成,然后在复制到slave机器上,确保每一台机器的hadoop环境相同

       $HADOOP_HOME/conf目录下:

       (1)hadoop-env.sh文件

        export HADOOP_HOME=/PATH/TO/HADOOP_HOME

        export JAVA_HOME=/PATH/TO/JDK_HOME

        export HADOOP_LOG_DIR=${HADOOP_HOME}/logs

       (2)core-site.xml文件

        <configuration>

           <property>

               <name>fs.default.name</name>

               <value>hdfs://master:9000</value>

           </property>

        </configuration>

       (3)hdfs-site.xml文件

        <configuration>

            <property>

                <name>dfs.name.dir</name>

               <value>/nutch/filesystem/name</value>

           </property>

            <property>

               <name>dfs.data.dir</name>

                <value>/nutch/filesystem/data</value>

            </property>

            <property>

               <name>dfs.replication</name>

               <value>1</value>

            </property>

        </configuration>

       (4)mapred-site.xml文件

       <configuration>

            <property>

               <name>mapred.job.tracker</name>

                <value>master:9001</value>

           </property>

           <property>

               <name>mapred.map.tasks</name>

               <value>2</value>

           </property>

           <property>

               <name>mapred.reduce.tasks</name>

               <value>2</value>

           </property>

           <property>

               <name>mapred.system.dir</name>

               <value>/nutch/filesystem/mapreduce/system</value>

           </property>

           <property>

               <name>mapred.local.dir</name>

               <value>/nutch/filesystem/mapreduce/local</value>

           </property>

      </configuration>

     (5)masters和slaves配置

     将相应的机器IP加到对应的配置文件中去

    3.2.3 Nutch配置

     $NUTCH_HOME/conf目录下

      (1)nutch-site.xml文件

      <property>

               <name>http.agent.name</name>

               <value>Nutch Spider</value>

      </property>

      (2)regex-urlfilter.txt

      添加需要检索的url

      +^http://([a-z0-9]*\.)*nutch.apache.org/

       (3)将修改后的文件放到NUTCH_HOME/runtime/deploy/nutch-*.job中

3.3、启动运行

   3.3.1 启动Hadoop

       1.格式化namenode节点

       bin/hadoop namenode –format

       2.启动hadoop进程

       bin/start-all.sh

       启动成功后,可通过如下url查看NameNode和MapReduce运行状态

       NameNode: http://master:50070/

       MapReduce: http://master:50030/

       3.向hdfs放入测试数据

       $ bin/hadoop fs -put conf input

       4.执行测试

       $ bin/hadoop jar hadoop-examples-*.jar grep input output'dfs[a-z.]+'

       5.关闭hadoop进程

       bin/stop-all.sh

   3.3.2 运行Nutch

       1启动前提:

       (1).hadoop已成功启动

       (2).将HADOOP_HOME/bin路径添加到环境变量中,以便Nutch找到hadoop命令

        通过修改/etc/enviroment配置文件实现

       (3)在控制台执行export JAVA_HOME=/PATH/TO/JAVA命令

    2向HDFS中存入待检索数据

    $ bin/hadoop fs -put urldir urldir

    注:第一个urldir为本地文件夹,存放了url数据文件,每行一个url

    第二个urldir为HDFS的存储路径

    3启动nutch命令

    在NUTCH_HONE/runtime/deploy目录下执行以下命令

    $ bin/nutch crawl urldir –dir crawl -depth 3 –topN 10

    命令成功执行后,会在HDFS中生成crawl目录

    注:一定要在deploy目录下执行该命令,在local目录下执行的是单机采集,而没有使用hadoop环境

 

 

 

 

文章:基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

 

网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项。由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎,用来对网络爬虫抓取到的网络资源进行实时的索引和搜索。

 

搜 索引擎架构在ElasticSearch之上,是一个典型的分布式在线实时交互查询架构,无单点故障,高伸缩、高可用。对大量信息的索引与搜索都可以在近 乎实时的情况下完成,能够快速实时搜索数十亿的文件以及PB级的数据,同时提供了全方面的选项,可以对该引擎的几乎每个方面进行定制。支持RESTful 的API,可以使用JSON通过HTTP调用它的各种功能,包括搜索、分析与监控。此外,还为Java、PHP、Perl、Python以及Ruby等各 种语言提供了原生的客户端类库。

 

网络爬虫通过将抓取到的数据进行结构化提取之后提交给搜索引擎进行索引,以供查询分析使用。由于搜索引擎的设计目标在于近乎实时的复杂的交互式查询,所以搜索引擎并不保存索引网页的原始内容,因此,需要一个近乎实时的分布式数据库来存储网页的原始内容。

分布式数据库架构在Hbase+Hadoop之上,是一个典型的分布式在线实时随机读写架构。极强的水平伸缩性,支持数十亿的行和数百万的列,能够对网络爬虫提交的数据进行实时写入,并能配合搜索引擎,根据搜索结果实时获取数据。

网络爬虫、分布式数据库、搜索引擎均运行在普通商业硬件构成的集群上。集群采用分布式架构,能扩展到成千上万台机器,具有容错机制,部分机器节点发生故障不 会造成数据丢失也不会导致计算任务失败。不但高可用,当节点发生故障时能迅速进行故障转移,而且高伸缩,只需要简单地增加机器就能水平线性伸缩、提升数据 存储容量和计算速度。

网络爬虫、分布式数据库、搜索引擎之间的关系:

1、网络爬虫将抓取到的HTML页面解析完成之后,把解析出的数据加入缓冲区队列,由其他两个线程负责处理数据,一个线程负责将数据保存到分布式数据库,一个线程负责将数据提交到搜索引擎进行索引。

2、搜索引擎处理用户的搜索条件,并将搜索结果返回给用户,如果用户查看网页快照,则从分布式数据库中获取网页的原始内容。

 

整体架构如下图所示:

爬虫集群、分布式数据库集群、搜索引擎集群在物理部署上,可以部署到同一个硬件集群上,也可以分开部署,形成1-3个硬件集群。

网络爬虫集群有一个专门的网络爬虫配置管理系统来负责爬虫的配置和管理,如下图所示:

搜索引擎通过分片(shard)和副本(replica)实现了高性能、高伸缩和高可用。分片技术为大规模并行索引和搜索提供了支持,极大地提高了索引和搜 索的性能,极大地提高了水平扩展能力;副本技术为数据提供冗余,部分机器故障不影响系统的正常使用,保证了系统的持续高可用

有2个分片和3份副本的索引结构如下所示:

 

 

一个完整的索引被切分为0和1两个独立部分,每一部分都有2个副本,即下面的灰色部分。

在 生产环境中,随着数据规模的增大,只需简单地增加硬件机器节点即可,搜索引擎会自动地调整分片数以适应硬件的增加,当部分节点退役的时候,搜索引擎也会自 动调整分片数以适应硬件的减少,同时可以根据硬件的可靠性水平及存储容量的变化随时更改副本数,这一切都是动态的,不需要重启集群,这也是高可用的重要保障

 

 

 

 

 

Nutch的创始人是Doug Cutting,他同时也是Lucene、Hadoop和Avro开源项目的创始人。

Nutch诞生于2002年8月,是Apache旗下的一个用Java实现的开源搜索引擎项目,自Nutch1.2版本之后,Nutch已经从搜索引擎演化为网络爬虫,接着Nutch进一步演化为两大分支版本:1.X和2.X,这两大分支最大的区别在于2.X对底层的数据存储进行了抽象以支持各种底层存储技术。

在Nutch的进化过程中,产生了Hadoop、Tika、Gora和Crawler Commons四个Java开源项目。如今这四个项目都发展迅速,极其火爆,尤其是Hadoop,其已成为大规模数据处理的事实上的标准。Tika使用多种现有的开源内容解析项目来实现从多种格式的文件中提取元数据和结构化文本,Gora支持把大数据持久化到多种存储实现,Crawler Commons是一个通用的网络爬虫组件。

大数据这个术语最早的引用可追溯到Nutch。当时,大数据用来描述为更新网络搜索索引需要同时进行批量处理或分析的大量数据集。现在,大数据的含义已经被极大地发展了,业界将大数据的特性归纳为4个“V”。Volume数据体量巨大,Variety数据类型繁多,Value价值密度低,商业价值高,Velocity处理速度快。

Hadoop是大数据的核心技术之一,而Nutch集Hadoop之大成,是Hadoop的源头。学习Hadoop,没有数据怎么办?用Nutch抓!学了Hadoop的Map Reduce以及HDFS,没有实用案例怎么办?学习Nutch!Nutch的很多代码是用Map Reduce和HDFS写的,哪里还能找到比Nutch更好的Hadoop应用案例呢?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.14

lucene 索引文件格式

Lucene4.x之后的所有索引格式如下所示: 

文件名

后缀

描述

Segments File

segments.gen, segments_N

存储段文件的提交点信息

Lock File

write.lock

文件锁,保证任何时刻只有一个线程可以写入索引

Segment Info

.si

存储每个段文件的元数据信息

Compound File

.cfs, .cfe

复合索引的文件,在系统上虚拟的一个文件,用于频繁的文件句柄

Fields

.fnm

存储域文件的信息

Field Index

.fdx

存储域数据的指针

Field Data

.fdt

存储所有文档的字段信息

Term Dictionary

.tim

term字典,存储term信息

Term Index

.tip

term字典的索引文件

Frequencies

.frq

词频文件,包含文档列表以及每一个term和其词频

Positions

.prx

位置信息,存储每个term,在索引中的准确位置

Norms

.nrm.cfs, .nrm.cfe

存储文档和域的编码长度以及加权因子

Per-Document Values

.dv.cfs, .dv.cfe

编码除外的额外的打分因素,

Term Vector Index

.tvx

term向量索引,存储term在文档中的偏移距离

Term Vector Documents

.tvd

包含每个文档向量的信息

Term Vector Fields

.tvf

存储filed级别的向量信息

Deleted Documents

.del

存储索引删除文件的信息



复合索引文件是指,除了段信息文件,锁文件,以及删除的文件外,其他的一系列索引文件压缩一个后缀名为cfs的文件,意思,就是所有的索引文件会被存储成一个单例的Directory,而非复合索引是灵活的,可以单独的访问某几个索引文件,而复合索引文件则不可以,因为其压缩成了一个文件,所以在某些场景下能够获取更高的效率,比如说,查询频繁,而不经常更新的需求,就很适合这种索引格式。   

lucene索引的基本概念组成由,索引,文档,域和项组成,一个索引,通常包含一些序列的文档,一个文档包含一些序列的域,而一些域又包含一些序列的项,而一些项则包含一些列序列的最低层的字节,注意这里的序列指的是在索引结构中有序,通常有序的这种方式,某些情况可以优化索引结构。 
lucene使用了倒排索引(Inverted Indexing),来存储索引信息,大大提高了检索效率, 
倒排索引,举一个通俗的例子,原来基于人们的正常思维,我们会存储的是一个文章中出现了那几个单词,而倒排索引,却恰恰相反,它存储的是这个单词,包含在几个文档中,当然这个关系是由倒排链表(存储一系列docid)构成的索引,我们在检索时,通过这个单词可以快速的定位,它出现在几篇文章中,从而大大提升了检索性能。 

当然lucene中不仅仅有倒排索引,也有正向的存储,而倒排之所以是lucene的核心,是因为它提升了检索性能,在检索到一个个具体的文档时,就需要我们正向的拿出这些信息,反映在实际的代码中就是我们通过检索获取一个个docid,然后通过一个个docid获取整个文档,然后我们在正向的获取各个域,以及各个项存储的具体信息,当然前提是你存储了这个字段,如果你只是索引了,而并没有存储,那么你只能检索到此条信息,但无法获取具体term的值,这个需要在建索引之前就要设计好,索引的存储结构,那些字段是检索的,那些字段是存储的等等,如果你还需要高亮一些内容,则还需要存储这个域的偏移的位置,通过这样就能准确的在文中标记检索命中的关键词,如果你打算在前台来完成这个高亮,就不要存储这些信息了。 

 

 

 

名称

文件拓展名

描述

段文件

segments_N

保存了索引包含的多少段,每个段包含多少文档。

段元数据

.si

保存了索引段的元数据信息

锁文件 

write.lock

防止多个IndexWriter同时写到一份索引文件中。

复合索引文件

.cfs, .cfe

把所有索引信息都存储到复合索引文件中。

索引段的域信息

.fnm

保存此段包含的域,以及域的名称和域的索引类型。

索引段的文档信息

.fdx, .fdt

保存此段包含的文档,每篇文档中包含的域以及每个域的信息。

索引段Term信息

.tim, .tip

.tim文件中存储着每个域中Term的统计信息且保存着指向.doc, .pos, and .pay 索引文件的指针。

.tip文件保存着Term 字典的索引信息,可支持随机访问。

文档中Term词频和跳表信息

.doc

保存此段中每个文档对应的Term频率信息。

文档中Term的位置信息

.pos

保存此段中每个文档对应的Term位置信息。

文档的有效载荷和部分位置信息

.pay

保存此段中每个文档的有效载体(payload) 和 Term的位置信息(offsets)。 其中有一部分的Term位置信息存储在.pos文件中。

索引字段加权因子

.nvd, .nvm

.nvm 文件保存索引字段加权因子的元数据

.nvd 文件保存索引字段加权数据

索引文档加权因子

.dvd, .dvm

.dvm 文件保存索引文档加权因子的元数据

.dvd 文件保存索引文档加权数据

索引矢量数据

.tvx, .tvd, .tvf

.tvd 存储此段文档的Term、Term频率、位置信息、有效载荷等信息。

.tvx 索引文件,用于把特定的文档加载到内存。

.tvf 保存索引字段的矢量信息。

有效文档

.liv

保存有效文档的索引文件信息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.25

Nutch爬取数据并建立索引库中文件的内容

从上一篇博文我们可以知道,nutch爬虫在执行数据抓取的过程中,在data目录下面有crawldb和segments两个目录: 

下面我们对这两个目录里面的内容做详细的介绍:

1. crawldb

crawldb里面存储的是爬虫在抓取过程中的所有的URL,里面也有两个目录:current和old。 
 
之前已经抓取过的url放到old目录中,当前需要执行的放到current目录里面。

在current目录下面有一个文件夹part-0000,如果是deploy模式的分布式方式,在这个目录下会有相关的其他一些目录,如:part-0001,part-0002等。在part-0000下面也有两个目录:data和index。 
 
这个是hadoop的自身文件格式,其中

  1. data存放hadoop的所有的表库;
  2. index主要存放一些简单的索引,用于加快和方便查找。

2. segments

在segments目录下面,nutch没运行一个抓取周期,都会在segments目录下面生成一个文件夹: 
 
上一篇博文里面我们在运行抓取的时候带的参数的depth是设置为3:

nohup bin/nutch crawl urls -dir data -depth 3 -threads 100 &

  • 1

所以在这个命令运行完成之后,会生成3个目录,这3个目录都是以当前的时间作为标识。

在每个文件夹下面都存在6个子文件夹: 

从上一篇博文里面的第4小结可以看出nutch爬虫抓取数据的整个过程: 

而从这个图里面,也可以看出,segments目录下面的每个文件夹中的6个子文件夹都在Segment N里面,并且每个文件夹都与nutch爬虫抓取的4个过程有着相当紧密的联系。

从上图里面可以看出: 
1. crawl_generate文件夹是nutch爬虫在执行第1个过程generator的时候产生的。 
2. crawl_fetch和content文件夹都是nutch爬虫在执行第2个过程Fetcher的时候产生的。其中: 
(1) content文件里里面保存的就是nutch爬虫抓取的网页的源代码的二进制的内容。 
(2)crawl_fetch是每个url的抓取状态:成功抓取、抛出异常或者是其他的各种各样的状态。 
3. crawl_parse、parse_data和parse_text是nutch爬虫在执行第3个过程parse segment的时候 产生的。其中: 
(1)crawl_parse 是每个url的解析状态。有解析成功和解析失败。 
(2)parse_data 是保存抓取内容的源数据。 
(3)parse_text 是保存抓取内容的文本数据。

等nutch爬虫抓取完成之后,我们可以看到在data目录下面变成了3个目录,多了一个linkdb: 

3. linkdb

linkdb目录主要存放在连接过程中产生的内容,同样的有一个part-0000目录,在这个目录下面也有data和index两个子目录。 

 

5.5

电子邮件服务器主要提供以下功能:

(1)接收用户投递的邮件;

(2)将用户投递进来的邮件转发给目标邮件服务器;

(3)接收其他邮件服务器转发来的邮件并把邮件存储到其管理的用户邮箱中;

(4)为前来读取邮件的用户提供读取服务。

 

 

 

 

5.9

POST /servlet/ParamsServlet HTTP/1.1

Host:

GET /books/java.html HTTP/1.1

 

Accept: text/html,image/*

Accept-Charset: ISO-8859-1

Accept-Encoding: gzip,compress

Accept-Language: en-us,zh-

Host: www.it315.org:80

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT

Referer: http://www.it315.org/index.jsp   

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)

Cookie:

Connection: close/Keep-Alive

Date: Tue, 11 Jul 2000 18:23:51 GMT

 

 

请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET     请求获取Request-URI所标识的资源
POST    在Request-URI所标识的资源后附加新的数据
HEAD    请求获取由Request-URI所标识的资源的响应消息报头
PUT     请求服务器存储一个资源,并用Request-URI作为其标识
DELETE  请求服务器删除Request-URI所标识的资源
TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

 

 

Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
Authorization
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:
我们在浏览器中输入:http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:www.guet.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
User-Agent
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。
请求报头举例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)

 

 

5.11

tshark -i eth0 -n -f 'tcp port 22' -T pdml > /root/test.xml。

-T:表示设置输出格式。(其格式支持pdml|ps|psml|text|fields)。默认为text格式。

tshark -r "d:\test.pcap" -R "tcp and modbus_tcp.len==6" -n -T fields -e modbus_tcp.reference_num>"D:\test.txt"

 

sed -i s/\r$// 1.sh

 

editcap -A "2014-07-12 12:55:00" -B "2014-07-12 12:56:00" eth0-rtp.cap  out_rtp.cap

editcap.exe -c 100 D:\dump.pcap D:\test.pcap

 

 

 

5.18

一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。
好处:
a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。

 

 

 

5.22

数据地图、时间线图、时空数据图、关系图,以及基于互联网的
热力图和标签云 

 

5.26

HT中的数据结构类型,可在<script>中使用

 

Data类型贯穿整个HT框架,是最基础数据类型。

  • getId()setId(id)获取和设置唯一编号,系统会自动分配,设置需注意DataModel说明DataModel#getDataById(id)可查找
  • getTag()setTag(tag)获取和设置标示号,通过DataModel#getDataByTag(tag)可查找
  • getName()setName(name)获取和设置名称
  • getIcon()setIcon(icon)获取和设置小图标,常作为TreeViewListView等组件上的节点小图标
  • getDisplayName()setDisplayName(displayName)获取和设置显示名称,常作为ColumnProperty的列头和属性名称显示
  • getToolTip()setToolTip(tooltip)获取和设置组件上该节点或图元的文字提示信息
  • getParent()setParent(parent)获取和设置父亲节点,作为树层次结构的信息,内部会自动调用addChildremoveChild
  • addChild(child, index)添加孩子节点,index为孩子插入索引,为空则插入作为最后的孩子,内部会自动调用setParent
  • removeChild(child)删除指定孩子节点,内部会自动调用setParent
  • clearChildren()删除所有孩子节点,内部会自动调用setParent
  • onChildAdded(child, index)添加孩子时的回调函数,可重载做后续处理
  • onChildRemoved(child, index)删除孩子时的回调函数,可重载做后续处理
  • onParentChanged(oldParent, parent)改变父亲节点时的回调函数,可重载做后续处理
  • size()返回孩子总数
  • hasChildren()判断是否有孩子,有则返回true,无则返回false
  • isEmpty()判断是否有孩子,有则返回false,无则返回true
  • getChildren()获取所有孩子节点,该函数返回内部ht.List类型数组对象引用
  • toChildren(matchFunc, scope)根据matchFunc函数逻辑构建所有匹配图元的新ht.List类型数组对象
  • eachChild(func, scope)遍历所有孩子,可指定函数scope
  • getChildAt(index)返回指定索引位置孩子
  • isParentOf(data)判断本图元是否为指定data的父亲图元
  • isDescendantOf(data)判断本图元是否为指定data图元的子孙
  • isRelatedTo(data)判断本图元与指定data图元是否有父子或子孙关系
  • layer属性通过getLayer()setLayer(layer)操作,对应图元在GraphView组件中的图层位置,默认值为空
  • isAdjustChildrenToTop()setAdjustChildrenToTop(true),默认为falseht.Node类型默认为true, GraphView默认点击图元会自动sendToTop,该属性决定是否对子图元也进行sendToTop操作
  • firePropertyChange(property, oldValue, newValue)派发属性变化事件,可使用fp的简写方式
  • onPropertyChanged(event)属性变化回调函数,可重载做后续处理
  • invalidate()该函数用户强制触发属性变化事件通知界面更新,内部实现为this.fp('*', false, true)
  • getStyleMap()返回图元内部样式映射信息,getStyle(name)时如果styleMap对应值为空,自动会返回ht.Style定义的信息
  • getStyle('name')setStyle('name', value)获取和设置图元样式,可采用s(name/name,value/json)的简写方式
  • onStyleChanged(name, oldValue, newValue)style属性变化时会回调该函数,可重载做后续处理
  • getAttrObject()setAttrObject(obj)获取和设置attr属性对象,该属性默认为空,用于存储用户业务信息
  • getAttr(name)setAttr(name, value)获取和设置attr对象的属性,可采用a(name/name,value/json)的简写方式
  • onAttrChanged(name, oldValue, newValue)attr属性变化时会回调该函数,可重载做后续处理
  • toLabel()返回值默认作为TreeViewGraphView等组件上的图元文字标签,默认返回displayName||name信息
  • addStyleIcon(name, icons)removeStyleIcon(name)增加和删除styleicons属性,可参考icon章节
  • getSerializableProperties()返回需要序列化的属性名称map,参见序列化手册
  • getSerializableStyles()返回需要序列化的style属性名称map,参见序列化手册
  • getSerializableAttrs()返回需要序列化的attr属性名称map,参见序列化手册

 

HT整体框架层次很“扁平化”,ht.*包含模型和系统相关类,ht.widget.*包含通用组件相关类,ht.graph.*包含2D图形组件相关类,ht.graph3d.*包含3D图形组件相关类,考虑到js语言以及HTML5应用特殊性,尽量减少类包层次,简短包函数命名是HT框架API设计的特点, 这样能减少用户学习指数,降低编码工作量,有助于整体开发包精小。

 

 

 

 

 

 

6.5

1.解析json字符串

将json字符串转换为json对象,然后再解析json对象:。
JSONObjectjsonObject = JSONObject.fromObject(jsonStr);
 根据json中的键得到它的值
Stringname = jsonObject.getString("name");
int age = jsonObject.getInt("age");
2.将json字符串转换为Java对象
同样先将json字符串转换为json对象,再将json对象转换为java对象,如下所示。
JSONObjectobj = new JSONObject().fromObject(jsonStr);//将json字符串转换为json对象
将json对象转换为java对象
Personjb = (Person)JSONObject.toBean(obj,Person.class);//将建json对象转换为Person对象
3.将java对象转换为json字符串
先将java对象转换为json对象,在将json对象转换为json字符串
JSONObjectjson = JSONObject.fromObject(obj);//将java对象转换为json对象
Stringstr = json.toString();//将json对象转换为字符串

package Test3;

import net.sf.json.JSONObject;

 

 

public class JsonToObject {

 

/**

 * @param args

 */

public void test(){

 

System.out.println("将object对象,字符串转为json对象");

 

Person person = new Person(1, "cgf");

 

JSONObject json = JSONObject.fromObject(person);

 

System.out.println(json);

 

System.out.println("将字符串转成JSON对象,再转为自定义对象");

 

String jsonString = "{" + "age" + ":1" + "," + "name" + ":" + "'wbj'" + "}";

 

JSONObject jsonObject = JSONObject.fromObject(jsonString);

 

System.out.println(jsonObject);

 

Person person1 = (Person) JSONObject.toBean(jsonObject, Person.class);

 

System.out.println("名字:"+person1.getAge() + "年龄:" + person1.getName());

 

System.out.println("将Java对象转为json字符串");

 

JSONObject json1 = JSONObject.fromObject(person);

 

String jsonString1 = json1.toString();

 

System.out.println(jsonString1);

 

}

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

JsonToObject json = new JsonToObject();

 

json.test();

 

}

 

}

 

 

 

 

6.7

Mstsc.exe windows远程连接工具

 

 

 

6.14

 

CHCP 65001

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值