小十的个人博客

@小十

born for design, do what you want, and carpe diem

文章 343
朋友 17
来访 1840

LATEST POSTS

RANKINGS

    • http://www.xiaoten.com
    • 网站成立5375天

    小十

    • 努力著

    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

      游客,你好 修改资料

    *邮箱和昵称必须填写