小十的个人博客

@小十

十分之十的小十

文章 339
朋友 14
来访 1814

LATEST POSTS

  • 郑州
  • www.xiaoten.com
  • 网站成立3232天

小十

  • 努力著

Hadoop三节点集群备忘

说明:本博文为博主自己的安装笔记,配置中的问题欢迎各位留言指出。转载请注明出处。

基本配置信息

集群信息(所有节点)

基于virtualbox安装三台虚拟机,使用centos6.7操作系统,

主机名分别为:masterslave1slave2

对应的ip分别为:192.168.1.201192.168.1.202192.168.1.203

网络配置(所有节点)

网络连接使用桥接到无线网卡的方式。

进入网卡的设置文件:vim /etc/sysconfig/network-scripts/ifcfg-eth0

设置以下值:ONBOOT=yesBOOTPROTO=staticIPADDR=192.168.1.20?

此外在每个节点上设置host信息:

vim /etc/hosts

在其后添加以下信息:

192.168.1.201   master
192.168.1.202   slave1
192.168.1.203   slave2

修改完成之后reboot重启。

添加hadoop用户(所有节点)

首先通过groupadd hadoop添加hadoop用户组。

添加hadoop用户并设置用户组为hadoop:useradd -g hadoop hadoop

通过passwd hadoop为hadoop用户指定密码。

接下来将hadoop增加为sudo用户:

输入vi /etc/sudoers,找到root ALL=(ALL) ALL在其后添加一行为:

hadoop ALL=(ALL) ALL

SSH无密码登录(使用hadoop用户,先主节点再分节点)

切换到hadoop用户

在主节点上执行 ssh-keygen -t rsa 一路回车,生成无密码的密钥对。

将公钥添加到认证文件中:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys,并设置authorized_keys的访问权限:chmod 600 ~/.ssh/authorized_keys

在slave节点上的用户目录(hadoop)下面创建.ssh文件夹,并对这个文件夹通过使用chmod 700 .ssh设置.ssh文件夹的权限。

scp文件到所有slave节点:

scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh/

测试: 在主节点上ssh slave1,正常情况下,不需要密码就能直接登陆进去了。

关闭防火墙与selinux(所有节点)

关闭防火墙

sudo chkconfig iptables off

sudo service iptables stop

关闭SELinux

sudo vim /etc/selinux/config

找到 SELINUX=enforcing/permissive改为SELINUX=disabled

安装jdk(所有节点)

所有的机器上都要安装JDK,现在就先在master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以”root”的身份进行。

我们选用jdk1.7_79

解压jdk进行安装

首先用root身份登录”master”后在/usr下创建”java”文件夹,再把用FTP上传到”/home/hadoop”下的jdk安装文件复制到”/usr/java”文件夹中。

mkdir /usr/java

cp /home/hadoop/jdk-7u79-linux-x64.tar.gz /usr/java

接着进入”/usr/java”目录下通过下面命令使其jdk获得可执行权限,并安装JDK。

chmod +x jdk-7u79-linux-x64.tar.gz

tar -zvxf jdk-7u79-linux-x64.tar.gz

配置环境变量

编辑/etc/profile文件:vim /etc/profile

在”/etc/profile”文件的尾部添加以下内容:

# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_79
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

输入source /etc/profile使配置生效。

安装hadoop

下载hadoop-2.6.0.tar.gz,使用root用户将其解压至/usr/local

tar -xf hadoop-2.6.0.tar.gz -C /usr/local

配置集群/分布式环境(hadoop用户,主节点)

集群/分布式模式需要修改/usr/local/hadoop-2.6.0/etc/hadoop中的5个配置文件,后四个文件可点击查看官方默认设置值,这里仅设置了正常启动所必须的设置项:slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml;配置java环境也需要更改文件hadoop-env.sh

1 文件slave:

cd /usr/local/hadoop-2.6.0/etc/hadoop

vim slaves

将原来的localhost删除,把所有slave的主机名写上,每行一个。例如我有两个slave节点,那么该文件的内容就是:

slave1
slave2

2 文件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-2.6.0/tmp</value>
		<description>Abase for other temporary directories.</description>
	</property>
</configuration>

3 文件hdfs-site.xml ,改为下面的配置:

<property>
	<name>dfs.namenode.secondary.http-address</name>
	<value>master:50090</value>
</property>
<property>
	<name>dfs.namenode.name.dir</name>
	<value>file:/usr/local/hadoop-2.6.0/tmp/dfs/name</value>
</property>
<property>
	<name>dfs.datanode.data.dir</name>
	<value>file:/usr/local/hadoop-2.6.0/tmp/dfs/data</value>
</property>
<property>
	<name>dfs.replication</name>
	<value>2</value>
</property>

4 文件mapred-site.xml,这个文件不存在,首先需要从模板中复制一份:

cp mapred-site.xml.template mapred-site.xml

然后配置修改如下:

<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

5 文件yarn-site.xml ,改为下面的配置:

<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>master</value>
</property>
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

6 文件hadoop-env.sh ,改为下面的配置:

export JAVA_HOME=/usr/java/jdk1.7.0_79

配置好后,用scp命令将master上的hadoop文件复制到各个节点上。

cd /usr/local

rm -rf ./hadoop-2.6.0/tmp #删除hadoop临时文件

scp -r ./hadoop-2.6.0 slave1:/usr/local

scp -r ./hadoop-2.6.0 slave2:/usr/local

在slave1、slave2 上执行:

sudo chown -R hadoop:hadoop /usr/local/hadoop-2.6.0

截止目前,hadoop2.6的集群应该是可以正常运行了。第一次运行之前需要格式化,通过使用bin/hdfs namenode -format对hdfs系统进行格式化,然后再启动hadoop集群。

安装mysql服务器(主节点,root用户)

因为我没有设置dns服务器,所以,这时如果使用

yum install mysql-server的时候不能够正常下载(因为不能进行域名解析),所以,此时暂时设置一个dns服务器(因为多次试验发现,如果在没有网络的情况下,设置了dns服务器会造成zookeeper不能够正常工作,因此这次设置dns服务器只是为了下载软件暂时设置的。设置DNS服务器为114.114.114.114)

执行vim /etc/resolv.conf ,写入:

nameserver 114.114.114.114,保存退出,重启网络服务即可。

执行yum install mysql-server安装mysql服务器。

chkconfig mysqld on 设置开机启动,并 service mysqld start 启动mysql服务,并根据提示设置root的初试密码: mysqladmin -u root password 'xxxx' 。

mysql -uroot -pxxxx 可以进入mysql的shell。

假如创建一个hive数据库,进入mysql执行以下命令:

#hive
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

设置root授权访问以上所有的数据库:

#授权root用户在主节点拥有所有数据库的访问权限
grant all privileges on *.* to 'root'@'n1' identified by 'xxxx' with grant option;
flush privileges;

配置NTP服务(root,所有节点)

集群中所有主机必须保持时间同步,如果时间相差较大会引起各种问题。 具体思路如下:

master节点作为ntp服务器与外界对时中心同步时间,随后对所有slave节点提供时间同步服务。

所有slave节点以master节点为基础同步时间。

所有节点安装相关组件: yum install ntp 。完成后,配置开机启动: chkconfig ntpd on ,检查是否设置成功: chkconfig --list ntpd其中2-5为on状态就代表成功。

主节点配置

在配置之前,先使用ntpdate手动同步一下时间,免得本机与对时中心时间差距太大,使得ntpd不能正常同步。这里选用ntp.sjtu.edu.cn作为对时中心, ntpdate -u ntp.sjtu.edu.cn 。

ntp服务只有一个配置文件,配置好了就OK。 这里只给出有用的配置,不需要的配置都用#注掉,这里就不在给出:

driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default nomodify notrap 
server ntp.sjtu.edu.cn prefer
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

配置文件完成,保存退出,启动服务,执行如下命令: service ntpd start

检查是否成功,用ntpstat命令查看同步状态,出现以下状态代表启动成功:

synchronised to NTP server () at stratum 2
time correct to within 74 ms
polling server every 128 s

如果出现异常请等待几分钟,一般等待5-10分钟才能同步。

配置ntp客户端(所有slave节点)

driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
#这里是主节点的主机名或者ip
server master
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

ok保存退出,请求服务器前,请先使用ntpdate 手动同步一下时间:ntpdate -u master (主节点ntp服务器)

这里可能出现同步失败的情况,请不要着急,一般是本地的ntp服务器还没有正常启动,一般需要等待5-10分钟才可以正常同步。启动服务: service ntpd start

因为是连接内网,这次启动等待的时间会比master节点快一些,但是也需要耐心等待一会儿。

安装zookeeper(所有节点)

将zookeeper安装在/usr/local/hadoop-2.6.0下,使用3.4.7版本,使用hadoop用户进行解压。

将zookeeper的数据目录设置为/usr/local/hadoop-2.6.0/zookeeper/data

设置myid

在dataDir指定的数据目录(/usr/local/hadoop-2.6.0/zookeeper/data)下,创建文件myid,文件内容为一个正整数值,用来唯一标识当前机器,因此不同机器的数值不能相同,建议从1开始递增标识,以方便记忆和管理。

通过使用echo命令直接写进去,如:

echo 1 > myid 或 echo 1 > /usr/local/hadoop-2.6.0/zookeeper/data/myid 

修改conf/zoo.cfg

按下述内容,修改zookeeper配置文件(3台机器都需要,可以先配置好一台,然后通过scp等命令复制到其它机器上):

tickTime=2000
dataDir=/usr/local/hadoop-2.6.0/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

server.X 用来 配置 ZooKeeper 集群中的各节点,并建议 X 的值和 myid 保持一致。

端口 2181 用于监听客户端的连接,端口 2888 用于 Leader 监听 Follower 的连接,而 3888 则用于 Leader 选举。

启动zookeeper集群

bin目录下的脚本zkServer.sh用来启动zookeeper集群,但需要带一个start参数,如:./zkServer.sh start

启动过程中可以通过tailf zookeeper.out来查看即时的连接状态。

脚本 zkServer.sh 不但可以用来启动 ZooKeeper,还可以用来查看状态。使用方式为带

一个 status 参数,如: ./zkServer.sh status

安装HBase(所有节点)

选择HBase1.1.2版本,将下载下来的安装包上传到所有节点的/usr/local/hadoop-2.6.0/下,然后进行解压缩。

同步jar包版本(所有节点)

进入hbase的lib目录,查看hadoop jar包的版本

cd hbase-1.1.2/lib然后find -name 'hadoop*jar'

发现与hadoop集群的版本号不一致,需要用hadoop目录下的jar替换hbase/lib目录下的jar文件。

hbase/lib 目录下还有个 slf4j-log4j12-XXX.jar,在机器有装hadoop时,由于classpath中会有hadoop中的这个jar包,会有冲突,直接删除掉。

修改配置文件(所有节点)

vim conf/hbase-env.sh设置如下:

export JAVA_HOME=/usr/java/jdk1.7.0_79
export HBASE_CLASSPATH=/usr/local/hadoop-2.6.0/etc/hadoop
export HBASE_MANAGES_ZK=false

第一个参数指定了JDK路径;第二个参数指定了hadoop的配置文件路径;第三个参数设置是否使用hbase默认的zookeeper,因为这时我们已经配置好zookeeper,所以这项设置为false。

vim conf/hbase-site.xml设置如下:

<configuration>
	<property>
		<name>hbase.rootdir</name>
		<value>hdfs://master:9000/hbase</value>
	</property>
	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>
	<property>
		<name>hbase.tmp.dir</name>
		<value>/usr/local/hadoop-2.6.0/hbase-1.1.2/tmp</value>
	</property>
	<property>
		<name>hbase.zookeeper.quorum</name>
		<value>master,slave1,slave2</value>
	</property>
</configuration>

vim conf/regionservers设置如下:

master
slave1
slave2

设置环境变量(所有节点)

这次顺便把hadoop的环境变量也设置了。

/etc/hosts最后添加如下内容:

# set hadoop environment
export HADOOP_HOME=/usr/local/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/bin

# set hbase environment
export HBASE_HOME=/usr/local/hadoop-2.6.0/hbase-1.1.2
export PATH=$PATH:$HBASE_HOME/bin

故障排除

上述设置完成之后,包括所有的节点都是设置一样的,我们按照

hadoop >> zookeeper >> hbase这样的顺序启动组件。我们发现hbase启动正常,但是当进入hbase shell的时候,会报错,报错信息如下:

ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
at org.apache.hadoop.hbase.master.HMaster.checkInitialized(HMaster.java:1754)
at org.apache.hadoop.hbase.master.MasterRpcServices.getTableNames(MasterRpcServices.java:852)
at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:41555)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2028)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:108)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:112)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:92)
at java.lang.Thread.run(Thread.java:745

解决办法即:将$HADOOP_HOME/share/hadoop/common/lib下的htrace-core-3.0.4.jar复制到$HBASE_HOME/lib下。

安装hive(主节点,hadoop)

创建hive的mysql数据库

登录mysql 以root用户身份登录

mysql -uroot -phaooop

创建hive用户,数据库等:

insert into mysql.user(Host,User,Password) values("localhost","hive",password("hive"));
create database hive;
grant all on hive.* to hive@'%'  identified by 'hive';
grant all on hive.* to hive@'localhost'  identified by 'hive';
grant all on hive.* to hive@'master' identified by 'hive';
flush privileges;

退出mysqlexit;

验证hive用户输入:mysql -uhive -phive然后:show databases;

看到如下反馈信息,则说明创建成功:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hive               |
| test               |
+--------------------+
3 rows in set (0.00 sec)

exit退出mysql。

安装hive

使用hive1.2.1版本,解压到/usr/local/hadoop-2.6.0/下,然后重命名为:hive-1.2.1。过程略。

设置环境变量。同样地在/etc/hosts文件的最后添加以下内容:

export HIVE_HOME=/usr/local/hadoop-2.6.0/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin

source /etc/profile使其生效。

修改hive-site.xml

主要修改以下参数:

<property> 
  <name>javax.jdo.option.ConnectionURL</name> 
  <value>jdbc:mysql://master:3306/hive</value> 
</property> 

<property> 
  <name>javax.jdo.option.ConnectionDriverName</name> 
  <value>com.mysql.jdbc.Driver</value> 
</property>

<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hive</value>
  <description>Username to use against metastore database</description>
</property>

<property> 
  <name>javax.jdo.option.ConnectionPassword</name> 
  <value>hive</value> 
</property>

<property> 
  <name>hive.hwi.listen.port</name> 
  <value>9999</value> 
  <description>This is the port the Hive Web Interface will listen on </descript ion> 
</property>

<property> 
  <name>datanucleus.autoCreateSchema</name> 
  <value>true</value> 
</property>

<property> 
  <name>datanucleus.fixedDatastore</name> 
  <value>false</value> 
</property> 

<property>
  <name>hive.exec.local.scratchdir</name>
  <value>/usr/local/hadoop-2.6.0/hive-1.2.1/iotmp</value>
  <description>Local scratch space for Hive jobs</description>
</property>

<property>
  <name>hive.downloaded.resources.dir</name>
  <value>/usr/local/hadoop-2.6.0/hive-1.2.1/iotmp</value>
  <description>Temporary local directory for added resources in the remote file system.</description>
</property>

<property>
  <name>hive.querylog.location</name>
  <value>/usr/local/hadoop-2.6.0/hive-1.2.1/iotmp</value>
  <description>Location of Hive run time structured log file</description>
</property>

cp conf/hive-default.xml.template conf/hive-site.xml编辑hive-site.xml

创建hive的临时文件夹:iotmp

拷贝mysql-connector-java-5.1.38-bin.jar到hive的lib下面

把jline-2.12.jar拷贝到hadoop相应的目录下,替代jline-0.9.94.jar,否则启动会报错

cp /usr/local/hadoop-2.6.0/hive-1.2.1/lib/jline-2.12.jar /usr/local/hadoop-2.6.0/share/hadoop/yarn/lib/

mv /usr/local/hadoop-2.6.0/share/hadoop/yarn/lib/jline-0.9.94.jar /usr/local/hadoop-2.6.0/share/hadoop/yarn/lib/jline-0.9.94.jar.bak

直接输入hive启动(hadoop启动的前提下)。

通过hive --hiveconf hive.root.logger= DEBUG,console定位错误。

安装mahout(主节点,hadoop)

使用mahout-0.11.1解压至/usr/local/hadoop-2.6.0过程略,设置环境变量如下:

# set mahout environment
export MAHOUT_HOME=/usr/local/hadoop-2.6.0/mahout-0.11.1
export PATH=$PATH:$MAHOUT_HOME/bin
export CLASSPATH=.:$CLASSPATH:$MAHOUT_HOME/lib

source /etc/profile生效。

安装sqoop(主节点,hadoop)

使用sqoop1.4.6-hadoop-2.0.4-alpha。

首先是解压,解压至/usr/local/hadoop-2.6.0/下,然后上传mysql-connector-java-5.1.38-bin.jar 到sqoop目录下的lib下面。

设置环境变量

vi /etc/profile

# set zookeeper environment
export ZOOKEEPER_HOME=/usr/local/hadoop-2.6.0/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf

# set sqoop environmet
export SQOOP_HOME=/usr/local/hadoop-2.6.0/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin

zookeeper的环境变量是新补充的,跟sqoop的安装没有关系。

source /etc/profile使设置生效。

修改配置文件

$SQOOP_HOME/conf目录下拷贝sqoop-env-template.sh改名为sqoop-env.sh

cp sqoop-env-template.sh sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/usr/local/hadoop-2.6.0

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/usr/local/hadoop-2.6.0

#set the path to where bin/hbase is available
export HBASE_HOME=/usr/local/hadoop-2.6.0/hbase-1.1.2

#Set the path to where bin/hive is available
export HIVE_HOME=/usr/local/hadoop-2.6.0/hive-1.2.1

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/usr/local/hadoop-2.6.0/zookeeper

修改$SQOOP_HOME/bin/configure-sqoop

注释掉HCatalog,Accumulo检查(除非你准备使用HCatalog,Accumulo等HADOOP上的组件)

## Moved to be a runtime check in sqoop.
#if [ ! -d "${HCAT_HOME}" ]; then
#  echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
#  echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
#fi

#if [ ! -d "${ACCUMULO_HOME}" ]; then
#  echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
#  echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
#fi
# Add HCatalog to dependency list
#if [ -e "${HCAT_HOME}/bin/hcat" ]; then
#  TMP_SQOOP_CLASSPATH=${SQOOP_CLASSPATH}:`${HCAT_HOME}/bin/hcat -classpath`
#  if [ -z "${HIVE_CONF_DIR}" ]; then
#    TMP_SQOOP_CLASSPATH=${TMP_SQOOP_CLASSPATH}:${HIVE_CONF_DIR}
#  fi
#  SQOOP_CLASSPATH=${TMP_SQOOP_CLASSPATH}
#fi

# Add Accumulo to dependency list
#if [ -e "$ACCUMULO_HOME/bin/accumulo" ]; then
#  for jn in `$ACCUMULO_HOME/bin/accumulo classpath | grep file:.*accumulo.*jar | cut -d':' -f2`; do
#    SQOOP_CLASSPATH=$SQOOP_CLASSPATH:$jn
#  done
#  for jn in `$ACCUMULO_HOME/bin/accumulo classpath | grep file:.*zookeeper.*jar | cut -d':' -f2`; do
#    SQOOP_CLASSPATH=$SQOOP_CLASSPATH:$jn
#  done
#fi

此时就可以使用sqoop了,可以通过sqoop help验证。

Comments | NOTHING

  游客,你好 修改资料

*邮箱和昵称必须填写