说明:本博文为博主自己的安装笔记,配置中的问题欢迎各位留言指出。转载请注明出处。
基本配置信息
集群信息(所有节点)
基于virtualbox安装三台虚拟机,使用centos6.7操作系统,
主机名分别为:
master、
slave1、
slave2。
对应的ip分别为:
192.168.1.201、
192.168.1.202、
192.168.1.203。
网络配置(所有节点)
网络连接使用
桥接到无线网卡的方式。
进入网卡的设置文件:vim /etc/sysconfig/network-scripts/ifcfg-eth0
设置以下值:ONBOOT=yes
、BOOTPROTO=static
、IPADDR=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
验证。