Hadoop集群部署(基于2.7.1)

来源:互联网 发布:mastercam线割编程教程 编辑:程序博客网 时间:2024/04/30 14:37

Hadoop集群部署(基于2.7.1)

要尝试Hadoop,第一步就是要部署一个Hadoop的集群.
之前看官网上的教程,遇到了很多的问题,看博客又零零散散,而且大多基于原来的版本,和现在的目录结构也不同,所以重新整理了一下自己搭建的过程.若有不对之处,还望指正.

建立用户

建议在root用户下操作

创建用户组及用户

$ groupadd hadoop  #创建hadoop用户组$ useradd -d /usr/hadoop/ -m -g hadoop hadoop  #在hadoop组下创建用户hadoop,并分配主目录$ passwd hadoop    #初始化hadoop用户密码

分配权限

修改/etc/sudoers文件,为Hadoop组用户添加sudo权限

%hadoop   ALL=(ALL:ALL) ALL

hosts修改

在/etc/hosts文件中添加集群节点的信息

XXX.XXX.XXX.XXX masterXXX.XXX.XXX.XXX node1XXX.XXX.XXX.XXX node2

同时可以将/etc/hostname文件中的内容(即当前机器名称)改为master,node1,node2,有助于之后查看日志等时便于区分,该操作重启后方生效.

其他改动

准备工作

建议在hadoop用户下操作

  • Hadoop包
  • JDK
  • ssh,rsync

JDK不必多说了吧,我想大家应该都很熟练,若真有不懂的,可以去搜搜别的博客,都很全面,给我留言也可以.
Hadoop包下载后,解压放着,先暂且不管.

  $ sudo apt-get install ssh  $ sudo apt-get install rsync

ssh免密码操作

在本地生成密钥,将master,node1,node2的公钥添加到/.ssh/authorized_key文件中,一行一个,若是没有该文件,自己生成一个即可.

  $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa  $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

因为通常我们是在master上启动hadoop,所以只要master上有node1,node2的公钥,就可以免密码登陆node1和node2了,你可以在另外的节点上重复以上操作来实现更多的免密码登陆

其他操作

建议在系统环境变量中添加一行(即/etc/profile)

export HADOOP_PREFIX=/usr/hadoop/hadoop-2.7.1   #路径为hadoop文件实际所在的路径

加入后source /etc/profile刷新系统环境变量

配置修改

这部分讲的都是hadoop目下,etc/hadoop/下的文件,部分是来自官网文档中提到的

hadoop.env.sh

修改JAVA_HOME,改成你实际的JDK路径
你可以选择不修改,但若是运行是出现找不到jdk的错误时,再回来修改.

core-site.xml

<configuration>    <property>        <name>fs.defaultFS</name>        <value>hdfs://master:9000</value>    </property></configuration>

配置为NameNode所在的http地址

hdfs-site.xml

<configuration>    <property>        <name>dfs.replication</name>        <value>1</value>    </property></configuration>

官网介绍

yarn-site.xml

<configuration>    <property>        <name>yarn.nodemanager.aux-services</name>        <value>mapreduce_shuffle</value>    </property>    <property>        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>        <value>org.apache.hadoop.mapred.ShuffleHandler</value>    </property>    <property>        <name>yarn.resourcemanager.address</name>        <value>master:8032</value>    </property>    <property>        <name>yarn.resourcemanager.scheduler.address</name>        <value>master:8030</value>    </property>    <property>        <name>yarn.resourcemanager.resource-tracker.address</name>        <value>master:8031</value>    </property>    <property>        <name>yarn.resourcemanager.admin.address</name>        <value>master:8033</value>    </property>    <property>        <name>yarn.resourcemanager.webapp.address</name>        <value>master:8088</value>    </property><!-- Site specific YARN configuration properties --></configuration>

地址都指向master

mapred-site.xml

<configuration>    <property>        <name>mapreduce.framework.name</name>        <value>yarn</value>    </property>    <property>        <name>mapreduce.jobhistory.address</name>        <value>hmaster:10020</value>    </property>    <property>        <name>mapreduce.jobhistory.webapp.address</name>        <value>hmaster:19888</value>    </property></configuration>

实际上是没有这个文件的,你可以通过复制 mapred-site.xml.template文件生成一个,然后再修改.这么做的原因是,我发现修改 mapred-site.xml.template文件是没有用的,实际上并没有生效,而网上很多前辈都是说,修改 mapred-site.xml文件的,所以我猜测在读取配置的时候读取的是 mapred-site.xml文件,而不是 mapred-site.xml.template文件.至于hadoop为什么放一个 mapred-site.xml.template文件,这就不是很清楚了.
这样改完之后,启动historyserver就可以看到Application了,没改之前,我一直看不到.

slaves

只要简单的加入

node1node2

这两行就可以了,之后就可以通过脚本一次启动集群,而不用一个节点一个节点的启动了.

启动

在真正运行之前,需要执行一行代码,将master上的hdfs转为NameNode的格式

$ HADOOP_PREFIX/bin/hdfs namenode -format#然后就可以启动了$ HADOOP_PREFIX/sbin/start-all.sh  #尽管已经被desperated了,但暂时目前还是可用的#或者用官方推荐的方式启动$ HADOOP_PREFIX/sbin/start-dfs.sh  #启动hdfs$ HADOOP_PREFIX/sbin/start-yarn.sh #启动yarn#此外启动historyserver的命令如下$ HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver

如果要停止的话,把上述命令中的start,改为stop就可以了

运行使用

在hdfs中创建了文件目录,填入你创建的用户名,这里我用的是hadoop

$ bin/hdfs dfs -mkdir /user$ bin/hdfs dfs -mkdir /user/<username>$ bin/hdfs dfs -put etc/hadoop input   #将文件放入input目录下$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar grep input output 'dfs[a-z.]+' #执行官方提供的grep方法,从input中读取,输出到output$ bin/hdfs dfs -get output output  #讲输出从hdfs上输出到本地

上诉也可用另一个wordcount函数来测试,将第四行命令改为$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount input output即可

另外删除语句为$ bin/hdfs dfs -rm -r input,input是指目录

输出包含两个文件part-r-00000,_SUCCESS,在part-r-00000文件中可以看到计算的结果,例如

(string,        1(which  109,     11       110      12015    15       45x10=50 1Again   1An      1And     2Another 1Are     1But     1CPU     1Do      1Don’t   1Elasticsearch   3Fields  2First   1For     4Future  1Grand   1Here    1However 1I       3If      3In      3Index   1Lucene  7One     1Or      1Otherwise       1Otherwise,      1Scores  1Sparse  1...

若有啰嗦之处还望见谅~

本文为作者原创,请勿随意转载(大牛们必然不会如此啰嗦~~),谢谢.

0 0