在hadoop生态系统中,hadoop核心包括了hdfs以及mapreduce.
hadoop的一些设计机制
机架感知rack-aware
使得master能够获取整个集群的基于网络ip地址或者主机名的分布图。
通过一个脚本实现,脚本耦合少,参数只有网络ip地址或者主机名。
相关配置项 topology.script.file.name
health-checker健康检查的模块
类似hadoop这种组件繁多的生态系统,精简耦合是必须的,这个检查模块做得真是很小巧,
它只通过脚本的返回的结果中有没有ERROR这个字符串来判断健康状态。
相关配置项 yarn.NM.health-checker 开头的都是
slaves节点
slaves节点都写在一个slaves文件里一行一个.
配置文件的更新
每当有配置文件的更新我们都必须手动复制这些配置文件到每一个节点,然后利用bin目录下面以refresh开头的命令来刷新,有时可能会出现一些问题,
严重的是可能还要重启服务。这要是发生在生产环境中绝对是很可怕的事。
native库
为了提高性能(毕竟是java写的),hadoop默认使用native库来操作文件,native库要自己编译。其实就是一个so动态库,如果没有这个文件会自动切换为java运行。
相关配置项 io.native.lib.available
日志功能
hadoop有自带日志聚合功能,能够把日志聚合起来,你也可以禁用。这样日志就会分散到各个节点.
各个节点使用hostname而不是ip
在dns里修改解析很快,hostname一般也不需要更改.
Hadoop IPC
Hadoop IPC 是一个hadoop内部的rpc方案,是一个简洁的,低消耗的RPC机制。 提供更精确控制连接,超时,缓存等的能力。
uber task模式。
这个模式是为了限制mapreduce过程占用的hadoop资源。可以使用
maxmaps, maxreduces, 和maxbytes 来设置。其中maxbytes指输入的文件大小
container-executor
在yarn里边,mr工作将会在每个节点上的container中执行。这个container设计上来说类似资源分割系统,但是目前只有内存分割的功能。
container的运行状态和生命周期由nm管理,rm负责调度。
Secondary NameNode,Checkpoint Node,backup node
Secondary NameNode定期合并fsimage和edits日志。 控制edits的大小。Checkpoint Node方案与Secondary NameNode的原理基本相同,
在节点上运行 bin/hdfs namenode -checkpoint查看你的配置有没有问题.
backup node利用Hadoop自身的Failover措施,配置一个Backup Node,Backup Node在内存和本地磁盘均保存了HDFS系统最新的名字空间元数据信息。
如果NameNode发生故障,可用使用Backup Node中最新的元数据信息。不过当NameNode发生故障,目前还只能通过重启NameNode的方式来恢复服务。当前版本的Backup Node还不具有热备功能
在节点上运行 bin/hdfs namenode -backup 查看你的配置有没有问题.
启动前必须在节点上格式化namenode 并且保证与主节点上的VERSION文件是一样的。
Checkpoint Node与backup node都是使用下面5个配置:
dfs.namenode.backup.address
dfs.namenode.backup.http-address
dfs.namenode.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
dfs.namenode.checkpoint.dxns
dfs.namenode.checkpoint.check.period 每次通信的间隔时间,默认5分钟
hadoop核心的部署
选用cloudera的 hadoop2.0.0-cdh4.3.0
选用理由:依据cloudera的特色,cloudera知名,有实力,商用性强,生态系统组件完善,且各个组件版本对应正确,文档维护好。
这里 http://archive.cloudera.com/cdh4/cdh/4/ 有一整套的cdh生态系统下载列表。使用前先编译hadoop native library 用cmake编译,
你可能需要设置GENERATED_JAVAH为java home的目录.就看你有没有提示错误了。如果是单独编译,一些头文件放在
jar包里必须自己解压出来。只需要编译libhadoop.so 跟libhdfs.so ,不用编译 yarn 跟 mapreduce1的.
yarn下面有一个c写的container-executor程序
另外,英特尔Hadoop发行版做得也很好,图形界面的的管理非常简单,再此也推荐一下。
英特尔Hadoop发行版免费版本只有50节点,8TB最大数据存储量。
Facebook近日开源了它们的mapreduce框架Corona,也值得一试,看看能否更好满足业务需求。
申请的机器:
192.168.2.21 resourcemanage,namenode ,nodemamage datanode
192.168.2.22 nodemamage datanode
假设你已经安装好了。
配置过程:
配置hadoop一般参考 *.default.xml文件,选择你需要修改的配置项。 *.default.xml文件放在doc目录里
下面是我们用的一些:
核心配置core-site.xml
fs.defaultFS 一个uri格式的字符串,这里是:hdfs://192.168.2.21:9000
hdfs配置hdfs-site.xml
dfs.datanode.dns.nameserver 192.168.2.9 namenode联系各个节点时候需要解析hostname为ip这是一个dns服务器。 在2.9的管理器上添加 21 22的机子
dfs.replication 2 数据保存份数
dfs.datanode.handler.count 10 节点的服务线程数,跟读写工作量有关。
dfs.datanode.data.dir file:///root/cdh/dfs/data datanode存储块数据的文件夹
dfs.namedata.name.dir file:///root/cdh/dfs/name,file:///root/cdh/dfs/name1 namenode存储name表的文件夹 这里存储2份,一个作为备份
dfs.namenode.backup.address 192.168.2.22:50100 backup node的地址
dfs.namenode.backup.http-address 192.168.2.22:50105 backup node的web界面
dfs.namenode.http-address 192.168.2.21:50070 namenode的web界面backup node将从这里下载数据
dfs.datanode.max.xcievers 40960 至少要4096,为了这里设置10倍大小。这个数字是 DataNode 一次最大能够操作的文件数.为将来上线的hbase做好准备。
配置 mapred-site.xml
mapreduce.framework.name yarn 第二代mapreduce框架
mapreduce.jobhistory.address 192.168.2.21:10020
mapreduce.jobhistory.webapp.address 192.168.2.21:19888
mapred.child.java.opts 设置java的运行时选项 当它报一些jvm级别的错误的时候,你需要添加一些选项 比如 class的位置之类的。跟你运行任何java程序的选项是一样的。
mapreduce.job.counters.max MapReduce的计数器,默认120,调高点可以运行比较大的mr运算。
配置 yarn-site.xml
yarn.nodemanager.aux-services mapreduce.shuffle yarn的map过程结束后产生的结果,会被mapreduce.shuffle收集起来reduce。这里aux-services应该可以自己实现。或者有人提供所以单独配置出来。
yarn.nodemanager.aux-services.mapreduce.shuffle.class org.apache.hadoop.mapred.ShuffleHandler ShuffleHandler估计是一个反射,用接口来调用。
yarn.resourcemanager.address 192.168.2.21:8032 RM的连接地址
yarn.resourcemanager.scheduler.address 192.168.2.21:8030 调度接口地址
yarn.resourcemanager.resourc-tracker.address 192.168.2.21:8031
yarn.resourcemanager.admin.address 192.168.2.21:8033 RM的管理地址
yarn.resourcemanager.webapp.address 192.168.2.21:8088 RM的web ui地址 可以用浏览器或者w3m访问的
集群部署过程:
在 slaves文件里面添加21 22机子
将21,22的ssh登录授权文件放到各自的验证目录里,也就是 21 到自身、到22,22到自身、到21的ssh都是不需要输入密码的。如果集群大了,你需要用脚本来完成。
确保21,22的dhcp服务端是开启的。在dhcp服务端里配置 hostname与ip的对应。
格式化namenode
bin/hdfs namenode -format
启动集群
sbin/start-all.sh //这shell脚本已经不推荐使用了。不过我使用是没什么问题的。
启动之后 使用jps可以看到下面的服务
datanode
namenode
NM
secondarynamenode
RM
只有 datanode,NM的是slave,如果少一个服务,你就要看看日志了。
nohup bin/hdfs namenode -backup >/{日志记录目录}/namenodebackup.log 2>&1 > /dev/null & //启动22上面的namenodebackup 服务
实验集群
bin/hadoop fs -ls / 可以看看根目录下面有什么内容 开始应该是空的
从本地复制文件到hdfs 可以使用:bin/hadoop fs -copyFromLocal ~/1.txt /1.txt
然后 bin/hadoop fs -ls / 可以看到1.txt已经在里边了。
运行yarn 的wordcount
bin/hadoop jar examples.jar workcount /1.txt /r
运行成功后目录 /r 下面就会有 _SUCCESS 文件,其它类似part-r-00000的文件是输出结果
bin/hadoop fs -cat /r4/part-r-00000 查看输出结果。
值得一提的是 hadoop文件系统的命令跟linux下面的几乎一样,很容易看懂跟使用。
关闭集群
sbin/stop-all.sh //也不推荐使用了。不知道为什么这样。可能有些集群不需要 mapreduce 功能。