【心血之作】linux虚拟机下安装配置Hadoop(完全分布式)生态环境(hadoop2.2.0,HBase0.98,Hive0.13(连接oracle),sqoop1.4.4(连接oracle)

来源:互联网 发布:手机优酷网络连接失败 编辑:程序博客网 时间:2024/06/05 18:52
最近因为实验室需要搭建Hadoop集群,上面需要运行hbase,hive,sqoop等工具。因为我之前也在网上看过很多帖子,这里我将我这一次搭建hadoop整个生态环境的过程记录下来, 用作学习交流。(初次写博客,有很多不成熟的地方希望指正)

本教程与网络上其他教程的区别之处在于我是先在一台虚拟机上配置好一个伪分布式的Hadoop生态环境,在测试过所有进程都能够正常运行后,在修改部分配置文件,而后进行虚拟机克隆,实现完全分布式的搭建。(如果你也是要在一台服务器上安装多个虚拟机来实现hadoop的完全分布式,那本文可以帮到你)

                                                                                                      一.安装包下载

首先本次环境搭建是在Virtualbox虚拟机上安装的Centos6.5(64位)系统上进行搭建,下面列出本次安装所用到的软件版本及下载链接:

jdk1.8.0_77 for Linux(64位)

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html(oracle官网)


Hadoop2.2.0(64位)  (注意:官网上下载的一般都是32位,64位需要手动编译,网上有相关教程,这里附上编译好的64位的安装包)
HBase0.98.17
Hive0.13.0
Sqoop1.4.4

http://pan.baidu.com/s/1c2NndoW(上述四个安装包下载地址)


                                                                                                        二.伪分布式环境搭建


说明:Hadoop和HBase的完全分布式需要在每个节点上都安装和配置,而每个节点的配置基本都相同;Hive只需要在master节点安装和配置就可以实现完全分布式的存储(因为hive是基于HDFS的),为了之后的配置方便,我们先进行单节点的配置,然后克隆节点,在稍作修改,就可以实现完全分布式了。


1.安装jdk

将安装包解压到一个文件夹下,这里为/home/lab422/jdk1.8.0_77


打开/etc/profile(vi /etc/profile)
在最后面添加如下内容:
JAVA_HOME=/home/lab422/jdk1.8.0_77
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOMECLASSPATH PATH


保存后使配置生效:

source  /etc/profile
验证是否安装成功:java  –version

(我这里因为centos系统自带Jdk1.7,我做了上述配置后java版本提示是1.7,并不是我下载的1.8,解决办法:先将系统内自带的jdk卸载,然后在配置自己的就行了,卸载jdk网上教程很多,这里不做介绍)


etc/init.d/iptables stop 关闭防火墙。

chkconfig iptables off 关闭开机启动。


2.hadoop安装
将下载的压缩包解压到一个文件夹下,这里为/home/lab422/hadoop-2.2.0
配置之前,需要在本地文件系统创建以下文件夹:
(~这里代表/home/lab422)
~/dfs/name
~/dfs/data

~/tmp


配置hadoop环境变量:

打开/etc/profile(vi /etc/profile)

在最后加上下列语句:
export HADOOP_HOME=/home/lab422/hadoop-2.2.0 
export HADOOP_MAPRED_HOME=$HADOOP_HOME
 export HADOOP_COMMON_HOME=$HADOOP_HOME
 export HADOOP_HDFS_HOME=$HADOOP_HOME 
 export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
 export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native" 
export YARN_HOME=$HADOOP_HOME  

export  PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin


执行source  /etc/profile ,使更改后的profile生效。


执行以下命令,赋予Hadoop运行的权限:(不执行此命令可能会去提示权限的问题,下同)

chmod 777 /home/lab422/hadoop-2.2.0/bin/* 

chmod 777 /home/lab422/hadoop-2.2.0/sbin/*


下面进行hadoop配置文件的配置:(所有的配置文件都在~/hadoop-2.2.0/etc/hadoop文件夹里)

hadoop-env.sh
修改JAVA_HOME值(export JAVA_HOME=/usr/java/jdk1.8)
yarn-env.sh
修改JAVA_HOME值(export JAVA_HOME=/usr/java/jdk1.8)
core-site.xml
<configuration>
                <property>
                                <name>fs.default.name</name>     (之前网上有教程这里写的是fs.defaultFS,但是配置后会出现namenode无法启动的情况)
                                <value>hdfs://localhost:9000</value>
                </property>
       <property>
                                <name>io.file.buffer.size</name>
                                <value>131072</value>
                </property>
       <property>
                                <name>hadoop.tmp.dir</name>
                                <value>file:/home/lab422/tmp</value>
                                <description>Abase for other temporary directories.</description>
                </property>
        <property>
               <name>hadoop.proxyuser.lab422.hosts</name>
               <value>*</value>
       </property>
                 <property>
               <name>hadoop.proxyuser.lab422.groups</name>
               <value>*</value>
       </property>
</configuration>

hdfs-site.xml
<configuration>
       <property>
                <name>dfs.namenode.secondary.http-address</name>
               <value>localhost:9001</value>
        </property>
         <property>
                  <name>dfs.namenode.name.dir</name>
                 <value>file:/home/hduser/dfs/name</value>
            </property>
           <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/home/hduser/dfs/data</value>
            </property>
            <property>
                     <name>dfs.replication</name>
                     <value>3</value>
             </property>
             <property>
                     <name>dfs.webhdfs.enabled</name>
                     <value>true</value>
         </property>
</configuration>

mapred-site.xml

<configuration>
                <property>
                                <name>mapreduce.framework.name</name>
                                <value>yarn</value>
                </property>
                <property>
                                <name>mapreduce.jobhistory.address</name>
                                <value>localhost:10020</value>
                </property>
                <property>
               <name>mapreduce.jobhistory.webapp.address</name>
               <value>localhost:19888</value>
       </property>
</configuration>

yarn-site.xml

<configuration>
                 <property>
               <name>yarn.nodemanager.aux-services</name>
               <value>mapreduce_shuffle</value>
        </property>
                 <property>
               <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
               <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>
        <property>
               <name>yarn.resourcemanager.address</name>
               <value>localhost:8032</value>
       </property>
                <property>
               <name>yarn.resourcemanager.scheduler.address</name>
               <value>localhost:8030</value>
               </property>
               <property>
                       <name>yarn.resourcemanager.resource-tracker.address</name>
                        <value>localhost:8031</value>
               </property>
               <property>
                    <name>yarn.resourcemanager.admin.address</name>
                        <value>localhost:8033</value>
               </property>
                <property>
               <name>yarn.resourcemanager.webapp.address</name>
               <value>localhost:8088</value>
       </property>
</configuration>
(注意上述<value>内的值开头不能有空格,否则系统会不识别。

PS:当初就因为resoucemanager配置时开头多了个空格,导致集群启动时没有resoucemanager进程没有启动)

启动验证
启动hadoop:
格式化namenode:hdfs namenode –format
启动集群:
运行命令:start-all.sh(这里因为还没进行ssh无秘钥登陆,所以启动每个进程可能都要输一遍密码)
用jps命令查看进程运行状态:

运行的进程应该有:jps ,namenode,ResourceManager,SecondaryNameNode,datanode,NodeManager


3.HBase安装
将安装包解压到一个文件夹下,这里为/home/lab422/hbase0.98.17

打开/etc/profile,添加以下内容:
 export HBASE_HOME=/home/lab422/hbase-0.98.17
 export  PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:  

 执行source /etc/profile ,使更改后的profile生效。

 执行以下命令,赋予Hbase运行的权限: 
chmod 777 /home/lab422/hbase-0.98.17/bin/*

打开HBASE_HOME/conf/hbase-env.sh,添加以下内容:

 export JAVA_HOME=/home/lab422/jdk1.8/ 

export HBASE_MANAGES_ZK=true 


 打开HBASE_HOME/conf/hbase-site.xml,添加以下内容:

 <property>    

    <name>hbase.rootdir</name>     

   <value>hdfs://localhost:9000/hbase-0.98.17</value>   

</property> 

  <property>       

<name>hbase.cluster.distributed</name>   

   <value>true</value>

  </property>  

 <property> 

  <name>hbase.master</name>

 <value>localhost:60000</value>

 </property> 

  <property>    

   <name>hbase.zookeeper.quorum</name>   

   <value>localhost</value> 

 </property>

启动验证

用如下命令启动和关闭Hbase: 

start-hbase.sh

 stop-hbase.sh  

注意:必须先启动Hadoop,再启动Hbase;先关闭Hbase,再关闭Hadoop


用jps命令查看进程状态:

运行的进程有:

jps ,namenode,ResourceManager,SecondaryNameNode,datanode,NodeManager,HMaster,HRegionServer,HQuorumPeer。


4.Hive安装
将安装包解压到一个文件夹下,这里为/home/lab422/hive-0.13.0

打开/etc/profile,添加以下内容:
 export HIVE_HOME=/home/lab422/hive-0.13.0 export  PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$HIVE_HOME/bin:$SQOOP_HOME/bin 


 执行source /etc/profile ,使更改后的profile生效。

 执行以下命令,赋予Sqoop运行的权限:
 chmod 777 /home/lab422/hive-0.13.0/bin/*

将oracle数据库的驱动包ojdbc6.jar放入 $HIVE_HOME/lib文件夹下。

找到HIVE_HOME/conf/hive-default.xml.template,并重命名为hive-site.xml,并修改其中内容:
 <property>      
<name>javax.jdo.option.ConnectionURL</name>   
      <value>jdbc:oracle:thin:@219.216.110.114:1521:orcl</value>                                               
<description>JDBC connect string for a JDBC metastore</description> 
</property>  
 <property> 
    <name>javax.jdo.option.ConnectionDriverName</name>     
<value>oracle.jdbc.driver.OracleDriver</value>                                                                                                                                       
  <description>Driver class name for a JDBC metastore</description> 
 </property> 
<property>   
   <name>javax.jdo.option.ConnectionUserName</name>    
 <value>system</value>    
  <description>username to use against metastore database</description>
 </property>  
 <property>     
 <name>javax.jdo.option.ConnectionPassword</name>  
   <value>(你的数据库密码)</value>    
  <description>password to use against metastore database</description>
 </property>

注:以上四项分别是:  数据库连接,数据库驱动名,用户名,密码。
 复制数据库驱动jar包到HIVE_HOME/lib目录。(我用的是ojdbc6.jar,在你的oracle安装目录中就可以找到,如果找不到可以上网找具体路径)

初始化hive元数据表:

schematool  -dbType  oracle  -initSchema


启动验证
可用hive命令进入hive的命令行界面


输入show databases命令查看hive中的数据库(默认的数据库只有default,test数据库是我自己建立的)



5.Sqoop安装
将安装包解压到一个文件夹下,这里为/home/lab422/sqoop-1.4.4

打开/etc/profile,添加以下内容: 
 export SQOOP_HOME=/home/lab422/sqoop-1.4.4  export  PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$SQOOP_HOME/bin

  执行source /etc/profile ,使更改后的profile生效。

 执行以下命令,赋予Sqoop运行的权限:
 chmod 777 /home/lab422/sqoop-1.4.4/bin/*

打开SQOOP_HOME/conf/sqoop-env.sh,添加以下内容:
 export HADOOP_COMMON_HOME=/home/lab422/hadoop-2.2.0
 export HADOOP_MAPRED_HOME= /home/lab422/hadoop-2.2.0/share/hadoop/mapreduce
 export HBASE_HOME=/home/lab422/hbase0.98.17
 export HIVE_HOME= /home/lab422/hive-0.13.0

启动验证
Sqoop无需启动即可使用,我们通过一条链接oracle数据库的命令,来验证Sqoop是否可用:  
(因为是连接oracle,因此需要将oracle数据库驱动ojdbc6.jar包放到  $SQOOP_HOME/lib  下)
sqoop list-tables --connect jdbc:oracle:thin:@219.216.110.120:1521:orcl --username SYSTEM -P          
或sqoop list-tables --connect jdbc:oracle:thin:@219.216.110.120:1521:orcl --username SYSTEM --password 你的密码
   (注意:1.username的值必须大写,因为oracle数据库中的数据库名都是大写存储的,即使你建立数据库用的是小写,此处也必须用大写,不然会找不到数据库
                   2.上述连接数据库语句第一个语句可以很好的保护你的数据库密码,不显式的输入密码)


                                                                                                    三.完全分布式环境配置
(先运行stop-all.sh命令,将集群停掉)

1.修改配置文件
(1)修改/etc/hosts(先分配IP地址,克隆好虚拟机后对每个虚拟机根据这文件之前分好的IP进行静态IP设置)

hosts文件内容:
127.0.0.1                      localhost
219.216.110.115        master
219.216.110.117        slave1
219.216.110.118        slave2
219.216.110.119        slave3

(2)修改slave文件

打开/home/lab422/hadoop-2.2.0/etc/hadoop/slave

将文件改成如下:
slave文件内容
slave1
slave2
slave3

(3)hbase的regionmanager
打开/home/lab422/hbase-0.98.17/conf/regionmanager

将文件改成如下:
regionmanager文件内容
slave1
slave2
slave3

(4)所有.xml配置文件<value>内的localhost都改为Master
(注:只有Hadoop和HBase里有涉及到localhost,所以上述文件只需修改这两个文件内的配置过的.xml即可)

2.虚拟机节点克隆
上述步骤将完全分布式需要修改的文件已经修改好,现在只需要克隆节点即可。(virtualbox节点克隆不会的网上有教程,这里不做介绍)
(!!!克隆虚拟机的时候一定要选择重新分配所有节点都Mac地址)

克隆后分别将节点名称由master改成slave1,slave2和slave3。
修改过程:
更改/etc/sysconfig下的network文件。分别进入每一个需要修改主机名的系统内,在提示符下输入vi /etc/sysconfig/network,然后将HOSTNAME后面的值改为想要设置的主机名。
重启后生效。
之后可以用hostname命令查看主机名。

然后是网络配置:
本集群采用的是桥接的上网方式,好处是每一个节点都将被当成一台真实的物理机,他的ip也是对外公开的,外网是可以Ping通这些节点的。

首先输入命令:sudo vi /etc/udev/rules.d/70-persistent-net.rules

将上一个eth0网卡内容注释掉,在将下面都eth1改成eth0

保存后重启(reboot)

(开机后ifconfig查看当前ip,MAC地址

输入命令:sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

修改相应参数:IP,mac地址,网关
我这里用的是静态ip,之前的/etc/hosts文件中已经规定了每一个节点的IP,此处就按照上述ip进行修改

使系统连接System eth0这个网

执行命令:sudo service network restart  使配置生效

此时电脑上方网络配置那个图标下留下System eth0,将其他都删掉就行了

3.配置ssh无秘钥登陆

centos自带ssh密码
每个节点都做如下操作:
ssh-keygen -t rsa  (一路回车)
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys (把id_rsa.pub追加到授权的key里面去)
此时修改权限(很关键!!失败好几次都是这个原因)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys 

命令:sudo vi /etc/ssh/sshd_config 
(修改SSH配置文件"/etc/ssh/sshd_config"),修改如下内容

RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

命令:service sshd restart(重新启动服务)
命令:ssh localhost  (测试是否成功)
应该会成功(之前就是没修改权限,导致本地无密钥登录还需要输入密码)

下面是把公钥复制到所有的slave节点上去:
命令:scp ~/.ssh/id_rsa.pub lab422@slave1:~/
(就是把master节点的公钥发送到了slave1的根目录下了)

到这里,我的master节点的公钥已经发送到了slave1的根目录下,现在登录slave1节点,在slave1节点虚拟机上操作下面的内容:

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
(这行命令是把master的公钥追加到Slave1.Hadoop的授权文件"authorized_keys"中去)

命令:sudo vi  /etc/ssh/sshd_config    
(修改ssh配置文件,和上面master节点配置方式一样,参考下上面的步骤,在此不在重复)

在master节点上使用命令:ssh slave1

应该会不用输密码就能登录slave1了

但是,之后我退出命令行窗口新建了一个命令行在测试,
提示Agent admitted failure to sign using the key.
而且又需要输入密码了,此时在master节点输入如下命令即可:
ssh-add

4.完全分布式集群启动验证
执行命令start-all.sh

master节点进程:

slave1节点进程:


执行命令start-hbase.sh

master节点进程:


slave1节点进程:


(说明:QuorumPeerMain进程是我安装的zookeeper的守护进程,本文中没有提到,如果按照本文的安装过程安装的话,slave节点上的该进程将会被hbase自带的HQuorumPeer进程取代)



0 0