家裡或公司的舊電腦不夠力? 效能慢到想砸爛它們? 朋友或同事有電腦要丟嗎? 我有一個廢物利用的方法, 我收集了四台舊電腦, 組了一個Fully Distributed Mode的Hadoop Cluster, 在Hadoop上架了Hbase, 執行Nutch, 儲存Solr的資料在Hbase。

PC Specs

Name CPU RAM
pigpigpig-client2 T2400 1.82GHz 2GB
pigpigpig-client4 E7500 2.93GHz 4GB
pigpigpig-client5 E2160 1.80GHz 4GB
pigpigpig-client6 T7300 2.00GHz 2GB

Roles

Name Roles
pigpigpig-client2 HQuorumPeer, SecondaryNameNode, ResourceManager, Solr
pigpigpig-client4 NodeManager, HRegionServer, DataNode
pigpigpig-client5 NodeManager, HRegionServer, DataNode
pigpigpig-client6 NameNode, HMaster, Nutch

Version

Configuration

剛開始執行Nutch時, 並沒有特別修改預設的設定檔, 每次經過大約10小時, RegionServer一定會發生隨機crash, 錯誤訊息大概都是Out Of Memory之類的, 我們的限制是資源有限, 舊電腦已經無法升級, 不像EC2是資源不夠就能升級, 所以performance tuning對我們是很重要的議題。

in hadoop-env.sh

記憶體很珍貴, 因為只有兩個DATANODE, 不需要預設的512MB那麼多, 全部減半

export HADOOP_NAMENODE_OPTS=“-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS -Xmx256m”

export HADOOP_DATANODE_OPTS=“-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS -Xmx256m”

export HADOOP_SECONDARYNAMENODE_OPTS=“-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS -Xmx256m”

export HADOOP_PORTMAP_OPTS=“-Xmx256m $HADOOP_PORTMAP_OPTS”

export HADOOP_CLIENT_OPTS=“-Xmx256m $HADOOP_CLIENT_OPTS”

in hdfs-site.xml

為了避免hdfs timeout errors, 延長timeout的時間

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<property>
<name>dfs.datanode.socket.write.timeout</name>
<value>1200000</value>
</property> <property>
<name>dfs.socket.timeout</name>
<value>1200000</value>
</property> <property>
<name>dfs.client.socket-timeout</name>
<value>1200000</value>
</property>

in mapred-env.sh

export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=256

in mapred-site.xml

CPU效能不好, node不夠多, mapred.task.timeout調高一點, 免得mapreduce來不及做完, 尤其nutch inject、generate、fetch、parse、updatedb執行幾輪之後, 每次處理的資料都幾百萬筆, timeout太低會做不完。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  <property>
<name>mapred.task.timeout</name>
<value>216000000</value> <!-- 60 hours -->
</property> <property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property> <property>
<name>mapreduce.map.output.compress.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property> <property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property> <property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property> <property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx200M</value>
</property> <property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx200M</value>
</property> <property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>1024</value>
</property> <property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx200M</value>
</property>

in yarn-env.sh

JAVA_HEAP_MAX=-Xmx256m

YARN_HEAPSIZE=256

in yarn-site.xml

4GB的RAM要分配給OS、NodeManager、HRegionServer和DataNode, 資源實在很緊。分派一半的記憶體給YARN, 所以yarn.nodemanager.resource.memory-mb設成2048; 每個CPU有2個core, 所以mapreduce.map.memory.mb、mapreduce.reduce.memory.mb和yarn.scheduler.maximum-allocation-mb設成1024。yarn.nodemanager.vmem-pmem-ratio設高一點避免出現類似 “running beyond virtual memory limits. Killing container"之類的錯誤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property> <property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>128</value>
</property> <property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1024</value>
</property> <property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property> <property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>true</value>
</property> <property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>3.15</value>
</property>

in hbase-env.sh

# export HBASE_HEAPSIZE=1000

export HBASE_MASTER_OPTS=“$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx192m -Xms192m -Xmn72m”

export HBASE_REGIONSERVER_OPTS=“$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Xmx1024m -Xms1024m -verbose:gc -Xloggc:/mnt/hadoop-2.4.1/hbase/logs/hbaseRgc.log -XX:+PrintAdaptiveSizePolicy -XX:+PrintGC -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/mnt/hadoop-2.4.1/hbase/logs/java_pid{$$}.hprof”

export HBASE_ZOOKEEPER_OPTS=“$HBASE_ZOOKEEPER_OPTS $HBASE_JMX_BASE -Xmx192m -Xms72m”

in hbase-site.xml

RegionServer發生out of memory閃退跟hbase.hregion.max.filesize、hbase.hregion.memstore.flush.size和hbase.hregion.memstore.block.multiplier有關。

hbase.hregion.max.filesize太小的缺點

  1. 每台ResrionServer的Regions會太多 (P.S. 每個region的每個ColumnFamily會占用2MB的MSLAB)
  2. 造成頻繁的split和compact
  3. 開啟的storefile數量太多 (P.S. Potential Number of Open Files = (StoreFiles per ColumnFamily) x (regions per RegionServer))

hbase.hregion.max.filesize太大的缺點

  1. 太少Region, 沒有Distributed Mode的效果了
  2. split和compact時的pause也會過久

write buffer在server-side memory-used是(hbase.client.write.buffer) * (hbase.regionserver.handler.count), 所以hbase.client.write.buffer和hbase.regionserver.handler.count太高會吃掉太多記憶體, 但是太少會增加RPC的數量。

hbase.zookeeper.property.tickTime和zookeeper.session.timeout太短會造成ZooKeeper SessionExpired。hbase.ipc.warn.response.time設長一點可以suppress responseTooSlow warning。

hbase.hregion.memstore.flush.size和hbase.hregion.memstore.block.multiplier也會影響split和compact的頻率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<property>
<name>hbase.client.scanner.timeout.period</name>
<value>1200000</value>
</property> <property>
<name>hbase.zookeeper.property.tickTime</name>
<value>60000</value>
</property> <property>
<name>zookeeper.session.timeout</name>
<value>1200000</value>
</property> <property>
<name>hbase.rpc.timeout</name>
<value>1800000</value>
</property> <property>
<name>hbase.ipc.warn.response.time</name>
<value>1200000</value>
</property> <property>
<name>hbase.regionserver.handler.count</name>
<value>15</value>
</property> <property>
<name>hbase.hregion.max.filesize</name>
<value>10737418240</value>
</property> <property>
<name>hbase.hregion.memstore.flush.size</name>
<value>67108864</value>
</property> <property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>8</value>
</property>

Start Servers

  1. run hdfs namenode -format on pigpigpig-client6
  2. run start-dfs.sh on pigpigpig-client6
  3. run start-yarn.sh on pigpigpig-client2
  4. run start-yarn.sh on pigpigpig-client4
  5. run start-hbase.sh on pigpigpig-client6
  6. run java -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -jar start.jar in solr folder on pigpigpig-client2
  7. run hadoop fs -mkdir /user;hadoop fs -mkdir /user/pigpigpig;hadoop fs -put urls /user/pigpigpig in nutch folder on pigpigpig-client6
  8. run hadoop jar apache-nutch-2.4-SNAPSHOT.job org.apache.nutch.crawl.InjectorJob urls -crawlId webcrawl in nutch folder on pigpigpig-client6
  9. run hadoop jar apache-nutch-2.4-SNAPSHOT.job org.apache.nutch.crawl.GeneratorJob -crawlId webcrawl in nutch folder on pigpigpig-client6
  10. run hadoop jar apache-nutch-2.4-SNAPSHOT.job org.apache.nutch.fetcher.FetcherJob -all -crawlId webcrawl in nutch folder on pigpigpig-client6
  11. run hadoop jar apache-nutch-2.4-SNAPSHOT.job org.apache.nutch.parse.ParserJob -all -crawlId webcrawl in nutch folder on pigpigpig-client6
  12. run hadoop jar apache-nutch-2.4-SNAPSHOT.job org.apache.nutch.crawl.DbUpdaterJob -all -crawlId webcrawl in nutch folder on pigpigpig-client6
  13. run hadoop jar apache-nutch-2.4-SNAPSHOT.job org.apache.nutch.indexer.IndexingJob -D solr.server.url=http://pigpigpig-client2/solr/nutch/ -all -crawlId webcrawl in nutch folder on pigpigpig-client6

Stop Servers

  1. run stop-hbase.sh on pigpigpig-client6
  2. run stop-yarn.sh on pigpigpig-client2
  3. run stop-yarn.sh on pigpigpig-client4
  4. run stop-dfs.sh on pigpigpig-client6

Screenshots

  

Resources

  1. 完整Configuration files請到https://github.com/EugenePig/Experiment1下載
  2. https://github.com/EugenePig/Gora/tree/Gora-0.6.1-SNAPSHOT-Hadoop27-Solr5
  3. https://github.com/EugenePig/nutch/tree/2.4-SNAPSHOT-Hadoop27-Solr5
  4. https://github.com/EugenePig/ik-analyzer-solr5

How to Reuse Old PCs for Solr Search Platform?的更多相关文章

  1. Custom SOLR Search Components - 2 Dev Tricks

    I've been building some custom search components for SOLR lately, so wanted to share a couple of thi ...

  2. solr search基础知识(控制符及其参数)

    1.^ 控制符 (1)查询串上用^ 搜索: 天后王菲,如果希望将王菲的相关度加大,用^控制符. 天后  王菲^10.5  结果就会将含有王菲的document权重加大分数提高,排序靠前,10.5为权重 ...

  3. Spring Boot Reference Guide

    Spring Boot Reference Guide Authors Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch,  ...

  4. 资源list:Github上关于大数据的开源项目、论文等合集

    Awesome Big Data A curated list of awesome big data frameworks, resources and other awesomeness. Ins ...

  5. Awesome Big Data List

    https://github.com/onurakpolat/awesome-bigdata A curated list of awesome big data frameworks, resour ...

  6. java框架之SpringBoot(1)-入门

    简介 Spring Boot 用来简化 Spring 应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的.产品级别的应用. 背景: J2EE 笨重的开发.繁多的配置.低下的开发效率 ...

  7. spring boot 项目搭建时,各个依赖的作用

    项目搭建页面 https://start.spring.io/ 各个依赖的作用 List of dependencies for Spring Boot 2.1.5.RELEASE Core DevT ...

  8. 什么是Spring Boot简介

    1.什么是spring boot 简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置. 从本质上来说,Spring Boot就是Spring,它 ...

  9. 搭建Spring Initializr服务器

    前言 按照网上很多教程,出错特别多.首先是GitHub和maven仓库的网络环境比较差,踩了很多坑:其次是SpringInitializr更新迭代几个版本,0.7.0我也没能弄成功.索性就用了旧版本0 ...

随机推荐

  1. 基于jquery的锚点滚动插件(百度百科效果) anchorScroll.js

    1.插进使用场景 请打开https://baike.baidu.com/item/%E6%97%A5%E6%9C%AC%E5%8A%A8%E7%94%BB#hotspotmining,查看百度百科页面 ...

  2. openerp 中文乱码及界面翻译不全

    openerp中文报表乱码问题,即是字体问题,环境是ubuntu 12.04 openerp 6.1, deb all in one安装方式 一.cd usr/share/fonts/truetype ...

  3. POJ 1579 Function Run Fun 记忆化递归

    典型的记忆化递归问题. 这类问题的记忆主要是利用数组记忆.那么已经计算过的值就能够直接返回.不须要进一步递归了. 注意:下标越界.递归顺序不能错,及时推断是否已经计算过值了,不要多递归. 或者直接使用 ...

  4. Largest Number(leetcode 179)

    给定一个int数组(每个数字无前导0),要求用这些数字拼接出一个最大的数字. 解决思路: 对整个数组进行排序,把排序后的结果拼接起来. 那么如何进行排序呢?只需要定义一个比较函数,如果str(x)+s ...

  5. 理解WEB标准

    WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为 (Behavior).对应的标准也分三方面:结构化标准语言主要 ...

  6. Linux命令-安全复制命令:scp

    scp是有Security的文件copy,基于ssh登录.操作起来比较方便,比如要把当前一个文件copy到远程另外一台主机上. 命令格式: scp [可选参数] 源文件 目标文件 scp 本地文件 远 ...

  7. 自定义Microsoft Visual Studio 代码模板,增加公司和个人信息

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplates\CSharp目录里面有各种新建模板分类: 修 ...

  8. JFinal record类型数据在前台获取

    1.jfinal record还得自己处理一下 可以使用 this.setSessionAttr("user", record.getColumns()); 这样在jsp中el表达 ...

  9. c#基础之异常处理及自定义异常 从SQLServer转储数据到MySQL

    c#基础之异常处理及自定义异常 一.什么是c#中的异常? 异常是程序运行中发生的错误,异常处理是程序的一部分.c#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说S ...

  10. python学习笔记011——函数式编程

    1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...