[转]hadoop+zookeeper+hbase完全分布式搭建
http://blog.youkuaiyun.com/u013378306/article/details/51530556
hadoop + hbase + zookeeper + spark version matrix
http://hbase.apache.org/book.html#basic.prerequisites
- 创建实例
选取阿里云ECS产品,4台机器,配置为:1核、1G内存、CentOS 6.8 64位
查看一下系统信息:
uname -a
结果: Linux xxx 2.6.32-696.1.1.el6.x86_64 #1 SMP Tue Apr 11 17:13:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
cat /proc/version
结果:Linux version 2.6.32-696.1.1.el6.x86_64 (mockbuild@c1bm.rdu2.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Tue Apr 11 17:13:24 UTC 2017
结果:CentOS release 6.8 (Final)cat /etc/issue
通过lsb命令也是可以查看版本信息(适用于所有的linux,包括Redhat、SuSE、Debian等发行版,但是在debian下要安装lsb)
结果:lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 6.8 (Final)
Release: 6.8
Codename: Final
- 服务器的命名
hadoop_master
slave01
slave02
slave03
- 安装包的放置
我统一放在/home/tool下
mkdir /home/tool
- 更新Python版本至最新的的python2稳定版本(可不操作)
查看下python的版本:
python --version
结果:Python 2.6.6
目前Python官网最新的版本是2.7.13
开始升级python。。。
虽然阿里云推荐CentOS使用yum安装软件包,这里我们还是使用wget下载源码安装
cd /home/tool/python
解压wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
tar -zxvf Python-2.7.13.tgz
进入解压目录
cd Python-2.7.13
在编译前先在/usr/local建一个文件夹(作为Python的安装路径,以免覆盖老的版本)
mkdir -p /usr/local/python/python2/python2713
在解压缩后的目录下编译安装
./configure --prefix=/usr/local/python/python2/python2713
make && make test
make install
此时没有覆盖老版本,再将原来/usr/bin/python链接改为别的名字
mv /usr/bin/python /usr/bin/python263
由于这里python的升级会影响到yum的使用,所以需要改动yum指向的python,编辑文件/usr/bin/yum
vi /usr/bin/yum
将#!/usr/bin/python改为:#!/usr/bin/python263
再建立新版本python的链接
ln -s /usr/local/python/python2/python2713 /usr/local/python/current
ln -s /usr/local/python/current/bin/python2.7 /usr/bin/python
再查看python版本,此时变为了2.7.13
其余slave也一样更新
java安装
在安装hadoop前需要先安装java jdk,根据安装的hadoop版本挑选jdk,目前hadoop2.7及以上需要java7,详细的版本对应可以查看链接
由于hadoop3.0.0和2.8.0还不稳定,但2.8.0开始涵盖新特新,因此安装2.8.0,hadoop版本信息请见链接
选择jdk7u80
由于jdk下载要身份验证,网上有以下命令可跳过验证,实测无效:
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz
所以还是先通过window下载后上传至master机器,再从master机器使用scp拷贝至slave机器进行安装,拷贝命令为(以下为本复制到远程):scp local_file remote_username@remote_ip:remote_folder
解压压缩包
tar -zxvf jdk-7u80-linux-x64.tar.gz
在以下路径新建一个放jdk的文件件
然后将解压的文件夹移至这个目录夹下mkdir -p /usr/local/jdk
mv jdk1.7.0_80 /usr/local/jdk/
切换目录到jdk
建立软连接,这样方便版本切换管理。建立软件接的命令是: ln -s 源文件或目录 链接cd /usr/local/jdk/
通过命令ll -a可以查看到软连接创建完毕。ln -s jdk1.7.0_80 ./current
添加环境变量。CentOS里添加环境变量有两处。/etc/profile是永久性的环境变量,是全局变量,/etc/profile.d/设置所有用户生效。所以此处在/etc/profile.d/下设置。
在该目录下新建java.sh文件
cd /etc/profile.d/ vim java.sh
并export环境变量,并保存java.sh
使用重启命令,重启系统,是环境变量生效。export JAVA_HOME=/usr/local/jdk/current export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=${JAVA_HOME}/bin:$PATH
或,只对root用户有效reboot
检查环境变量是否配置正确shutdown -r now
java -version
- 免密登陆
先检查机器的名称,如果命名不规范可修改:
hostname
我们这里分别把四台机器的hostname命名成(我的英文名.master, 我的英文名.slave01...slave03)。但是阿里云的ECS,暂时不做修改(因为不知道修改会不会造成问题...)
hostname hadoop.master
添加hadoop用户,useradd -m参数自动建立 hadoop用户登录时的目录,除外还有-d指定用户登录目录,-s等。具体参见useradd命令
useradd -m hadoop
passwd hadoop
检查ssh是否有安装
rpm -qa |grep ssh
结果:
libssh2-1.4.2-2.el6_7.1.x86_64
openssh-server-5.3p1-122.el6.x86_64
openssh-5.3p1-122.el6.x86_64openssh-clients-5.3p1-122.el6.x86_64
如果安装了,则检查是否设为了开机启动
chkconfig --list sshd
结果:
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
2345需要on,如果不是则输入命令:
然后重新启动服务chkconfig --level 2345 sshd on
service sshd restart
编辑hosts文件,添加主机名以及映射
vi /etc/hosts
添加,在这里要注意先看先ipconfig,如果ipconfig里只有内网ip,这里的ip就配内网ip
ip hostname
ip hostname
ip hostname
切换至hadoop用户,设置免密登陆
su hadoop
原则上切换hadoop用户后,初始加载的目录会是/home/hadoop,如果不是就手动切换到该目录
生成秘钥文件,一路回车
ssh-keygen -t rsa -P ""
执行后会在/home/hadoop/.ssh目录下生成id_rsa和id_rsa.pub两个文件,进入.ssh目录,并将id_rsa.pub追加到authorized_keys文件中
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys
修改authorized_keys文件的用户权限
chmod 600 authorized_keys
把authorized_keys逐一复制到各台机器,并append秘钥,然后把最全的authorized_keys复制到每台机器上
scp authorized_keys hadoop@ip:/home/hadoop/.ssh
测试是否可以登录
ssh localhost
# 执行后会提示输入 yes or no. 输入yes后 如果提示为最后一次登录时间 则表明成功。
试试连接别的机器,如果不需要输入密码就对了。
ssh hadoop@ip
同时编辑文件/etc/ssh/ssh_config,添加
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
这样在连接时不会需要输入yes,如果这个不配,hadoop启动可能会不成功
安装hadoop2.7.3以上的就可以不用编译64位的native库了,因为默认的binary就是64位版本,在安装时,只要确认glibc库是否支持就行
使用命令为:
解压hadoopbinary文件后,进入lib/native目录查看文件是否为64位版本,以及所需要的glibc库
file libhadoop.so.1.0.0
strings libhadoop.so.1.0.0 | grep GLIBC
确认系统的glibc版本
strings /lib64/libc.so.6 | grep GLIBC
尽量不要去更新系统的glibc,楼主更新了几次一直失败,甚至导致系统不可登陆。
以下不要操作==================================
由于系统是64位的,默认hadoop的binary版本是支持32位的,因此这里我们要使用source版,自行编译。编译前需要如下安装
先安装或更新以下库
yum install cmake lzo-devel zlib-devel gcc autoconf automake libtool ncurses-devel openssl-devel glibc-headers gcc-c++
安装maven,这里使用3.5.0的binary版
wget http://apache.fayea.com/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz
解压文件
在/opt下建立maven文件夹,并将解压文件移动至文件夹下tar -zxvf apache-maven-3.5.0-bin.tar.gz
建立软连接mkdir /opt/maven mv apache-maven-3.5.0 /opt/maven/
在/etc/profile.d/下创建maven.sh,创建环境变量cd /opt/maven/ ln -s apache-maven-3.5.0 ./current
用同样的方式安装ant 1.9.9,配置环境变量export MAVEN_HOME=/opt/maven/current export PATH=${MAVEN_HOME}/bin:$PATH
wget http://mirrors.hust.edu.cn/apache//ant/binaries/apache-ant-1.9.9-bin.tar.gz
export ANT_HOME=/opt/ant/currentexport PATH=${ANT_HOME}/bin:$PATH
安装protobuf(由于hadoop2.8.0推荐安装protobuf2.5.0,所以此处安装2.5.0)解压文件wget https://github.com/google/protobuf/archive/v3.3.0.tar.gz
创建路径tar -zxvf v3.3.0.tar.gz
mkdir -p /usr/local/protobuf/protobuf330
protobuf编译前需要先运行cd protobuf-3.3.0
./autogen.sh
出错,因为google被墙了,所以无法下载gtest,所以手动下载gtest,解压后改名为gtest放在protobuf的解压目录里
https://github.com/google/googletest/archive/release-1.5.0.tar.gz
然后设置路径,编译安装./configure --prefix=/usr/local/protobuf/protobuf250
make && make check
======以下是安装3.3.0时碰到的问题,2.5.0没这个问题===============
在安装的过程出,出错,报错如下:
./google/protobuf/metadata_lite.h: In constructor ‘google::protobuf::internal::InternalMetadataWithArenaLite::InternalMetadataWithArenaLite(google::protobuf::Arena*)’:
./google/protobuf/metadata_lite.h:170: error: class ‘google::protobuf::internal::InternalMetadataWithArenaLite’ does not have any field named ‘InternalMetadataWithArenaBase’这是由于./src/google/protobuf/metadata_lite.h下的构造函数有问题,类似的参见这个bug:
#2559已经修复,
https://github.com/google/protobuf/pull/2599/commits/141a1dac6ca572056c6a8b989e41f6ee213f8445所以我们只用修改metadata_lite.h下的构造函数,修改170行,修改前记得先备份文件
修改完后,回退到之前的目录,然后安装===============================
make install
然后在/etc/profile.d/protobuf.sh中创建环境变量cd /usr/local/protobuf ln -s protobuf250 ./current
保存并重启电脑,验证安装是否成功####### add protobuf lib path ######## #home export PROTOBUF_HOME=/usr/local/protobuf/current #(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${PROTOBUF_HOME}/lib/ #(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径 export LIBRARY_PATH=$LIBRARY_PATH:${PROTOBUF_HOME}/lib/ #执行程序搜索路径 export PATH=$PATH:${PROTOBUF_HOME}/bin/ #c程序头文件搜索路径 export C_INCLUDE_PATH=$C_INCLUDE_PATH:${PROTOBUF_HOME}/include/ #c++程序头文件搜索路径 export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:${PROTOBUF_HOME}/include/ #pkg-config 路径 export PKG_CONFIG_PATH=${PROTOBUF_HOME}/lib/pkgconfig/ ######################################
protoc --version
安装findbugs1.3.9(hadoop所需的工具可以再hadoop文件夹中的BUILDING.txt里查看)
wget https://nchc.dl.sourceforge.net/project/findbugs/findbugs/1.3.9/findbugs-1.3.9.tar.gz
tar -zxvf findbugs-1.3.9.tar.gz
mkdir /opt/findbugs
mv findbugs-1.3.9 /opt/findbugs/
ln -s findbugs-1.3.9 ./current
在/etc/profile.d/findbugs.sh中创建环境变量
====================================================================================================export FINDBUGS_HOME=/opt/findbugs/current export PATH=$PATH:${FINDBUGS_HOME}/bin
- 安装hadoop
先去hadoop官网下载2.8.0的源码,并解压(试了2.8,因为glibc更新一直有问题,所以使用2.7.3,因为2.7.3的glibc是2.12版本,和ecs的glibc一致。)
wget http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.0/hadoop-2.8.0-src.tar.gz tar -zxvf hadoop-2.8.0-src.tar.gz
cd hadoop-2.8.0-src
编译
过程中遇到mvn clean package -Pdist,native,docs -DskipTests -Dtar
这类报错
Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.8.1:jar (module-javadocs) on project hadoop-hdfs有可能是java版本过高导致,也可以
换成命令行mvn package -Pdist,native -DskipTests-Dtar-Dmaven.javadoc.skip=true
注意:检查命令中-符号,而不是中文—,-Dmaven.javadoc.skip=true编译时略过创建javadoc
(有可能遇到多次无法解决依赖报错,可先强制更新Maven所有依赖,执行命令:mvn clean install -U,再执行上述命令行)
==========编译不成功=========总是报maven的findbugs插件某某问题,放弃。。。
===========================
因为hadoop2.8.0直接支持64位的系统,所以直接下载编译好的binary文件解压,并且安装到/opt/hadoop下,并把读权限分配给hadoop用户
wget http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.0/hadoop-2.8.0.tar.gz tar -zxvf hadoop-2.8.0.tar.gz mv hadoop-2.8.0 /opt/hadoop
chown -R hadoop:hadoop hadoop-2.8.0
ln -s hadoop-2.8.0 ./current
在/etc/profile.d/hadoop.sh中创建环境变量chown -R hadoop:hadoop current
export HADOOP_HOME=/opt/hadoop/current export PATH=$PATH:${HADOOP_HOME}/bin
查看安装是否成功
修改hadoop配置文件,在hadoop-2.8.0下的./etc/hadoop/hadoop-env.sh。看是否要调整export JAVA_HOME的值,这里无需调整hadoop version
创建文件夹
chown -R hadoop:hadoop hadoop-2.8.0 cd /usr/hadoop mkdir -p /opt/hadoop/hadoop/tmp mkdir -p /opt/hadoop/hadoop/hdfs mkdir -p /opt/hadoop/hadoop/hdfs/name mkdir -p /opt/hadoop/hadoop/hdfs/tmp mkdir -p /opt/hadoop/hadoop/hdfs/data
配置masters文件,可以填写master的hostname或者是公网或是专线ip,但建议公网地址配置slaves文件,同上,但只配置slave的信息master ip (or master hostname,推荐使用hostname,因为/etc/hosts里还有内网ip和公网ip区分)
hadoop启动。启动前需要确认防火墙,需要关闭防火墙。由于ECS默认防火墙关闭,所以不用处理。
hadoop初次启动时,需要先format namenode,运行命令:
在运行过程中遇到WARN报错hadoop namenode -format
报错:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable怀疑是库有问题,通过以下命令查看库版本
报错:./libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)ldd /lib/native/libhadoop.so.1.0.0
查看ECS支持的glibc版本
发现均低于2.14,因此需要安装2.14的glibc。strings /lib64/libc.so.6 |grep GLIBC_
到http://ftp.gnu.org/gnu/glibc/下载glibc-2.14.1.tar.gz
wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.1.tar.gz
tar -zxvf glibc-2.14.1.tar.gz
cd glibc-2.14.1
mkdir build cd build mkdir -p /opt/glibc/glibc-2.14.1 ../configure --prefix=/opt/glibc/glibc-2.14.1 make -j4
make install
=============================================================================================
安装hadoop 2.7.3
下载binary包
解压wget http://apache.fayea.com/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
tar -zxvf hadoop-2.7.3.tar.gz -C /opt/hadoop/
配置core-site,yarn-site,mapred-site,hdfs-site,master,slaves文件,并定义软连接,并将文件全部拷贝至其他slave,同以上2.8.0的操作。但不同版本配置文件结构不同, 2.7.3的如下(可以参考官网default.xml结构):cd /opt/hadoop/hadoop-2.7.3
这个链接里,有对0.23配置文件结构的中文比对说明:
core-site.xml <configuration> <!-- 默认值 file:///,设置Hadoop namenode的hostname及port,预设是Standalone mode,如果是伪分布式文件系统要设置成hdfs://localhost:9000,如果使用集群模式则配置为 hdfs://hostname:9000--> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <!-- 指定hadoop运行时产生文件的存储目录,默认值/tmp/hadoop-${user.name},会在tmp下根据username生成不同的目录--> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop/hadoop/tmp</value> </property> <!-- 這是读写 sequence file 的 buffer size, 可减少 I/O 次数。在大型的 Hadoop cluster,建议可设定为 65536 到 131072,默认4096--> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> </configuration> hdfs-site.xml <configuration> <!-- 指定HDFS副本的数量,和datanode个数有关,如果副本数大于datanode数是不会起效果的 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:50090</value> </property> <!-- 指定HDFS副本的数量,和datanode个数有关,如果副本数大于datanode数是不会起效果的 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- DFS name node 存放 name table 的目录.存放 naname table 和 dfs.namenode.edits.dir(存放 edit 文件),默认是同一个目录 --> <property> <name>dfs.namenode.name.dir</name> <value>file:/opt/hadoop/hadoop/hdfs/name</value> </property> <!-- DFS data node 存放数据 block 的目录 --> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/hadoop/hadoop/hdfs/data</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <configuration> yarn-site.xml <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--新框架中 NodeManager 与 RM 通信的接口地址--> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <!--NodeManger 需要知道 RM 主机的 scheduler 调度服务接口地址--> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <!--新框架中 NodeManager 需要向 RM 报告任务运行状态供 Resouce 跟踪,因此 NodeManager 节点主机需要知道 RM 主机的 tracker 接口地址--> <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> <!--新框架中各个 task 的资源调度及运行状况通过通过该 web 界面访问--> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> </configuration> mapred-site.xml <configuration> <!--新框架支持第三方 MapReduce 开发框架以支持如 SmartTalk/DGSG 等非 Yarn 架构,注意通常情况下这个配置的值都设置为 Yarn,如果没有配置这项,那么提交的 Yarn job 只会运行在 locale 模式,而不是分布式模式。--> <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>
启动hadoop
第一次启动的时候需要先格式化namenode
hadoop namenode -format
然后可以依次运行以下命令
启动namenode
查看logs目录下的.log日志可以看启动状态,使用./hadoop-daemon.sh start namenode
两条命令也可以检查启动情况。ps -ef | grep hadoop jps
启动datanode
同理secondarynamenode,以及trackjob也是这么启动。./hadoop-daemon.sh start datanode
一次性启动可以使用
./start-dfs.sh ./start-yarn.sh
如果正确启动,可以分别在hadoop账号下,jps,可以看到master和slave的启动状态。
查看集群状态:
同样也可以通过访问web查看集群状态hadoop dfsadmin -report
如果是外网访问
测试
hadoop fs -mkdir -p /stella/input hadoop fs -put wordcount.txt /stella/input hadoop jar /opt/hadoop/current/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /stella/input /stella/output hadoop fs -ls /stella/output hadoop fs -get /stella/output/part-r-00000
http://master:8088和http://master:50070的话,需要现在阿里云ECS里配置安全组规则,需要开放8088端口,且外网任何IP允许访问即可。
以下这两篇文章可以参考下:
http://blog.youkuaiyun.com/happy_wu/article/details/70240014
http://chengjianxiaoxue.iteye.com/blog/2306305
https://toutiao.io/posts/kk1wyz/preview 混合网络的配置