Ubuntu下搭建hadoop集群
预安装
- JDK
考虑到更好的兼容性,使用Oracle官方的JDK- 版本:Java 6或更新版本
- 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
- 使用PPA或下载解压即可
- ssh
$ sudo apt-get install ssh
- rsync
$ sudo apt-get install rsync
安装
- 创建Hadoop用户:
$ sudo mkdir /opt/hadoop $ sudo adduser --home /opt/hadoop hadoop
- 下载Hadoop稳定版并解压到/opt/hadoop目录,下载地址: http://www.apache.org/dyn/closer.cgi/hadoop/common/
- 在Hadoop的解压文件etc/hadoop/hadoop-env.sh中设置JDK安装环境,例如:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
- 将Hadoop的bin目录和JAVA的bin目录设置到hadoop用户的PATH环境变量里面
- 检查是否安装成功:
$ hadoop version
配置
Hadoop有三种运行模式:本地(独立)模式(Local (Standalone) Mode)、伪分布式模式(Pseudo-Distributed Mode)、全分布式模式(Fully-Distributed Mode)
本地(独立)模式
默认即为本模式,本模式无需运行任何守护进程
伪分布式模式
修改配置文件
- etc/hadoop/core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://0.0.0.0:8020</value> </property> </configuration>
- etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hadoop/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/hadoop/hdfs/data</value> </property> </configuration>
- 若运行YARN则如下配置:
- etc/hadoop/mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
- etc/hadoop/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> </configuration>
- etc/hadoop/mapred-site.xml
设置无密码本地登录ssh
$ sudo su - hadoop $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys $ ssh localhost
运行
- 格式化文件系统
$ hdfs namenode -format
- 启动NameNode和DataNode守护进程
$ start-dfs.sh
- 启动ResourceManager和NodeManager守护进程
$ start-yarn.sh
若是Hadoop 1.x版本就是启动Jobtracker和tasktracker守护进程:
$ start-mapred.sh
- 管理界面
- NameNode:
http://localhost:50070/
- ResourceManager:
http://localhost:8088/
- NameNode:
停止守护进程
$ stop-dfs.sh // Hadoop 2.x $ stop-yarn.sh // Hadoop 1.x $ stop-mapred.sh
全分布式模式
测试主机安排情况
hostname | ip | role |
hadoop0 | 172.17.0.2 | 主节点 |
hadoop1 | 172.17.0.3 | 从节点 |
hadoop2 | 172.17.0.4 | 从节点 |
设置SSH无密码登陆各个节点
只要让NameNode和ResourceManager节点可以无密码SSH登陆各个节点即可
修改配置文件
各个节点配置文件可以保持一致,在哪个节点执行启动脚本,则那个节点为主节点,以下以三个或以上DataNode进行配置- etc/hadoop/core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop0:8020</value> </property> </configuration>
- etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hadoop/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/hadoop/hdfs/data</value> </property> </configuration>
- 若运行YARN则如下配置:
- etc/hadoop/mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
- etc/hadoop/yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop0</value> </property> <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> </configuration>
- etc/hadoop/mapred-site.xml
- etc/hadoop/slaves
添加各个DataNode和NodeManager节点的hostname到该配置文件,一行为一条记录,当主节点起来时将会根据这个配置文件通过ssh去各个从节点
hadoop0 hadoop1 hadoop2
若主节点也要作为DataNode的话,也需添加记录进该配置文件
- /etc/hosts
将hostname与ip映射关系写到各个节点的/etc/hosts
172.17.0.2 hadoop0 172.17.0.3 hadoop1 172.17.0.4 hadoop2
运行
格式化和启动操作只需在主节点执行即可- 格式化文件系统
$ hdfs namenode -format
若之前已经运行过伪分布式模式,建议格式化前先删除之前的临时文件
- 启动NameNode和DataNode守护进程
$ start-dfs.sh
- 启动ResourceManager和NodeManager守护进程
$ start-yarn.sh
若是Hadoop 1.x版本就是启动Jobtracker和tasktracker守护进程:
$ start-mapred.sh
- 启动Mapreduce作业日志服务守护进程
$ mr-jobhistory-daemon.sh start historyserver
- 使用jps查看各个进程是否启动成功,若不成功则需根据启动日志来找出问题
- 管理界面
- NameNode:
http://localhost:50070/
- ResourceManager:
http://localhost:8088/
- NameNode:
停止守护进程
在主节点上执行
$ stop-dfs.sh // Hadoop 2.x $ stop-yarn.sh // Hadoop 1.x $ stop-mapred.sh $ mr-jobhistory-daemon.sh stop historyserver
测试
- 创建HDFS目录
$ hdfs dfs -mkdir /user $ hdfs dfs -mkdir /user/<username>
- 复制input文件到分布式文件系统
$ hdfs dfs -put etc/hadoop input
- 执行MapReduce示例作业
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar grep input output 'dfs[a-z.]+'
- 检查output
$ hdfs dfs -cat output/*
如果执行过程遇到一直在running的情况,尝试重启Hadoop再试试,若不行,则可能是磁盘空间已经达到阈值或内存不足,可以修改配置文件的阈值或分配内存大小,一般的问题在执行日志里面都会有清晰的描述。
参考
Hadoop: Setting up a Single Node Cluster: http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/SingleCluster.html
Hadoop Cluster Setup: http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/ClusterSetup.html