第一章:小朱笔记hadoop之环境配置以及集群部署
第一节.集群环境配置
(1)hadoop部署注意项
(a)hadoop各节点的分布:namenode和jobtracker部署:namenode与jobtracker分离.tasktracker与datanode配对.
(b)Trash: hadoop回收站功能默认是禁止的,删除文件,就是直接删除了,所以要记得配置好trash。当rm后,它会move到当前文件夹下的.Trash目录下,误删文件后,可以恢复文件。参考配置属性fs.trash.interval。
(c)map和reduce任务的JVM选项:mapred.child.java.opts配置map和reduce子进程的JVM属性,如果内存充裕,可以改为 -Xmx2400m.
(d)Tasktracker的map和reducer数量配置: 属性mapred.tasktracker.map.tasks.maximum配置这个tasktracker同时可以最多跑多少个map task,要根据tracker的内存和磁盘情况规划。还有属性mapred.tasktracker.reduce.tasks.maximum配置这个tasktracker同时可以最多跑多少个reduce task.同理也是要根据tracker的内存和磁盘情况规划。例如8核的机器,8个map和8个reducer。map中间结果开启压缩操作(尤其是snappy和LZO)的时候,cpu的负载会比较高,map和reducer的数量可以根据自己的业务情况灵活调节。
(e)缓冲区大小:io.file.buffer.size默认是4KB,作为hadoop缓冲区,用于hadoop读hdfs的文件和写hdfs的文件,还有map的输出都用到了这个缓冲区容量,对于现在的硬件很保守,可以设置为128k(131072),甚至是1M(太大了map和reduce任务可能会内存溢出)。
(2)hadoop配置文件说明
写道
dfs.hosts:记录即将作为datanode加入集群的机器列表
mapred.hosts :记录即将作为tasktracker加入集群的机器列表
dfs.hosts.exclude mapred.hosts.exclude: 分别包含待移除的机器列表
master:记录运行辅助namenode的机器列表
slave:记录运行datanode和tasktracker的机器列表
hadoop-env.sh:记录脚本要用的环境变量,以运行hadoop
core-site.xml:hadoop core的配置项,例如hdfs和mapreduce常用的i/o设置等
hdfs-site.xml: hadoop守护进程的配置项,包括namenode、辅助namenode和datanode等
mapred-site.xml: mapreduce守护进程的配置项,包括jobtracker和tasktracker
hadoop-metrics.properties: 控制metrics在hadoop上如何发布的属性
log4j.properties: 系统日志文件、namenode审计日志、tasktracker子进程的任务日志的属性
(3)hadoop集群配置步骤
采用4台安装Linux环境的机器来构建一个小规模的分布式集群,hadoop采用官网hadoop-1.0.3
注意:一定要建立相同的用户名,ssh需要无密码登录
第二步:安装jdk
下载jdk,安装并配置环境变量
修改/etc/profile:
#jdk配置
JAVA_HOME=/opt/java
JRE_HOME=/opt/java/jre
CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HOME/bin
export JAVA_HOME JRE_HOME CLASSPATH PATH
保存,并执行source /etc/profile
第三步:配置host
/etc/hosts 这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName和IP]用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名(或域名)对应的IP地址。
我们要测试两台机器之间知否连通,一般用"ping 机器的IP",如果想用"ping 机器的主机名"发现找不见该名称的机器,解决的办法就是修改"/etc/hosts"这个文件,通过把LAN内的各主机的IP地址和HostName的一一对应写入这个文件的时候,就可以解决问题。
修改/etc/hosts ,保证100、101、102、103 四台机器 hosts文件相同
192.168.1.100 master
192.168.1.101 slaveA
192.168.1.102 slaveB
192.168.1.103 slaveC
第四步:SSH无密码验证配置
Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。如果只是通过master控制集群的话,就不必配置slave访问master的无密码登录了。
SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端Master复制到Slave上。
master机器:
写道
hadoop@master:ssh-keygen -t rsa
hadoop@master:ssh-add ~/.ssh/id_rsa
hadoop@master:cp ~/.ssh/id_rsa.pub authorized_keys
hadoop@master:cd .ssh
hadoop@master:~/.ssh# chmod 600 authorized_keys
slave机器:
写道
hadoop@slaveA:mkdir .ssh
hadoop@slaveB:mkdir .ssh
hadoop@slaveC:mkdir .ssh
master机器:
写道
hadoop@master:scp ~/.ssh/authorized_keys slaveA:~/.ssh/
hadoop@master:scp ~/.ssh/authorized_keys slaveB:~/.ssh/
hadoop@master:scp ~/.ssh/authorized_keys slaveC:~/.ssh/
第五步:配置hadoop环境
(1)修改/etc/profile:
#hadoop配置
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
(2)配置hadoop-env.sh
# set java environment
export JAVA_HOME=/opt/java
(3)配置core-site.xml文件
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
<description>
NameNode的URI路径,格式:hdfs://主机名:端口/
</description>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
<description>
进行checkpoint的周期时间间隔,单位:秒
</description>
</property>
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
<description>
日志文件达到这个上限值时,将进行一次强制checkpoint操作,单位:byte
</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/var/tmp</value>
<description>
Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,
就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。
/hadoopRun/tmp这里给的路径不需要创建会自动生成。
</description>
</property>
<property>
<name>fs.trash.interval</name>
<value>1</value>
<description>Number of minutes between trash checkpoints.回收站一定要配置的,不然后果很可怕。
If zero, the trash feature is disabled.
</description>
</property>
(4)配置hdfs-site.xml文件
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/opt/hadoop/var/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/opt/hadoop/var/hdfs/data</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/hadoop/conf/excludes</value>
<description>Names a file that contains a list of hosts that are
not permitted to connect to the namenode. The full pathname of the
file must be specified. If the value is empty, no hosts are
excluded.</description>
</property>
(5)配置mapred-site.xml文件
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/opt/hadoop/var/mapred</value>
</property>
(6)修改conf/masters
写道
master
(7)修改conf/slaves
slavesA
slavesB
slavesC
第六步:分发hadoop到所有节点
将配置好的hadoop拷贝到所有的datanode
写道
scp -r /opt/hadoop/ slavesA:/opt/
scp -r /opt/hadoop/ slavesB:/opt/
scp -r /opt/hadoop/ slavesC:/opt/
第七步:格式化hdfs文件系统的namenode
写道
hadoop namenode -format
生产环境都是根据自己的数据类型、集群配置进行定制,这里只是一个简单的demo配置。
生产环境辅助配置以及一些注意事项:
1、配置分发脚本file-dispatcher.sh(简单的分发配置脚本,稍后我会分享供同学们下载)
a、将该脚本放置到hadoop/bin 目录下
b、建立hadoop/conf/configs文件,列入需要分发的配置文件名称。
运行脚本则会自动分发配置到slaves主机的hadoop/conf目录