Hadoop分布式集群搭建
环境
Windows下的VMware虚拟机,用cnetos搭建三台hadoop分布式集群
下载包
1、创建hadoop用户
useradd -m hadoop -s /bin/bash # 创建新用户hadoop
passwd hadoop 给用户添加密码
2、修改网络信息(静态ip)
修改hosts文件,实验机器中etc/hosts之中的主机名如果与实际的主机名不一致,修改etc/hosts为当前主机名
sudo vi /etc/sysconfig/network #修改主机名 sudo vi /etc/hosts #修改ip
修改完后保存退出并重启。
reboot
3、安装SSH、配置SSH无密码登陆
利用 ssh-keygen 生成密钥,并将密钥加入到授权中:
ssh-keygen -t rsa # 会有提示,都按回车就可以cat id_rsa.pub >> authorized_keys # 加入授权 chmod 600 ./authorized_keys # 修改文件权限
接着在 Master 节点将上公匙传输到 Slave 节点:
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 authorized_keys rm ~/id_rsa.pub # 用完就可以删掉了
4、CentOS系统需要关闭防火墙
sudo service iptables stop # 关闭防火墙服务
sudo chkconfig iptables off # 禁止防火墙开机自启,就不用手动关闭了
5、安装Java环境
sudo tar -zxvf ~/downloads/jdk-7u91-linux-x64.tar.gz -C /usr/local #解压到/usr/local目录下
配置一下 JAVA_HOME 环境变量:
vi ~/.bashrc追加以下并保存:
export JAVA_HOME=/usr/local/jdk1.7.0_91 export PATH=$JAVA_HOME/bin:$PATH:
* source ~/.bashrc # 使变量设置生效 *
设置好后我们来检验一下是否设置正确:
java -version
6、现在主节点上安装hadoop2
sudo tar -zxvf ~/downloads/hadoop-2.6.1.tar.gz -C /usr/local # 解压到/usr/local中
sudo mv hadoop-2.6.1 hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop:hadoop hadoop # 修改文件权限
在搭建 Hadoop 之前,我们还需要设置 HADOOP 环境变量:
vi ~/.bashrc
在文件最后面增加如下内容:
# Hadoop Environment Variablesexport HADOOP_HOME=/usr/local/hadoop export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin
* source ~/.bashrc #使命令生效 *
7、修改配置hadoop配置文件信息
修改配置文件 core-site.xml (vi ./etc/hadoop/core-site.xml)
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
文件 hdfs-site.xml,dfs.replication 一般设为 3
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
文件 mapred-site.xml (可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>
文件 yarn-site.xml:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
8、配置完成后。配置好后,将 Master 上的 /usr/local/Hadoop 文件夹复制到各个节点上。在 Master 节点上执行:
要是之前Master跑了伪分布式就要删除不必要的信息
sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
打包发送
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
scp ./hadoop.master.tar.gz Slave1:/home/hadoop
在 Slave1 节点上执行:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
首次启动需要先在 Master 节点执行 NameNode 的格式化:
hdfs namenode -format # 首次运行需要执行初始化,之后不需要
启动hadoop集群:
/usr/local/hadoop/sbin/start-all.sh
验证hadoop集群jps
主节点
Jps
2986 SecondaryNameNode
3143 ResourceManager
2791 NameNode
3212 Jps
子节点
jps
1950 Jps
1831 NodeManager
1725 DataNode
遇到的问题及解决方案
没有namenode进程
- 检查ifconfig和/etc/hosts中的ip是否一致
没有datenode进程
- 删除hadoop/tmp下所有文件,格式化dfs后,再此启动Hadoop,这种方法会丢失数据,不建议使用。
出现这种问题是由于 * /usr/local/hadoop/tmp/dfs/data/current/VERSION中的clusterID和/usr/local
/hadoop/tmp/dfs/name/current/VERSION * 中的clusterID不一致导致的,将data中的和name的保持一致即可。