上次说到FreeBSD下搭建伪分布式,很简单,但是hadoop集群入门最难的可能就是集群的搭建和配置了,配置文件复杂,概念抽象,我尽可能简单描述真实集群的搭建和配置。
hadoop集群从启动进程上来说,分为四种进程,四种,不是四个。在实际应用中,通常每台服务器只启动两种进程。
首先是主节点和任务跟踪器。以下统称为NameNode和JobTracker
主节点在hadoop中叫namenode。负责管理调度集群的运作,跟随主节点的进程叫做jobtracker,负责计算任务的分派和接收。hadoop之所以可以负责大数据量的运算,主要是因为这个分片的概念。比如一个10G的log文件,放在hdfs上,可能你认为他在hdfs上是一个文件,但实际上,这个文件备份成了N多小块,每块保存在不同服务器的物理硬盘上。计算时,任务被分派到每个数据服务器,每个服务器只运算整个数据中的一部分,假设有10台,那么每台被分配1G数据,每个服务器就只运算1G的数据,并将数据返回给jobtracker,最后提供给用户,这样每个服务器的运算速度就都是10G的1/10。计算结果就会比单台快很多。
那么负责分派任务的就是NameNode和JobTracker,而负责数据计算和存储的,就是DataNode和TaskTracker。
也就是说,集群中可以有一台NameNode+JobTracker,但是可以有N多台DataNode和TaskTracker。
整个Hadoop集群的配置在hadoop根目录的conf/可以找到。看一下NameNode+JobTracker的配置,主要在几个xml文件中。
我在基本每个重要的配置项上都标明了注释。
core-site.xml
<?
xml
version
="1.0"
?>
<? xml-stylesheet type ="text/xsl" href ="configuration.xsl" ?>
<!-- Put site-specific property overrides in this file. -->
< configuration >
< property >
< name >fs.default.name </ name >
< value >hdfs://hadoopmaster-177.tj:9000 </ value >
<!--定义hdfs namenode的主机名和端口,本机,主机名在/etc/hosts设置-->
</ property >
< property >
< name >io.compression.codecs </ name >
< value >org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache
.hadoop.io.compress.BZip2Codec </ value >
<!--定义hdfs使用压缩-->
</ property >
< property >
< name >io.compression.codec.lzo.class </ name >
< value >com.hadoop.compression.lzo.LzoCodec </ value >
<!--定义压缩格式和解码器类-->
</ property >
</ configuration >
<? xml-stylesheet type ="text/xsl" href ="configuration.xsl" ?>
<!-- Put site-specific property overrides in this file. -->
< configuration >
< property >
< name >fs.default.name </ name >
< value >hdfs://hadoopmaster-177.tj:9000 </ value >
<!--定义hdfs namenode的主机名和端口,本机,主机名在/etc/hosts设置-->
</ property >
< property >
< name >io.compression.codecs </ name >
< value >org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache
.hadoop.io.compress.BZip2Codec </ value >
<!--定义hdfs使用压缩-->
</ property >
< property >
< name >io.compression.codec.lzo.class </ name >
< value >com.hadoop.compression.lzo.LzoCodec </ value >
<!--定义压缩格式和解码器类-->
</ property >
</ configuration >
hdfs-site.xml
<?
xml
version
="1.0"
?>
<? xml-stylesheet type ="text/xsl" href ="configuration.xsl" ?>
<!-- Put site-specific property overrides in this file. -->
< configuration >
< property >
< name >dfs.name.dir </ name >
< value >/opt/data/hadoop/hdfs/name,/opt/data/hadoop1/hdfs/name,/opt/data/hadoop2/hdfs/name </ value >
<!--定义hdfs namenode所使用的硬盘路径名称-->
< description > </ description >
</ property >
< property >
< name >dfs.data.dir </ name >
< value >/opt/data/hadoop/hdfs/data /opt/data/hadoop1/hdfs/data,/opt/data/hadoop2/hdfs/data </ value >
<!--定义hdfs namenode数据存储的路径-->
< description > </ description >
</ property >
< property >
< name >dfs.http.address </ name >
< value >hadoopmaster-177.tj:50070 </ value >
<!--定义hdfs http管理端口-->
</ property >
< property >
< name >dfs.secondary.http.address </ name >
< value >hadoopslave-189.tj:50090 </ value >
<!--定义备用节点的管理地址-->
</ property >
< property >
< name >dfs.replication </ name >
< value >3 </ value >
<!--定义数据的复制份数,份数越多越安全,但速度越慢-->
</ property >
< property >
< name >dfs.datanode.du.reserved </ name >
< value >1073741824 </ value >
<!--定义du操作返回-->
</ property >
< property >
< name >dfs.block.size </ name >
< value >134217728 </ value >
<!--定义hdfs的存储块大小,默认64M,我用的128M-->
</ property >
< property >
< name >dfs.permissions </ name >
< value >false </ value >
<!--权限设置,最好不要-->
</ property >
</ configuration >
<? xml-stylesheet type ="text/xsl" href ="configuration.xsl" ?>
<!-- Put site-specific property overrides in this file. -->
< configuration >
< property >
< name >dfs.name.dir </ name >
< value >/opt/data/hadoop/hdfs/name,/opt/data/hadoop1/hdfs/name,/opt/data/hadoop2/hdfs/name </ value >
<!--定义hdfs namenode所使用的硬盘路径名称-->
< description > </ description >
</ property >
< property >
< name >dfs.data.dir </ name >
< value >/opt/data/hadoop/hdfs/data /opt/data/hadoop1/hdfs/data,/opt/data/hadoop2/hdfs/data </ value >
<!--定义hdfs namenode数据存储的路径-->
< description > </ description >
</ property >
< property >
< name >dfs.http.address </ name >
< value >hadoopmaster-177.tj:50070 </ value >
<!--定义hdfs http管理端口-->
</ property >
< property >
< name >dfs.secondary.http.address </ name >
< value >hadoopslave-189.tj:50090 </ value >
<!--定义备用节点的管理地址-->
</ property >
< property >
< name >dfs.replication </ name >
< value >3 </ value >
<!--定义数据的复制份数,份数越多越安全,但速度越慢-->
</ property >
< property >
< name >dfs.datanode.du.reserved </ name >
< value >1073741824 </ value >
<!--定义du操作返回-->
</ property >
< property >
< name >dfs.block.size </ name >
< value >134217728 </ value >
<!--定义hdfs的存储块大小,默认64M,我用的128M-->
</ property >
< property >
< name >dfs.permissions </ name >
< value >false </ value >
<!--权限设置,最好不要-->
</ property >
</ configuration >
还有一个很重要的配置,map reduce 的配置
mapred-site.xml
<?
xml
version
="1.0"
?>
<? xml-stylesheet type ="text/xsl" href ="configuration.xsl" ?>
<!-- Put site-specific property overrides in this file. -->
< configuration >
< property >
< name >mapred.job.tracker </ name >
< value >hadoopmaster-177.tj:9001 </ value >
<!--定义jobtracker的端口和主机-->
</ property >
< property >
< name >mapred.local.dir </ name >
< value >/opt/data/hadoop1/mapred/mrlocal </ value >
<!--定义mapreduce所使用的本机分发汇总数据存储路径-->
< final >true </ final >
</ property >
< property >
< name >mapred.system.dir </ name >
< value >/opt/data/hadoop1/mapred/mrsystem </ value >
<!--定义map reduce系统的路径-->
< final >true </ final >
</ property >
< property >
< name >mapred.tasktracker.map.tasks.maximum </ name >
< value >6 </ value >
<!--这个很重要,定义任务map的最大槽位数,太小了会慢,太多了会内存溢出-->
< final >true </ final >
</ property >
< property >
< name >mapred.tasktracker.reduce.tasks.maximum </ name >
< value >2 </ value >
<!--也很重要,定义任务的reduce最大槽位数,设不好结果同上-->
< final >true </ final >
</ property >
< property >
< name >mapred.child.java.opts </ name >
< value >-Xmx1536M </ value >
<!--mapred每个槽位所使用的内存大小,设定错误结果同上,通常是map最大数*虚拟机内存数,也就是6x1536,超过Datanode内存就会溢出-->
</ property >
< property >
< name >mapred.compress.map.output </ name >
< value >true </ value >
<!--定义map采用压缩输出-->
</ property >
< property >
< name >mapred.map.output.compression.codec </ name >
< value >com.hadoop.compression.lzo.LzoCodec </ value >
<!--定义map压缩输出所使用的编解码器-->
</ property >
< property >
< name >mapred.child.java.opts </ name >
< value >-Djava.library.path=/opt/hadoopgpl/native/Linux-amd64-64 </ value >
<!--超重要,这是能正常使用数据压缩的保证,hadoopgpl-->
</ property >
< property >
< name >mapred.jobtracker.taskScheduler </ name >
< property >
< name >mapred.jobtracker.taskScheduler </ name >
< value >org.apache.hadoop.mapred.CapacityTaskScheduler </ value >
</ property >
< property >
< name >io.sort.mb </ name >
< value >300 </ value >
</ property >
< property >
< name >fs.inmemory.size.mb </ name >
< value >300 </ value >
</ property >
< property >
< name >mapred.jobtracker.restart.recover </ name >
< value >true </ value >
</ property >
</ configuration >
<? xml-stylesheet type ="text/xsl" href ="configuration.xsl" ?>
<!-- Put site-specific property overrides in this file. -->
< configuration >
< property >
< name >mapred.job.tracker </ name >
< value >hadoopmaster-177.tj:9001 </ value >
<!--定义jobtracker的端口和主机-->
</ property >
< property >
< name >mapred.local.dir </ name >
< value >/opt/data/hadoop1/mapred/mrlocal </ value >
<!--定义mapreduce所使用的本机分发汇总数据存储路径-->
< final >true </ final >
</ property >
< property >
< name >mapred.system.dir </ name >
< value >/opt/data/hadoop1/mapred/mrsystem </ value >
<!--定义map reduce系统的路径-->
< final >true </ final >
</ property >
< property >
< name >mapred.tasktracker.map.tasks.maximum </ name >
< value >6 </ value >
<!--这个很重要,定义任务map的最大槽位数,太小了会慢,太多了会内存溢出-->
< final >true </ final >
</ property >
< property >
< name >mapred.tasktracker.reduce.tasks.maximum </ name >
< value >2 </ value >
<!--也很重要,定义任务的reduce最大槽位数,设不好结果同上-->
< final >true </ final >
</ property >
< property >
< name >mapred.child.java.opts </ name >
< value >-Xmx1536M </ value >
<!--mapred每个槽位所使用的内存大小,设定错误结果同上,通常是map最大数*虚拟机内存数,也就是6x1536,超过Datanode内存就会溢出-->
</ property >
< property >
< name >mapred.compress.map.output </ name >
< value >true </ value >
<!--定义map采用压缩输出-->
</ property >
< property >
< name >mapred.map.output.compression.codec </ name >
< value >com.hadoop.compression.lzo.LzoCodec </ value >
<!--定义map压缩输出所使用的编解码器-->
</ property >
< property >
< name >mapred.child.java.opts </ name >
< value >-Djava.library.path=/opt/hadoopgpl/native/Linux-amd64-64 </ value >
<!--超重要,这是能正常使用数据压缩的保证,hadoopgpl-->
</ property >
< property >
< name >mapred.jobtracker.taskScheduler </ name >
< property >
< name >mapred.jobtracker.taskScheduler </ name >
< value >org.apache.hadoop.mapred.CapacityTaskScheduler </ value >
</ property >
< property >
< name >io.sort.mb </ name >
< value >300 </ value >
</ property >
< property >
< name >fs.inmemory.size.mb </ name >
< value >300 </ value >
</ property >
< property >
< name >mapred.jobtracker.restart.recover </ name >
< value >true </ value >
</ property >
</ configuration >
这个就是hadoop 主节点的主要配置,最近事情太多,下次写DataNode和TaskTracker的配置。