Eclipse+TomcatPlugin 解密

07 Mar 2013

起源

Eclipse 下使用 Tomcat 运行 Web 应用有两种方式:

  • 配置 Eclipse 的 Server 功能,连接 Tomcat 服务,很方便~适合小项目
  • 使用 TomcatPlugin 插件,在 Eclipse 中单独启动 Tomcat 服务,可同时运行多个项目

Step1 安装

Step1-1 Install TomcatPlugin

这里下载对应 Eclipse 版本的 tomcatPlugin 插件,Eclipse3.6 以上版本均使用最新 tomcatPluginV33

然后将得到的压缩包解压,放入 Eclipse 的 plugins 目录中重启 Eclipse, Tomcat 插件安装成功!

当然安装成功不并代表能使用,这里还要配置 Tomcat, 才能正常使用 Tomcat 插件。

Step1-2 Install Tomcat

Step2 配置

Eclipse – toolsbar → Window → Prefences → Tomcat

  • 选择对应的 Tomcat 版本
  • 配置 Tomcat 的根目录路径
  • 选择发布到 Tomcat 的模式(建议选择默认的 Context files)
    • 选择 Context files,则启动小猫的时候就会在 Tomcat 6.0\conf\Catalina\localhost 下建立一个 xml 文件,来标识该应用,xml 文件的名字由 Context name 决定
    • 选择 Server.xml,则会修改 Tomcat 6.0\conf\server.xml,添加如 <Context path="test" reloadable="true" docBase="D:\test\WebContent" workDir="D:\test\work" /> 来标识该应用

你的 Dynamic Web project 项目 → Properties → Tomcat

  • 勾选 Is a Tomcat Project
  • Context name 填写你项目的名称(如 /test 或 test 均可,建议不要斜杠),这个名字决定访问路径 http://localhost:8080/test
  • Subdirectory to set as web application root (optional) 是和 src 同一目录下的,里面放有 WEB-INFMETA-INF 的文件夹的名字,一般填 WebContent 或者 WebRoot

你的 Dynamic Web project 项目 → Properties → Java Build Path → Source

  • Default output folder 定位到 项目名/WebContent/WEB-INF/classes(如 test/WebContent/WEB-INF/classes),没有这个文件夹就自己建立

Step3 启动

点击小猫 Start Tomcat,如果程序没错就可以在 http://localhost:8080/test 下测试了

>>>Eclipse Tomcat插件的配置,及 Tomcat 的配置 ( 谁来教我?)
>>>eclipse+tomcat插件开发web项目
>>>eclipse3.6安装tomcat插件3.3
>>>把ECLIPSE项目部署到TOMCAT插件上的问题


CentOS 6.X 哈工大源

31 Jan 2013

由于正常 CentOS 源不在教育网免费 IP 列表里,或者使用 VPN,或者更换自己的源,下面提供 哈尔滨工业大学 自己的源,我这里用的是 EL6.3

Step1

1 $ touch CentOS-Base.repo

编辑 CentOS-Base 添加:

# CentOS-Base.repo
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-$releasever - Base
baseurl=http://run.hit.edu.cn/centos/6.3/os/$basearch/
gpgcheck=1
gpgkey=http://run.hit.edu.cn/centos/RPM-GPG-KEY-CentOS-6

#released updates 
[updates]
name=CentOS-$releasever - Updates
baseurl=http://run.hit.edu.cn/centos/6.3/updates/$basearch/
gpgcheck=1
gpgkey=http://run.hit.edu.cn/centos/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://run.hit.edu.cn/centos/6.3/extras/$basearch/
gpgcheck=1
gpgkey=http://run.hit.edu.cn/centos/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://run.hit.edu.cn/centos/6.3/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://run.hit.edu.cn/centos/RPM-GPG-KEY-CentOS-6

Step2

替换系统的默认 repo:

1 $ sudo mv CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo

Step3

1 # 清除暂存中旧的 rpm 头文件和包文件
2 $ sudo yum clean all
3 # 把服务器的包信息下载到本地电脑缓存起来
4 $ sudo yum makecache
5 # 更新所有的 rpm 包
6 $ sudo yum update

下面就可以正常安装软件了,我要 screen,expect


Hadoop-1.x mapred-site.xml 参数设定

29 Jan 2013

平台环境

  • CentOS 6.X
  • JDK 1.7
  • Hadoop 1.0.4

参照 mapred-default.xml

JobTracker

mapred.job.tracker

预设值 : local
说明 : 设定 jobtracker 的 hostname 及 port。预设是 local,表示所有的 job 会用 local job runner 来执行,而且只有一个 mapper 及一个 reducer。在这个设定下,如果要启动 jobtracker service 反而会出错。一般常看到的设定是 localhost:9001。不过跟 core-site.xml 里的 fs.default.name 一样,会建议用 hostname 来设定。

mapred.job.tracker.http.address

预设值 : 0.0.0.0:50030
说明 : jobtracker Web UI 用的 port。除非是为了 security 的考虑才会需要改 binding 的 IP/Port,不然不需要改这个值。

mapred.system.dir

预设值 : ${hadoop.tmp.dir}/mapred/system
说明 : 在 HDFS 上的资料夹,放所有 M/R jobs 相关的控制信息,一个正在执行的 M/R job 会在这个目录里建立一个子目录。

mapred.temp.dir

预设值 : ${hadoop.tmp.dir}/mapred/temp
说明 : 在 HDFS 上一个共享的资料夹,放所有 M/R 相关的暂存资料

mapred.local.dir

预设值 : ${hadoop.tmp.dir}/mapred/local
说明 : 在 tasktracer 上存放暂存资料的目录。跟 hdfs-site.xml 里的 dfs.data.dir 设定一样,指定多个目录(volumes) 可用 “,” 以加快存取速度。如果有使用 distributed cache 的話,档案也会放在这个位置。

mapred.hosts

预设值 : N/A
说明 : 跟 hdfs-site.xml 里的 dfs.hosts 一样。此值是指定一个档案位置,名字可自取,例如 : /etc/hadoop/conf/mapred-hosts,并列出所有可以连接 jobtracer 的机器清单。不在清单上的机器是没有权限的。

mapred.hosts.exclude

预设值 : N/A
说明 : 跟 hdfs-site.xml 里的 dfs.hosts.exclude 一样。当需要淘汰或移除多台机器的 tasktracer 时会用到。一般来说,为了 data locality 的考虑,一台机器上会同时起 datanode 和 tasktracer。在淘汰时也需要同时停掉这些 services。所以方便起见,dfs.hosts 和 mapred.hosts 会共用同一个档案,dfs.hosts.exclude 和 mapred.hosts.exclude 也会共用同一个档案。

mapred.jobtracker.restart.recover

预设值 : false
说明 : 设成 true 可以让 jobtracker 重启的时候自动恢复之前执行到一半的 M/R jobs,可是这个功能在 Cloudera CDH3 中并无法正常运作。可以参考 Cloudera 的 Known issues JobTracker recovery does not work after a restart.

mapred.jobtracker.completeuserjobs.maximum

预设值 : 100
说明 : 在 jobtracker 内存中保存已完成的 job 个数,并让使用者方便在 jobtracker UI 上查询。如果超过 100 个 jobs ,就会写入 disk 并放到 job history 中。这个设定是依每个使用者而设的,所以使用者多而且 job 数也多的情况会造成 jobtracker 使用太多的内存,可能会导致常做 full GC 或 OOME。建议可以只设 10。

mapred.jobtracker.taskScheduler

预设值 : org.apache.hadoop.mapred.JobQueueTaskScheduler
说明 : 做 M/R job 调度所使用的 scheduler。

mapred.job.tracker.handler.count

预设值 : 10
说明 : 设定 jobtracker server threads 的数量,这些 threads 会用 RPC 跟其他的 tasktrackers 沟通。跟 hdfs-site.xml 里的 dfs.namenode.handler.count 一样,设的值越高表示 jobtracker 吃的内存也随着增加。在官方文件里的建议值是全部 tasktracer 数量的 4%。以个人经验来说,如果 jobtracker 机器配备跟 namenode 同级,那 dfs.namenode.handler.count 及 mapred.job.tracker.handler.count 的设定可用一样,100 个 nodes 配 100 个 threads。

job.end.notification.url

预设值 : N/A
说明 : 当一个 job 执行完毕,不管成功或失败,jobtracker 会根据这个设定送出一个 http request 通知指定的 url。例如: http://localhost:8080/jobstatus.jsp?jobId=$jobId&jobStatus=$jobStatus。$jobId 和 $jobStatus 是内建的参数,jobtracker 会把这个两个值转成实际执行的 job id 和 status。jobstatus.jsp 是自己实现的程序,里面可以依据传来的 job id 再回 jobtracker 查训更多的信息并导入到不同的 logging system。对于做 M/R job monitoring(监控) 非常好用,不需要一直 polling jobtracker 来得知现有 job 执行的状态。

mapreduce.jobtracker.keytab.file

预设值 : N/A
说明 : 当 core-site.xml 里的 hadoop.security.authentication 参数设为 “kerberos” 时就要指定 keytab 的位置。例如 : /etc/hadoop/conf/mapred.keytab。

mapreduce.jobtracker.kerberos.principal

预设值 : N/A
说明 : 指定 kerberos principal 名称,这在产生 keytab 档案时会指定,一般常用的命名规则是 mapred/_HOST@KERBEROS-REALM.COM

TaskTracker

mapred.task.tracker.http.address

预设值 : 0.0.0.0:50060
说明 : tasktracker Web UI 用的 port。除非是为了 security 的考虑才会需要改 binding 的 IP/Port,不然不需要改这个值。

mapred.child.java.opts

预设值 : -Xmx200m
说明 : tasktracer 会依每个要执行的 java task 启动独立的 child process,这个值可以设定每个 process 的 JVM 参数。例如: 要增加 heap size 及 gc log 的话可以改成

-Xmx1024m -verbose:gc -Xloggc:/var/log/hadoop/task-gc-taskid.log

taskid 是内建的参数,tasktracer 会把这个值转成实际执行的 task id。
各 app 也可在 submit job 之前,依据自己的需求调整这个设定。

mapred.child.ulimit

预设值 : N/A(kb)
说明 : 设定最大的虚拟内存使用量。跟 mapred.child.java.opts 不太一样,mapred.child.java.opts 所设定的 -Xmx 只是 tasktracer 所启动的 java child process 所用的 heap size,但 mapred.child.ulimit 所设定的包括 child process 本身及其所启动的其他 sub process 的内存总和。建议这个值的大小应为 mapred.child.java.opts 指定的 2~3 倍。例如: 在 mapred.child.java.opts 设定 1G,则 mapred.child.ulimit 设为 3G。
不然,在 task 执行期间可能会出现以下的错误信息,虽然看起來是 warning,但已经表示 JVM 没启动成功。

2012-07-29 10:57:28,199 INFO org.apache.hadoop.mapred.JvmManager: JVM : jvm_201207291054_0001_m_1994801458 exited with exit code 134. Number of tasks it ran: 0
2012-07-29 10:57:28,200 WARN org.apache.hadoop.mapred.TaskRunner: attempt_201207291054_0001_m_000005_3 : Child Error
java.io.IOException: Task process exit with nonzero status of 134.
        at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:227)

因为这个参数比较敏感,应该要由系统管理者指定适合的值并设为 final,也就是不允许使用者自己修改。让这个值为空,并直接修改系统 limits.conf 也是一个解决方式。

tasktracker.http.threads

预设值 : 40
说明 : tasktracer http server 所使用的 thread 数量,主要是让 reducer 在 shuffle 阶段取得 mapper 的中间产出。这是一个全局的变量,并不能依据各自的需求做修改。一般来说,在小的 cluster 里保持原来设定即可。越大的值所使用的内存也会相对增加,但效果不见得显著。在 Apache 官网上的测试报告,2000 个 nodes 也只设定到 50 而已。

mapred.tasktracker.map.tasks.maximum

预设值 : 2
说明 : tasktracer 可同时执行的 mapper 数量。一般来说,设定的值会依 CPU core 数而定。例如: 一台机器有 8 core CPU,一个 core 跑两个 processes,可使用的数量是 8×2-2=14 (要减掉 datanode 及 tasktracer 使用的 slot 数),则 mapper 及 reducer 数量可设为 7。要注意的是,设的值越高不见得是好事,除了 CPU utilization 之外,内存使用量也是考虑因素之一。假设 datanode 使用 1G,tasktracker 也用 1G,mapper 及 reducer 都用预设值 200 MB。那总内存使用量是 1000+1000+14×200=4800(MB)。因此要看机器的规格来决定。

mapred.tasktracker.reduce.tasks.maximum

预设值 : 2
说明 : tasktracer 可同时执行的 reducer 数量。基本的配置和 mapred.tasktracker.map.tasks.maximum 一样。有个可以考虑的点是,在执行 M/R job 里有许多是只有 mapper 不需要 reducer 的,例如 HBase import/export。所以可以视需求加大 mapper 的个数并减少 reducer 的个数。

mapred.map.max.attempts

预设值 : 4
说明 : 当 mapper 失败时 tasktracer 重试此 mapper 的次数。在一个很大的 cluster 里,mapper 或 reducer 失败不一定是程序逻辑出错,有可能是网络出问题造成短时间的 timeout。常遇到的状况是重新执行一次就好了。一般来说不需要特别改这个值。

mapred.reduce.max.attempts

预设值 : 4
说明 : 同上,差别只在设的是 reducer 的重试次数。

mapred.max.map.failures.percent

预设值 : 0
说明 : 设 0 表示不能有任何一个 mapper 失败,不然整个 job 会失败。如果在 M/R jobs 里不需要这么高的容错率,允许 100 个 mapper 里失败 5 个也算 job 执行成功,那可以把这个值设为 5/100 = 5%。

mapred.max.reduce.failures.percent

预设值 : 0
说明 : 同上,差别只在设的是 reducer 的失败百分比。

mapred.map.tasks.speculative.execution

预设值 : true
说明 : 决定是否开启 mapper 的推测性执行(Speculative Execution)。一般来说,假设一个 job 有 100 个 mappers,其中 99 个很快就完成,剩最后一个非常的慢,系統还是会等到他完成整个 job 才算結束。会慢的原因可能是硬件有问题,网络不稳或程序写的不够好。但这不是 Hadoop 本身要处理的问题。Hadoop 能做的是,在另一个 tasktracer 上执行同样的 mapper,先执行完的 mapper output 会传給 reducer,比较慢而没有执行完的 mapper 会自动被所属的 tasktracer 杀掉。要注意的是,被杀掉的 task 数也会被计算在 mapred.reduce.max.attempts 里。

推测性执行并不是为了做平行运算用的,原本的 mapper 及推测性 mapper (speculative mapper) 也不会同时被执行。判断是否会启动另一个 speculative mapper 的理由是当原本的 mapper 执行超过某个特定时间(至少一分钟),而且原本的 mapper 长时间没有回报任何新的进度才会被执行。这也不是让程序可靠度提升的正确方式,如果发现原本的程序逻辑有错造成某些 mappers 执行较慢,应该以改程序为主。另外,如果发开者没有想到推测性执行的可能性,可能同样的 mapper 读写同一份资源造成 race condition。

在 production 的环境会有大量的 M/R job 在执行,建议的做法是设为 false,不要让系统消耗过多的资源去执行多余的 mapper。由 client 来决定是否使用推测性执行会比较好。

mapred.reduce.tasks.speculative.execution

预设值 : true
说明 : 同上,差别只在设的是 reducer 的推测性执行。

mapred.reduce.slowstart.completed.maps

预设值 : 0.05
说明 : 当一个 job 里的 mappers 数完成 5% 的时候开始执行 reducers。例如: 有 100 个 mappers 的情况,只要做完 5 个 mappers 就开始执行 reducers。

下面讨论两个极端的状况

  • 0: 表示 reducers 会立即执行。一般来说不会这样设定,reducers 还是会等待 mapper 执行完。
  • 1: 会等到所有的 mappers 执行完才开始执行 reducers。这很容易因为某个 mappers 执行较慢而拖慢整个 job 的执行时间。

client app 也可依据各自的需求修改这个参数。建议可设为 0.75,也就是 3/4 的 mappers 执行完后就执行 reducers。

mapred.compress.map.output

预设值 : false
说明 : 决定 mapper 的 output 是否要压缩。一般来说,性能的瓶颈大部分是在 IO,而不是 CPU。所以大型的 cluster 来说最好设为 true,可以减少 mapper 的资料写入 disk 的时间,节省暂存档的空间,减少网络传输量,及把资料传给 reducer 的时间。

mapred.map.output.compression.codec

预设值 : org.apache.hadoop.io.compress.DefaultCodec
说明 : 如果 mapred.compress.map.output 设为 true,则会用这个 codec 来执行压缩。一般常见的压缩格式:

  • deflate: org.apache.hadoop.io.compress.DefaultCodec,已内建
  • gzip: org.apache.hadoop.io.compress.GzipCodec,已内建
  • bzip2: org.apache.hadoop.io.compress.BZip2Codec,已内建
  • lzo: com.hadoop.compression.lzo.LzoCodec,因为 lzo 是 GPL license,Apache 或 Cloudera 的版本没有内建 ,需要自行装 lzo package
  • snappy: org.apache.hadoop.io.compress.SnappyCodec,Cloudera 的版本已经有内建这个 codec

io.sort.factor

预设值 : 10
说明 : 当 mappers 计算完成如果有产出,就会先写入一段 memory buffer(预设是 100 MB), buffer 达到 80% (定义在 io.sort.spill.percent 里) 之后就会写入 disk,并产生一个 spill file。当 mapper 写出的资料量大就有可能产生多个 spill files。在执行完成交給 reducer 之前会先进入合并及排序的阶段,多个 spill files 会合并为单一且排序过的档案。这个值就是设定一次合并的档案数。例如: 有 50 个 mapper spill files,预设值是 10 的情况下,就会有 5 次合并的动作并产生 5 个中介档,然后再多一次合并动作把 5 个中介档合并为一个。加大这个值可以有效的减少合并的次数及产生的中介档案,不过所需的内存也相对变大。以 Cloudera 的建议可以在 production 环境改成 25 或 32。

io.sort.mb

预设值 : 100(mb)
说明 : 这是在 io.sort.factor 里说明的 memory buffer,越大的值也表示所产生的 spill files 会越少。但相对的使用的内存会增加,大档案做合并及排序也不见得比较快。还有一个地方要注意,假设 mapred.child.java.opts 里定义的 heap size 为 1024 MB,io.sort.mb 是 100 MB,则 client 的 mapper 就只剩 924 MB 可以用。建议可以设到 320。使用者也可以依需求在 submit jobs 之前自行调整。

mapreduce.tasktracker.keytab.file

预设值 : N/A
说明 : 当 core-site.xml 里的 hadoop.security.authentication 参数设为 “kerberos” 时就要指定 keytab 的位置。例如 : /etc/hadoop/conf/mapred.keytab

mapreduce.tasktracker.kerberos.principal

预设值 : N/A
说明 : 指定 kerberos principal 名称,这在产生 keytab 档案时会指定,一般常用的命名规则是 mapred/_HOST@KERBEROS-REALM.COM

>>Hadoop 參數設定 – mapred-site.xml


Hadoop-1.x hdfs-site.xml 参数设定

27 Jan 2013

平台环境

  • CentOS 6.X
  • JDK 1.7
  • Hadoop 1.0.4

参照 hdfs-default.xml

NameNode

dfs.name.dir

预设值 : ${hadoop.tmp.dir}/dfs/name
说明 : 指定本机上存取 fsimage 及 editlog 的目录,这个目录非常的重要,如果损毁就无法存取 HDFS 的资料了,所以不建议放在 ${hadoop.tmp.dir} 目录下。更好的做法是用 “,” 指定多个目录,Hadoop 会复制 fsimage 的资料到所有的目录下,如果其中一个目录损毁 Hadoop 会自动使用正常的目录并把对的资料再复制到损毁的目录下。
指定多个目录后在 HDFS portal 会看到多个目录,正常状况会是 Active,当损毁时会变成 Inactive

dfs.namenode.logging.level

预设值 : info
说明 : 这个值是指定 namenode 的 logging level。其他的值有:

  • dir : 看 namenode server 的变化
  • block : 看 blocks 新增刪除或 replication 的变化
  • all : 显示全部的 log

除非是为了 debug,不然不建议用其他的等級,会造成 Hadoop 的 log 档案太大。

dfs.http.address

预设值 : 0.0.0.0:50070
说明 : Web UI 用的 port。除非是为了 security 的考量才会需要改 binding 的 IP/Port,不然不需要改这个值。

dfs.https.enable

预设值 : false
说明 : namenode 预设并没有启动 https,在设定 https 的 IP/Port 之前要先确定这个值设为 true。

dfs.https.address

预设值 : 0.0.0.0:50470
说明 : Web UI 用的 port,用 https protocol。除非是为了 security 的考量才会需要改 binding 的 IP/Port,不然不需要改这个值。

dfs.replication

预设值 : 3
说明 : 预设 blocks 的备份数量。如果不需要太多的备份或 cluster 比较小,可以改为 2。Client 端也可以根据使用状况自行更改这个值。只是如果所设的值小于 dfs.replication,在执行 hadoop fsck 指令时会看到这个 block 被标示为 Under-Replicated Blocks。至于备份的机制可以参考 Hadoop1.x core-site.xml 参数设定 里的 topology.script.file.name 说明。

dfs.replication.min

预设值 : 1
说明 : 不需要特别改这个值。因为并不是所有在 HDFS 上的资料都需要有 3 份备份,这可以由 client 来決定。如果对资料备份非常敏感可以把这个值设为跟 dfs.replication 一样。

dfs.replication.max

预设值 : 512
说明 : 因为 client 可以自行决定每个 block 要有几份备份,为了怕误操作导致备份过多而影响整個 cluster 的使用量,建议给一个小一点的值,例如 10。

dfs.block.size

预设值 : 67108864(byte)
说明 : 预设每个 block 是 64MB。如果确定存取的档案都很大可以改为 134217728(128MB)。Client 也可自行决定要使用的 block size 而不需要更改整个 cluster 的设定。

1 $ hadoop fs -D dfs.block.size=134217728 -put local_name remote_location

dfs.safemode.threshold.pct

预设值 : 0.999f
说明 : Hadoop 在启动时预设会进入 safe mode,也就是只读模式,这时是不能写入资料的。只有当 99.9% 的 blocks 达到最小的 dfs.replication.min 数量(预设是 1)才会离开 safe mode。在 dfs.replication.min 设的比较大或 data nodes 数量较多时会等比较久。

下面讨论两个极端的状况:

  • 设为大于 1 : 表示永远不会离开 safe mode,这在当 Hadoop cluster 需要做 migration 时很好用,既可继续提供读取服务,又可防止使用者写入资料导致 migration 不完全。
  • 设为 0 : 表示不会启动 safe mode。在 local 测试时会非常的方便,不然常常需要等一段时间或直接执行下面才能离开 safe mode。
1 $ hadoop dfsadmin -safemode leave

dfs.hosts

预设值 : N/A
说明 : 预设不指定的状况下,只要 datanodes 在 hdfs-site.xml 指定 namenode,在 mapred-site.xml 指定 jobtracker 的位址就可以加入这个 cluster。但是为了安全的考虑,系统管理者可能要决定只有特定的 nodes 可以加入。此值是指定一个档案位置,名字可自取,例如 : /etc/hadoop/conf/dfs-hosts,并列出所有可以连接 namenode 的机器清单。不在清单上的机器是没有权限的。在 mapred-site.xml 里也有个类似的值 mapred.hosts 来指定可以连 jobtracker 的机器清单。

dfs.hosts.exclude

预设值 : N/A
说明 : 当需要淘汰或移除多台机器时会用到。理论上一台机器无预期的宕机,Hadoop 会侦测并把该机器上的 blocks 搬到其他的 datanodes 上,并不需要系统管理员做额外的动作。但是停掉多台机器的情况下是有风险的,假设备份个数为 3 并停掉三台机器,则有一定的机率某些 blocks 正好只在这三台机器上,移掉之后资料也救不回来了。正确的做法是先告诉 namenode 这些机器将被移除,让 namenode 把上面的资料全部备份到其他的 datanodes 上,再进行停机。跟 dfs.hosts 一样,指定一个档案位置,名字可自取,例如 : /etc/hadoop/conf/dfs-exclude-hosts,并列出所有需淘汰的机器清单。设定后要执行以下的指令通知 namenode 做搬资料的动作。

1 $ hadoop dfsadmin -refreshNodes

进度可以在 Web UI 上看到,当该 datanodes 的状态显示为 Decommissioned 表示可以安全的移除机器了。

dfs.support.append

预设值 : false
说明 : 指定是否可在 HDFS 原有档案內容之后加入新资料。看 hfds-default.xml 里对这个参数的说明是有 bug “This is currently set to false because there are bugs in the ‘append code’ and is not supported in any prodction cluster.”。但是 HBase Configuration 里另外说明了以上的咨询是过时的,在 Cloudera 及 MapR 的版本都已经加入了这个功能。如果有使用 HBase,为了避免资料遗失,请把这个值设为 true。

dfs.namenode.handler.count

预设值 : 10
说明 : 设定 namenode server threads 的数量,这些 threads 会用 RPC 跟其他的 datanodes 沟通。当 datanodes 数量太多时会发现很容易出現 RPC timeout,解决方法是提升网络速度或调高这个值,但要注意的是 thread 数量多也表示 namenode 吃的内存也随着增加。在 Hadoop Cluster Setup 这篇文章里提到 900 个 nodes 只需要设成 40,但是个人经验是 100 个 nodes 配 100 个 threads。

dfs.namenode.keytab.file

预设值 : N/A
说明 : 当 core-site.xml 里的 hadoop.security.authentication 参数设为 “kerberos” 时就要指定 keytab 的位置。例如 : /etc/hadoop/conf/hdfs.keytab

dfs.namenode.kerberos.principal

预设值 : N/A
说明 : 指定 kerberos principal 名称,这在产生 keytab 档案时会指定,一般常用的命名规则是 hdfs/_HOST@KERBEROS-REALM.COM

Secondary NameNode

dfs.secondary.namenode.keytab.file

预设值 : N/A
说明 : 当 core-site.xml 里的 hadoop.security.authentication 参数设为 “kerberos” 时就要指定 keytab 的位置。例如 : /etc/hadoop/conf/hdfs.keytab

dfs.secondary.namenode.kerberos.principal

预设值 : N/A
说明 : 指定 kerberos principal 名称,这在产生 keytab 档案时会指定,一般常用的命名规则是 hdfs/_HOST@KERBEROS-REALM.COM

DataNode

dfs.data.dir

预设值 : ${hadoop.tmp.dir}/dfs/data
说明 : 指定本机上放 data nodes 资料的目录,如果要指定多个目录(volumes)可用 “,” 分隔。在 production 环境会指定多个,并设定 dfs.datanode.failed.volumes.tolerated。一般来说,多个目录会对应到系统上不同的 partitions,不同的硬盘。设定多个可加快存取速度,及避免硬盘坏掉需要抽换用。

dfs.datanode.address

预设值 : 0.0.0.0:50010
说明 : datanode service 监听的 port,用来传输资料用。除非是为了 security 的考虑才会需要改 binding 的 IP/Port,不然不需要改这个值。

dfs.datanode.http.address

预设值 : 0.0.0.0:50075
说明 : Web UI 用的 port。除非是为了 security 的考虑才会需要改 binding 的 IP/Port,不然不需要改这个值。

dfs.datanode.handler.count

预设值 : 3
说明 : 指定 data node 上用的 thread 数量。在 production 的环境建议调到 100。

dfs.datanode.max.xcievers

预设值 : 256
说明 : 这个值是指定 datanode 可同时处理的最大档案数量。但是预设值很小,当多个或一个大型程序存取时会发生下面的错误讯息

10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.io.IOException: 
No live nodes contain current block. Will get new block locations from namenode and retry... 

以使用 HBase 为例,建议值是 4096。如果还有多个程序存取可再乘 2。

dfs.datanode.failed.volumes.tolerated

预设值 : 0
说明 : 这个值要对应 dfs.data.dir 参数设定的目录个数,0 表示只要有任何一个 volume 坏掉 data nodes 就会被强制停掉。假设挂载 n 个 volumns,Hadoop 会确定 n – dfs.datanode.failed.volumes.tolerated 不能小于 0。设定错误在启动 data node 会看到下面的信息

2011-08-27 11:53:03,785 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: org.apache.hadoop.util.DiskChecker$DiskErrorException: Invalid value for validVolsRequired : -1 ,  Current valid volumes: 1
        at org.apache.hadoop.hdfs.server.datanode.FSDataset.<init>(FSDataset.java:906)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:373)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:282)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1544)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1484)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1502)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1627)
        at org.apache.hadoop.hdfs.server.datanode.SecureDataNodeStarter.start(SecureDataNodeStarter.java:103)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:177)

如果 data volumns 有 4 个,dfs.datanode.failed.volumes.tolerated 可设为 2。表示当有 2 个硬盘坏掉时 data nodes 还是可以正常运作。这时只要换坏硬盘即可,并不需要停掉 data nodes。

dfs.datanode.data.dir.perm

预设值 : 700
说明 : 这个值是设定 data node 写资料到 local disk 上的权限。使用 POSIX 表示法。在 production 上为了 security 考虑,不建议改这个参数。如果是测试环境为了方便其他 users 用工具分析资料,可以改成 755。

dfs.datanode.du.reserved

预设值 : 0(byte)
说明 : 预设值表示 data nodes 会使用整个 volumns,写满之后会导致无法再写入 M/R jobs 或启动 data nodes 时的暂存档。如果还有其他程序共用这些目录也会受到影响。建议保留至少 1073741824(1G) 的空间。

dfs.datanode.keytab.file

预设值 : N/A
说明 : 指定 kerberos principal 名称,这在产生 keytab 档案时指定,一般常用的命名规则是 hdfs/_HOST@KERBEROS-REALM.COM

dfs.namenode.kerberos.principal

预设值 : N/A
说明 : 当 core-site.xml 里的 hadoop.security.authentication 参数设为 “kerberos” 时就要指定 keytab 的位置。例如 : /etc/hadoop/conf/hdfs.keytab

dfs.datanode.kerberos.principal

预设值 : N/A
说明 : 指定 kerberos principal 名称,这在产生 keytab 档案时指定,一般常用的命名规则是 hdfs/_HOST@KERBEROS-REALM.COM

Etc

dfs.balance.bandwidthPerSec

预设值 : 1048576(byte)
说明 : 这个值是决定 file blocks 从一个 data node 搬到另一个 data node 的速度, 预设为 1MB。主要是用在 re-balance,如果觉得执行速度太慢可以调整这个参数加快 blocks 的搬移。但是这也表示会多占带宽,可能会影响正常 M/R jobs 或 applications 的执行。建议值为 4194304(4MB)

>>Hadoop 參數設定 – hdfs-site.xml


Hadoop-1.x core-site.xml 参数设定

25 Jan 2013

平台环境

  • CentOS 6.X
  • JDK 1.7
  • Hadoop 1.0.4

参照 core-default.xml

fs.default.name

预设值 : file:///
说明 : 设定 Hadoop namenode 的 hostname 及 port,预设是 Standalone mode,如果是 Pseudo-Distributed mode 要指定为 hdfs://localhost:9000,但是这个缺点是只有在本机才能操作,从其他机器不能连。建议可直接使用 Cluster mode,指定 hdfs://hostname:9000。但是 Hadoop 是依据 hostname 去做 ip binding,所以要注意 /etc/hosts 里 hostname 不能对应到 127.0.0.1,要对应实际的 ip。

hadoop.tmp.dir

预设值 : /tmp/hadoop-${user.name}
说明 : Hadoop 存放暂存档案的目录,会根据 user account 在此目录下开不同的子目录。但是放在预设的 /tmp 下可能会有一个问题,一般在 Centos 会 enable tmpwatch,tmpwatch 会定期把 /tmp 下沒用到的档案砍掉,如果不希望系统做这件事,可以 disable tmpwatch 或把 hadoop.tmp.dir 指到不同的目录下。

fs.checkpoint.dir

预设值 : ${hadoop.tmp.dir}/dfs/namesecondary
说明 : secondary namenode 存放暂存档案的目录,如果有多个目录可用“,”隔开。设定多个目录的好处是 Hadoop 会把 temp image files 分别写到指定的多个目录,以避免其中一份资料坏掉。seconary namenode 相关的设定不一定需要,甚至在 Hadoop cluster 可以不需要起 secondary namenode。但重起 namenode 时也会做 file merge,当档案很大时,重起的时间会非常的长。为了减少 downtime,建议在 production site 都会启动 secondary namenode。而且要起在跟 namenode 不同的机器,以保证当 namenode 硬碟坏掉的時候,还可以从 secondary namenode 上把资料备份回来。

fs.checkpoint.period

预设值 : 3600(秒)
说明 : 控制 secondary namenode 的 checkpoint 时间间隔。如果距离上次 checkpoint 的时间大于這个参数设定的值,就会触发 checkpoint。secondary namenode 会把 namenode 的 fsimage 和 editlog 做 snapshot。如果存取 Hadoop 的次数频繁或为了减少重起 namenode 的 downtime,可以把这个值设小一点。

fs.checkpoint.size

预设值 : 67108864(byte)
说明 : 如果 Hadoop 非常的忙碌,editlog 可能会在短时间內长的很大,fs.checkpoint.period 的设定不见得可以完全预测这个状况,所以保险的做法会多设定这个值,以保证当档案大到超过 fs.checkpoint.size 的值也会触发 checkpoint。

io.file.buffer.size

预设值 : 4096(byte)
说明 : 这是读写 sequence file 的 buffer size, 可减少 I/O 次数。在大型的 Hadoop cluster,建议可设定为 65536 到 131072。

ipc.client.connection.maxidletime

预设值 : 10000(毫秒)
说明 : 设定 Hadoop client 连线时最大的闲置时间,预设是 10 秒。如果 Hadoop cluster 的网络连线不稳,可以把這個值設到 60000(60秒)。

ipc.server.tcpnodelay

预设值 : false
说明 : 在 Hadoop server 是否启动 Nagle’s 演算法。设 true 会 disable 这个演算法,关掉会减少延迟,但是会增加小封包的传输。server site 不太需要设定这个值。

ipc.client.tcpnodelay

预设值 : false
说明 : 在 Hadoop client 是否启动 Nagle’s 演算法。设 true 会 disable 这个演算法,关掉会减少延迟,但是会增加小封包的传输。client site 建议把这个值设 true。

hadoop.security.authorization

预设值 : false
说明 : 是不是要开启 service-level 帐号验证机制,开启之后 Hadoop 在执行任何动作之前都会先确认是否有权限。详细的权限设定会放在 hadoop-policy.xml 里。例如要让 fenriswolf 这个 account 及 mapreduce group 可以 submit M/R jobs,要设定 security.job.submission.protocol.acl。

1 <property>
2 	<name>security.job.submission.protocol.acl</name>
3 	<value>fenriswolf mapreduce</value>
4 </property>

hadoop.security.authentication

预设值 : simple
说明 : simple 表示沒有 authentication,Hadoop 会用 system account 及 group 来控管权限。另外可以指定为 kerberos,这部分相对比较复杂,要有一个 kerberos server 并产生 account keytab,在执行任何操作前 client 要先用 kinit 指令对 kerberos server 认证,之后的任何操作都是以 kerberos account 来执行。

hadoop.kerberos.kinit.command

预设值 : N/A
说明 : 如果 hadoop.security.authentication 设为 kerberos 就要多设这个参数指定 Kerberos kinit 指令的路径。在 CentOS 装 krb5-workstation package 后预设安装路径为 /usr/kerberos/bin/kinit。

fs.trash.interval

预设值 : 0(分)
说明 : 清掉垃圾筒的时间。预设是不清, 所以在刪除资料时要自己执行

hadoop fs -rm -skipTrash 或 hadoop fs -expunge

来清除垃圾筒的资料,但是强制用 -skipTrash 会造成误刪的资料救不回来,user 也常常会忘记做 -expunge 而造成 Hadoop 空间不会释放。建议可以设为 1440 让 Hadoop 每天清除垃圾筒。

topology.script.file.name

预设值 : N/A
说明 : 实现 Hadoop Rack Awareness 的机制,指定一个可执行档,input 会是一组 hostname 或 ip,回传值是 rack name 清单。不指定的情況下,Hadoop 会预设所有的 node 都在同一个 rack 之下。
以下是一个 python 的范例,不过用 shell script 或其他语言写也可以

#!/usr/bin/python

import sys
from string import join

DEFAULT = '/dc/rack0';

RACK_MAP = {
    '10.1.113.37' : '/dc/rack1',
    'hadoop-worker01' : '/dc/rack1',
    
    '10.1.113.77' : '/dc/rack1',
    'hadoop-worker02' : '/dc/rack1',
    
    '10.1.113.45' : '/dc/rack2',
    'hadoop-work03' : '/dc/rack2',
    
    '10.1.113.48' : '/dc/rack2',
    'hadoop-work04' : '/dc/rack2',
  }

if len(sys.argv) == 1:
    print DEFAULT
else:
    print join([RACK_MAP.get(i, DEFAULT) for i in sys.argv[1:]]," ")

一个非常大的 Hadoop cluster 可能会跨多个 data centers,每个 data center 会有多个 racks,每个 rack 有多个 nodes。假设 Hadoop replication number 设 3,在 Hadoop 做 replication 时会根据这个设定,第一份资料放在 local node,第二份资料放在另一个 rack 的某个 node,第三份资料会放在与第二份同个 rack 但不同的 node 下。当网络设定有问题或断线时,某一个 rack 可能会全部不见,放在不同的 rack 可以保证仍然能存取到资料。为了增加网络的容错能力,一般都会设定这个 script。
如果在 cluster 已经有资料的情况下才设定 rack topology,可以用 hadoop balancer 指令让所有的 blocks 重新分配

topology.script.number.args

预设值 : 100
说明 : 每次传給 topology.script.file.name script 的参数个数。如果 Hadoop node 个数过多,topology.script.file.name script 会被执行多次,一次传入 100 个参数

hadoop.native.lib

预设值 : true
说明 : 预设 Hadoop 会去找所有可用的 native libraries 并自动 load 进来使用,例如压缩类的 libraries 像 GZIP, LZO 等等。会设成 false 的原因通常是为了 debug,Hadoop 会把 native libraries 换成相对应的 java 实现方式来执行,例如 GZIP,以方便使用者检测 libraries 是否执行错误。但是 LZO 这类的 libraries 并没有 java 实现,所以还是会 call native libraries 来做压缩,也就沒有 debug 的效果了。详细的压缩格式类型会在 mapred-site.xml 的设定时再介绍。

>>Hadoop 參數設定 – core-site.xml


<< Previous Page Next Page >>
Fork me on GitHub