我家宝最近在自学Hadoop,于是乎跟着一起玩玩,在此为她整理一篇基础搭建的博客,希望对她能有所帮助。同样,开始之前先来了解下,什么是Hadoop。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop的框架最核心的设计就是HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
搭建
搭建集群的话,需要最少两台机器来搭建一个多节点的Hadoop环境,我这里使用Hadoop最新稳定的2.7.3版本和三台云主机(1主两从,Ubuntu1404 LTS)。
修改hosts文件
保证三台机器的网络是可达的前提下,更改主机名,并修改hosts文件:
<code># hostnamectl set-hostname master // 在master节点上执行</code>
<code># hostnamectl set-hostname slave-1 // 在slave-1节点上执行</code>
<code># hostnamectl set-hostname slave-2 // 在slave-2节点上执行</code>
<code>分别把三台机器的hosts文件进行修改:</code>
<code># vim /etc/hosts</code>
<code>192.168.1.2 master</code>
<code>192.168.1.3 slave-1</code>
<code>192.168.1.4 slave-2</code>
2.在master和slave节点上安装java:
<code># add-apt-repository ppa:webupd8team/java //添加ppa</code>
<code># apt-get update</code>
<code># apt-get installoracle-java8-installer </code>
<code># java -version //检验Java版本</code>
<code>java version </code><code>"1.8.0_121"</code>
<code>Java(TM) SE Runtime Environment (build 1.8.0_121-b13)</code>
<code>Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)</code>
3.禁用IPv6
<code># vim /etc/sysctl.conf</code>
<code>net.ipv6.conf.all.disable_ipv6 = 1</code>
<code>net.ipv6.conf.default.disable_ipv6 = 1</code>
<code>net.ipv6.conf.lo.disable_ipv6 = 1</code>
<code># sysctl -p //使其立即生效</code>
4.创建Hadoop User
在master和slave节点上执行:
<code># addgroup hdgroup //创建hadoop group</code>
<code># adduser —ingroup hdgroup hduser //创建Hadoop User并加入Hadoop group</code>
<code>Adding user `hduser' ...</code>
<code>Adding new user `hduser</code><code>' (1001) with group `hdgroup'</code> <code>...</code>
<code>Creating home directory `</code><code>/home/hduser</code><code>' ...</code>
<code>Copying files from `</code><code>/etc/skel</code><code>' ...</code>
<code>Enter new UNIX password: </code><code>//</code><code>输入密码之后一路回车即可</code>
<code>Retype new UNIX password:</code>
<code>passwd</code><code>: password updated successfully</code>
<code>Changing the user information </code><code>for</code> <code>hduser</code>
<code>Enter the new value, or press ENTER </code><code>for</code> <code>the default</code>
<code> </code><code>Full Name []:</code>
<code> </code><code>Room Number []:</code>
<code> </code><code>Work Phone []:</code>
<code> </code><code>Home Phone []:</code>
<code> </code><code>Other []:</code>
<code>Is the information correct? [Y</code><code>/n</code><code>]</code>
Hadoop要求无密码登录,所以需要生成秘钥,这里注意要用刚才创建的普通hduser用户,分别在master和slave上执行如下操作:
<code># su - hduser</code>
<code>$ </code><code>ssh</code><code>-keygen -N </code><code>''</code>
<code>Generating public</code><code>/private</code> <code>rsa key pair.</code>
<code>Enter </code><code>file</code> <code>in</code> <code>which</code> <code>to save the key (</code><code>/home/hduser/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>):</code>
<code>Created directory </code><code>'/home/hduser/.ssh'</code><code>.</code>
<code>Your identification has been saved </code><code>in</code> <code>/home/hduser/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>.</code>
<code>Your public key has been saved </code><code>in</code> <code>/home/hduser/</code><code>.</code><code>ssh</code><code>/id_rsa</code><code>.pub.</code>
<code>The key fingerprint is:</code>
<code>5b:ae:c6:5a:ce:66:51:d3:6c:6c:14:9b:b2:8a:da:e9 hduser@master</code>
<code>The key's randomart image is:</code>
<code>+--[ RSA 2048]----+</code>
<code>| .. |</code>
<code>| .o |</code>
<code>| .=o |</code>
<code>| oo* |</code>
<code>| S.o+ |</code>
<code>| ..= |</code>
<code>| ..+.. |</code>
<code>| o ==. |</code>
<code>| ..E=+ |</code>
<code>+-----------------+</code>
<code>$ </code><code>ssh</code><code>-copy-</code><code>id</code> <code>hduser@master</code>
<code>$ </code><code>ssh</code><code>-copy-</code><code>id</code> <code>hduser@slave-1</code>
<code>$ </code><code>ssh</code><code>-copy-</code><code>id</code> <code>hduser@slave-2</code>
5.下载和安装Hadoop
<a href="https://s3.51cto.com/wyfs02/M02/8D/81/wKiom1iezuazT-lkAAL2XegG4Yk005.png-wh_500x0-wm_3-wmp_4-s_1622907005.png" target="_blank"></a>
打开链接之后,右键复制链接地址:
<a href="https://s2.51cto.com/wyfs02/M00/8D/7F/wKioL1iezzOBIOACAAI4HvzbjQU970.png-wh_500x0-wm_3-wmp_4-s_1431648937.png" target="_blank"></a>
在master和slave上分别执行(你也可以在一台机器上下载完之后拷贝到另外两台上):
<code>$ </code><code>cd</code> <code>/home/hduser</code>
<code>$ wget -c </code>
<code>$ </code><code>tar</code> <code>-zxvf hadoop-2.7.3.</code><code>tar</code><code>.gz</code>
<code>$ </code><code>mv</code> <code>hadoop-2.7.3 hadoop</code>
6.更改环境变量
首先确定之前安装的java home目录,查找办法如下(在任意一台机器上执行):
<code>hduser@master:~$ </code><code>env</code> <code>| </code><code>grep</code> <code>-i java</code>
<code>JAVA_HOME=</code><code>/usr/lib/jvm/java-8-oracle</code>
分别在master和slave节点上执行以下操作,编辑".bashrc"文件,添加如下几行:
<code>$ vim .bashrc </code><code>//</code><code>编辑文件,添加如下几行</code>
<code>export</code> <code>HADOOP_HOME=</code><code>/home/hduser/hadoop</code>
<code>export</code> <code>JAVA_HOME=</code><code>/usr/lib/jvm/java-8-oracle</code>
<code>PATH=$PATH:$HADOOP_HOME</code><code>/bin</code><code>:$HADOOP_HOME</code><code>/sbin</code>
<code>$ </code><code>source</code> <code>.bashrc </code><code>//source</code><code>使其立即生效</code>
分别在master和slave节点上执行以下操作,更改Hadoop-env的JAVA_HOME:
<code>$ vim </code><code>/home/hduser/hadoop/etc/hadoop/hadoop-env</code><code>.sh</code>
<code>#export JAVA_HOME=${JAVA_HOME} //更改此行,或者注释掉新加以下一行</code>
7.Hadoop配置
Hadoop的配置这里主要涉及四个配置文件:etc/hadoop/core-site.xml,etc/hadoop/hdfs-site.xml, etc/hadoop/yarn-site.xml and etc/hadoop/mapred-site.xml.
这里摘录网络上的一段话,在继续下面的操作之前一定要阅读这段,以便更好的理解:
Hadoop Distributed File System: A distributed file system that provides high-throughput access to application data. A HDFS cluster primarily consists of a NameNode that manages the file system metadata and DataNodes that store the actual data. If you compare HDFS to a traditional storage structures ( e.g. FAT, NTFS), then NameNode is analogous to a Directory Node structure, and DataNode is analogous to actual file storage blocks.
Hadoop YARN: A framework for job scheduling and cluster resource management.
Hadoop MapReduce: A YARN-based system for parallel processing of large data sets.
①在master和slave节点上更改"core-site.xml"文件,master和slave节点应该使用相同"fs.defaultFS"值,而且必须指向master节点;在“configuration”中间添加如下配置:
<code><property></code>
<code> </code><code><name>hadoop.tmp.</code><code>dir</code><code><</code><code>/name</code><code>></code>
<code> </code><code><value></code><code>/home/hduser/tmp</code><code><</code><code>/value</code><code>></code>
<code> </code><code><description>Temporary Directory.<</code><code>/description</code><code>></code>
<code><</code><code>/property</code><code>></code>
<code> </code><code><name>fs.defaultFS<</code><code>/name</code><code>></code>
<code> </code><code><value>hdfs:</code><code>//master</code><code>:54310<</code><code>/value</code><code>></code>
<code> </code><code><description>Use HDFS as </code><code>file</code> <code>storage engine<</code><code>/description</code><code>></code>
最终core-site.xml配置文件如下图所示:
<a href="https://s3.51cto.com/wyfs02/M00/8D/7F/wKioL1ie2-2SHfPcAAL8qN5RLB4952.png-wh_500x0-wm_3-wmp_4-s_2870729140.png" target="_blank"></a>
如果tmp目录不存在,需要手动创建一个:
<code>$ </code><code>mkdir</code> <code>/home/hduser/tmp</code>
<code>$ </code><code>chown</code> <code>-R hduser:hdgroup </code><code>/home/hduser/tmp</code> <code>//</code><code>非hduser用户创建虚赋权</code>
②只在master节点上更改"mapred-site.xml"文件,由于没有这个文件,需要需要复制那个template文件生成一个:
<code>$ </code><code>cd</code> <code>/home/hduser/hadoop/</code>
<code>$ </code><code>cp</code> <code>-av etc</code><code>/hadoop/mapred-site</code><code>.xml.template etc</code><code>/hadoop/mapred-site</code><code>.xml</code>
编辑xml配置文件,在“configuration”中间添加如下配置:
<code> </code><code><name>mapreduce.jobtracker.address<</code><code>/name</code><code>></code>
<code> </code><code><value>master:54311<</code><code>/value</code><code>></code>
<code> </code><code><description>The host and port that the MapReduce job tracker runs</code>
<code> </code><code>at. If “</code><code>local</code><code>”, </code><code>then</code> <code>jobs are run </code><code>in</code><code>-process as a single map</code>
<code> </code><code>and reduce task.</code>
<code><</code><code>/description</code><code>></code>
<code> </code><code><name>mapreduce.framework.name<</code><code>/name</code><code>></code>
<code> </code><code><value>yarn<</code><code>/value</code><code>></code>
<code> </code><code><description>The framework </code><code>for</code> <code>running mapreduce jobs<</code><code>/description</code><code>></code>
③在master和slave节点上更改"hdfs-site.xml"文件,在“configuration”中间添加如下配置:
<code> </code><code><name>dfs.replication<</code><code>/name</code><code>></code>
<code> </code><code><value>2<</code><code>/value</code><code>></code>
<code> </code><code><description>Default block replication.</code>
<code> </code><code>The actual number of replications can be specified when the </code><code>file</code> <code>is created.</code>
<code> </code><code>The default is used </code><code>if</code> <code>replication is not specified </code><code>in</code> <code>create </code><code>time</code><code>.</code>
<code> </code><code><</code><code>/description</code><code>></code>
<code> </code><code><name>dfs.namenode.name.</code><code>dir</code><code><</code><code>/name</code><code>></code>
<code> </code><code><value></code><code>/data/hduser/hdfs/namenode</code><code><</code><code>/value</code><code>></code>
<code> </code><code><description>Determines where on the </code><code>local</code> <code>filesystem the DFS name node should store the name table(fsimage). If this is a comma-delimited list of directories </code><code>then</code> <code>the name table is replicated </code><code>in</code> <code>all of the directories, </code><code>for</code> <code>redundancy.</code>
<code> </code><code><name>dfs.datanode.data.</code><code>dir</code><code><</code><code>/name</code><code>></code>
<code> </code><code><value></code><code>/data/hduser/hdfs/datanode</code><code><</code><code>/value</code><code>></code>
<code> </code><code><description>Determines where on the </code><code>local</code> <code>filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, </code><code>then</code> <code>data will be stored </code><code>in</code> <code>all named directories, typically on different devices. Directories that </code><code>do</code> <code>not exist are ignored.</code>
并创建刚才配置文件中指定的目录:
<code>$ </code><code>mkdir</code> <code>-p </code><code>/home/hduser/data/hduser/hdfs/</code><code>{namenode,datanode}</code>
<code>$ </code><code>chown</code> <code>-R hduser:hdgroup </code><code>/home/hduser/data/</code> <code>//</code><code>如果非hduser用户创建的需要赋权</code>
1).这里dfs.replication的默认值为3,这里我设置了2个副本,代表每个存储到HDFS的文件都有额外一个副本,这里的值可以视集群规模而定。
2)dfs.namenode.name.dir和dfs.datanode.name.dir是namenode和datanode存放HDFS数据块文件的位置,如果没有需要手动创建。
④在master和slave节点上更改"yarn-site.xml"文件,master和slave节点应该使用相同的值,并且指向master节点。在“configuration”中间添加如下配置:
<code> </code><code><name>yarn.nodemanager.aux-services<</code><code>/name</code><code>></code>
<code> </code><code><value>mapreduce_shuffle<</code><code>/value</code><code>></code>
<code> </code><code><name>yarn.resourcemanager.scheduler.address<</code><code>/name</code><code>></code>
<code> </code><code><value>master:8030<</code><code>/value</code><code>></code>
<code> </code><code><name>yarn.resourcemanager.address<</code><code>/name</code><code>></code>
<code> </code><code><value>master:8032<</code><code>/value</code><code>></code>
<code> </code><code><name>yarn.resourcemanager.webapp.address<</code><code>/name</code><code>></code>
<code> </code><code><value>master:8088<</code><code>/value</code><code>></code>
<code> </code><code><name>yarn.resourcemanager.resource-tracker.address<</code><code>/name</code><code>></code>
<code> </code><code><value>master:8031<</code><code>/value</code><code>></code>
<code> </code><code><name>yarn.resourcemanager.admin.address<</code><code>/name</code><code>></code>
<code> </code><code><value>master:8033<</code><code>/value</code><code>></code>
⑤更新slave文件
在master节点上修改slave文件,添加master和slave节点的主机名或者ip地址,并去掉"localhost":
<code>$ vim </code><code>/home/hduser/hadoop/etc/hadoop/slaves</code>
<code>master</code>
<code>slave-1</code>
<code>slave-2</code>
⑥格式化namenode:
在启动cluster之前需要先格式化namenode,在master上执行:
<code>$ hdfs namenode -</code><code>format</code>
看到类似提示INFO:"Storage directory /home/hduser/data/hduser/hdfs/namenode has been successfully formatted."表示格式化成功。
⑦启动服务
可以直接使用Hadoop提供的脚本"start-all.sh"启动所有服务,也可以把dfs和yarn分别启动。可以使用绝对路径:/home/hduser/hadoop/sbin/start-all.sh,也可以直接调用start-all.sh脚本(因为前面已经改过PATH的路径):
<code>$ start-all.sh</code>
如下图所示没有看到任何错误信息,表示集群已成功启动:
<a href="https://s5.51cto.com/wyfs02/M01/8D/80/wKioL1ifAi6CHKv1AALFSxwfsBE953.png-wh_500x0-wm_3-wmp_4-s_646365465.png" target="_blank"></a>
⑧验证查看
使用jps命令分别在master和slave上查看启动的服务
<a href="https://s4.51cto.com/wyfs02/M02/8D/80/wKioL1ifAuywLnUvAACUdLK8-wk339.png-wh_500x0-wm_3-wmp_4-s_1068650777.png" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M00/8D/80/wKioL1ifAwuBfAE7AABg8r7Ndd4766.png-wh_500x0-wm_3-wmp_4-s_556833938.png" target="_blank"></a>
网页验证:
<a href="https://s1.51cto.com/wyfs02/M02/8D/80/wKioL1ifA_OxKaJlAAK5gJWhOxA586.png-wh_500x0-wm_3-wmp_4-s_2956240976.png" target="_blank"></a>
如果所有node均正常启动,这里能够全部显示:
<a href="https://s5.51cto.com/wyfs02/M02/8D/81/wKioL1ifBLewUbRbAAMYZLw9g7U228.png-wh_500x0-wm_3-wmp_4-s_552914878.png" target="_blank"></a>
Hadoop解压的share目录里给我们提供了几个example的jar包,我们执行一个看下效果:
<code>$ hadoop jar </code><code>/home/hduser/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2</code><code>.7.3.jar pi 30 100</code>
能够看到当前执行的任务:
<a href="https://s5.51cto.com/wyfs02/M02/8D/83/wKiom1ifBniTbJrxAAKjzYi8iq4349.png-wh_500x0-wm_3-wmp_4-s_3750754622.png" target="_blank"></a>
写在最后:
如果在新增了节点或者删除节点的时候出现了问题,首先删除slave的hadoop.tmp.dir,然后重新启动试试看,如果还是不行,尝试把Master的hadoop.tmp.dir删除(意味着dfs上的数据也会丢失)然后需要重新namenode –format。
如果有任何报错信息记得去查log日志,文件位置在Hadoop的安装目录logs文件夹下。
本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1896964,如需转载请自行联系原作者