阿里云ECS部署hadoop

来源:互联网 发布:淘宝卖家可以开直播吗 编辑:程序博客网 时间:2024/05/21 19:45

[转]hadoop+zookeeper+hbase完全分布式搭建

http://blog.csdn.net/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

cat /etc/issue
结果:CentOS release 6.8 (Final)

通过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

cd /usr/local/jdk/
建立软连接,这样方便版本切换管理。建立软件接的命令是: ln -s 源文件或目录 链接

ln -s jdk1.7.0_80 ./current
通过命令ll -a可以查看到软连接创建完毕。

添加环境变量。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/currentexport CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jarexport PATH=${JAVA_HOME}/bin:$PATH
使用重启命令,重启系统,是环境变量生效。

reboot
或,只对root用户有效

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:off1:off2:on3:on4:on5:on6: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.0strings 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

解压文件

tar -zxvf apache-maven-3.5.0-bin.tar.gz
在/opt下建立maven文件夹,并将解压文件移动至文件夹下

mkdir /opt/mavenmv apache-maven-3.5.0 /opt/maven/
建立软连接

cd /opt/maven/ln -s apache-maven-3.5.0 ./current
在/etc/profile.d/下创建maven.sh,创建环境变量

export MAVEN_HOME=/opt/maven/currentexport PATH=${MAVEN_HOME}/bin:$PATH
用同样的方式安装ant 1.9.9,配置环境变量

wget http://mirrors.hust.edu.cn/apache//ant/binaries/apache-ant-1.9.9-bin.tar.gz

export ANT_HOME=/opt/ant/current

export 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
cd protobuf-3.3.0
protobuf编译前需要先运行

./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
cd /usr/local/protobufln -s protobuf250 ./current
然后在/etc/profile.d/protobuf.sh中创建环境变量

####### add protobuf lib path #########homeexport 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/currentexport 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.gztar -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.gztar -zxvf hadoop-2.8.0.tar.gzmv hadoop-2.8.0 /opt/hadoop
chown -R hadoop:hadoop hadoop-2.8.0
ln -s hadoop-2.8.0 ./current
chown -R hadoop:hadoop current

在/etc/profile.d/hadoop.sh中创建环境变量

export HADOOP_HOME=/opt/hadoop/currentexport PATH=$PATH:${HADOOP_HOME}/bin 

查看安装是否成功

hadoop version
修改hadoop配置文件,在hadoop-2.8.0下的./etc/hadoop/hadoop-env.sh。看是否要调整export JAVA_HOME的值,这里无需调整

创建文件夹

chown -R hadoop:hadoop hadoop-2.8.0cd /usr/hadoop mkdir -p /opt/hadoop/hadoop/tmpmkdir -p /opt/hadoop/hadoop/hdfsmkdir -p /opt/hadoop/hadoop/hdfs/namemkdir -p /opt/hadoop/hadoop/hdfs/tmpmkdir -p /opt/hadoop/hadoop/hdfs/data

配置masters文件,可以填写master的hostname或者是公网或是专线ip,但建议公网地址

master ip (or master hostname,推荐使用hostname,因为/etc/hosts里还有内网ip和公网ip区分)
配置slaves文件,同上,但只配置slave的信息

hadoop启动。启动前需要确认防火墙,需要关闭防火墙。由于ECS默认防火墙关闭,所以不用处理。

hadoop初次启动时,需要先format namenode,运行命令:

hadoop namenode -format
在运行过程中遇到WARN报错
报错:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

怀疑是库有问题,通过以下命令查看库版本

ldd /lib/native/libhadoop.so.1.0.0
报错:./libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)

查看ECS支持的glibc版本

strings /lib64/libc.so.6 |grep GLIBC_
发现均低于2.14,因此需要安装2.14的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 buildcd buildmkdir -p /opt/glibc/glibc-2.14.1../configure --prefix=/opt/glibc/glibc-2.14.1make -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/
cd /opt/hadoop/hadoop-2.7.3
配置core-site,yarn-site,mapred-site,hdfs-site,master,slaves文件,并定义软连接,并将文件全部拷贝至其他slave,同以上2.8.0的操作。但不同版本配置文件结构不同,2.7.3的如下(可以参考官网default.xml结构):

这个链接里,有对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

./hadoop-daemon.sh start namenode
查看logs目录下的.log日志可以看启动状态,使用

ps -ef | grep hadoopjps
两条命令也可以检查启动情况。

启动datanode

./hadoop-daemon.sh start datanode
同理secondarynamenode,以及trackjob也是这么启动。

一次性启动可以使用

./start-dfs.sh./start-yarn.sh

如果正确启动,可以分别在hadoop账号下,jps,可以看到master和slave的启动状态。

查看集群状态:

hadoop dfsadmin -report
同样也可以通过访问web查看集群状态

如果是外网访问


测试

hadoop fs -mkdir -p /stella/inputhadoop fs -put wordcount.txt /stella/inputhadoop jar /opt/hadoop/current/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /stella/input /stella/outputhadoop fs -ls /stella/outputhadoop fs -get /stella/output/part-r-00000


http://master:8088和http://master:50070的话,需要现在阿里云ECS里配置安全组规则,需要开放8088端口,且外网任何IP允许访问即可。


以下这两篇文章可以参考下:

http://blog.csdn.net/happy_wu/article/details/70240014

http://chengjianxiaoxue.iteye.com/blog/2306305

https://toutiao.io/posts/kk1wyz/preview  混合网络的配置