说明:本博文为博主自己的安装笔记,配置中的问题欢迎各位留言指出。转载请注明出处。 基本配置信息 集群信息(所有节点) 基于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验证。 Loading... 说明:本博文为博主自己的安装笔记,配置中的问题欢迎各位留言指出。转载请注明出处。 <h2>基本配置信息</h2> <h3>集群信息(所有节点)</h3> 基于virtualbox安装三台虚拟机,使用centos6.7操作系统, 主机名分别为:<em>master</em>、<em>slave1</em>、<em>slave2</em>。 对应的ip分别为:<em>192.168.1.201</em>、<em>192.168.1.202</em>、<em>192.168.1.203</em>。<!--more--> <h3>网络配置(所有节点)</h3> 网络连接使用<em>桥接到无线网卡</em>的方式。 进入网卡的设置文件:<code>vim /etc/sysconfig/network-scripts/ifcfg-eth0</code> 设置以下值:<code>ONBOOT=yes</code>、<code>BOOTPROTO=static</code>、<code>IPADDR=192.168.1.20?</code>。 此外在每个节点上设置host信息: <code>vim /etc/hosts</code> 在其后添加以下信息: <pre class="lang:default decode:true">192.168.1.201 master 192.168.1.202 slave1 192.168.1.203 slave2 </pre> 修改完成之后<code>reboot</code>重启。 <h3>添加hadoop用户(所有节点)</h3> 首先通过<code>groupadd hadoop</code>添加hadoop用户组。 添加hadoop用户并设置用户组为hadoop:<code>useradd -g hadoop hadoop</code>。 通过<code>passwd hadoop</code>为hadoop用户指定密码。 接下来将hadoop增加为sudo用户: 输入<code>vi /etc/sudoers</code>,找到<code>root ALL=(ALL) ALL</code>在其后添加一行为: <code>hadoop ALL=(ALL) ALL</code>。 <h3>SSH无密码登录(使用hadoop用户,先主节点再分节点)</h3> 切换到hadoop用户 在主节点上执行 <code>ssh-keygen -t rsa</code> 一路回车,生成无密码的密钥对。 将公钥添加到认证文件中:<code>cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys</code>,并设置authorized_keys的访问权限:<code>chmod 600 ~/.ssh/authorized_keys</code>。 在slave节点上的用户目录(hadoop)下面创建.ssh文件夹,并对这个文件夹通过使用<code>chmod 700 .ssh</code>设置.ssh文件夹的权限。 scp文件到所有slave节点: <code>scp ~/.ssh/authorized_keys hadoop@slave1:~/.ssh/</code> 测试: 在主节点上ssh slave1,正常情况下,不需要密码就能直接登陆进去了。 <h3>关闭防火墙与selinux(所有节点)</h3> 关闭防火墙 <code>sudo chkconfig iptables off</code> <code>sudo service iptables stop</code> 关闭SELinux <code>sudo vim /etc/selinux/config</code> 找到 <code>SELINUX=enforcing/permissive</code>改为<code>SELINUX=disabled</code>。 <h3>安装jdk(所有节点)</h3> 所有的机器上都要安装JDK,现在就先在master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以”root”的身份进行。 我们选用<code>jdk1.7_79</code>。 <h4>解压jdk进行安装</h4> 首先用root身份登录”master”后在/usr下创建”java”文件夹,再把用FTP上传到”/home/hadoop”下的jdk安装文件复制到”/usr/java”文件夹中。 <code>mkdir /usr/java</code> <code>cp /home/hadoop/jdk-7u79-linux-x64.tar.gz /usr/java</code> 接着进入”/usr/java”目录下通过下面命令使其jdk获得可执行权限,并安装JDK。 <code>chmod +x jdk-7u79-linux-x64.tar.gz</code> <code>tar -zvxf jdk-7u79-linux-x64.tar.gz</code> <h4>配置环境变量</h4> 编辑/etc/profile文件:<code>vim /etc/profile</code>。 在”/etc/profile”文件的尾部添加以下内容: <pre class="lang:default decode:true"># 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</pre> 输入<code>source /etc/profile</code>使配置生效。 <h3>安装hadoop</h3> 下载<em>hadoop-2.6.0.tar.gz</em>,使用root用户将其解压至<code>/usr/local</code> tar -xf hadoop-2.6.0.tar.gz -C /usr/local <h4>配置集群/分布式环境(hadoop用户,主节点)</h4> 集群/分布式模式需要修改<code>/usr/local/hadoop-2.6.0/etc/hadoop</code>中的5个配置文件,后四个文件可点击查看官方默认设置值,这里仅设置了正常启动所必须的设置项:slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml;配置java环境也需要更改文件hadoop-env.sh 1 文件slave: <code>cd /usr/local/hadoop-2.6.0/etc/hadoop</code> <code>vim slaves</code> 将原来的localhost删除,把所有slave的主机名写上,每行一个。例如我有两个slave节点,那么该文件的内容就是: <pre class="lang:default decode:true">slave1 slave2</pre> 2 文件core-site.xml,改为下面的配置: <pre class="lang:default decode:true"><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></pre> 3 文件hdfs-site.xml ,改为下面的配置: <pre class="lang:default decode:true"><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></pre> 4 文件mapred-site.xml,这个文件不存在,首先需要从模板中复制一份: <code>cp mapred-site.xml.template mapred-site.xml</code> 然后配置修改如下: <pre class="lang:default decode:true"><property> <name>mapreduce.framework.name</name> <value>yarn</value> </property></pre> 5 文件yarn-site.xml ,改为下面的配置: <pre class="lang:default decode:true"><property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property></pre> 6 文件hadoop-env.sh ,改为下面的配置: <code>export JAVA_HOME=/usr/java/jdk1.7.0_79</code> 配置好后,用scp命令将master上的hadoop文件复制到各个节点上。 <code>cd /usr/local</code> <code>rm -rf ./hadoop-2.6.0/tmp #删除hadoop临时文件</code> <code>scp -r ./hadoop-2.6.0 slave1:/usr/local</code> <code>scp -r ./hadoop-2.6.0 slave2:/usr/local</code> 在slave1、slave2 上执行: <code>sudo chown -R hadoop:hadoop /usr/local/hadoop-2.6.0</code> 截止目前,hadoop2.6的集群应该是可以正常运行了。第一次运行之前需要格式化,通过使用<code>bin/hdfs namenode -format</code>对hdfs系统进行格式化,然后再启动hadoop集群。 <h3>安装mysql服务器(主节点,root用户)</h3> 因为我没有设置dns服务器,所以,这时如果使用 <code>yum install mysql-server</code>的时候不能够正常下载(因为不能进行域名解析),所以,此时暂时设置一个dns服务器(因为多次试验发现,如果在没有网络的情况下,设置了dns服务器会造成zookeeper不能够正常工作,因此这次设置dns服务器只是为了下载软件暂时设置的。设置DNS服务器为114.114.114.114) 执行<code>vim /etc/resolv.conf</code> ,写入: <code>nameserver 114.114.114.114</code>,保存退出,重启网络服务即可。 执行<code>yum install mysql-server</code>安装mysql服务器。 <code>chkconfig mysqld on</code> 设置开机启动,并 <code>service mysqld start</code> 启动mysql服务,并根据提示设置root的初试密码: <code>mysqladmin -u root password 'xxxx'</code> 。 <code>mysql -uroot -pxxxx</code> 可以进入mysql的shell。 假如创建一个hive数据库,进入mysql执行以下命令: <pre class="lang:default decode:true">#hive create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</pre> 设置root授权访问以上所有的数据库: <pre class="lang:default decode:true">#授权root用户在主节点拥有所有数据库的访问权限 grant all privileges on *.* to 'root'@'n1' identified by 'xxxx' with grant option; flush privileges;</pre> <h3>配置NTP服务(root,所有节点)</h3> 集群中所有主机必须保持时间同步,如果时间相差较大会引起各种问题。 具体思路如下: master节点作为ntp服务器与外界对时中心同步时间,随后对所有slave节点提供时间同步服务。 所有slave节点以master节点为基础同步时间。 所有节点安装相关组件: <code>yum install ntp</code> 。完成后,配置开机启动: <code>chkconfig ntpd on</code> ,检查是否设置成功: <code>chkconfig --list ntpd</code>其中2-5为on状态就代表成功。 <h4>主节点配置</h4> 在配置之前,先使用ntpdate手动同步一下时间,免得本机与对时中心时间差距太大,使得ntpd不能正常同步。这里选用<code>ntp.sjtu.edu.cn</code>作为对时中心, <code>ntpdate -u ntp.sjtu.edu.cn</code> 。 ntp服务只有一个配置文件,配置好了就OK。 这里只给出有用的配置,不需要的配置都用#注掉,这里就不在给出: <pre class="lang:default decode:true">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</pre> 配置文件完成,保存退出,启动服务,执行如下命令: <code>service ntpd start</code> 检查是否成功,用<code>ntpstat</code>命令查看同步状态,出现以下状态代表启动成功: <pre class="lang:default decode:true">synchronised to NTP server () at stratum 2 time correct to within 74 ms polling server every 128 s</pre> 如果出现异常请等待几分钟,一般等待5-10分钟才能同步。 <h4>配置ntp客户端(所有slave节点)</h4> <pre class="lang:default decode:true">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</pre> ok保存退出,请求服务器前,请先使用<code>ntpdate</code> 手动同步一下时间:<code>ntpdate -u master</code> (主节点ntp服务器) 这里可能出现同步失败的情况,请不要着急,一般是本地的ntp服务器还没有正常启动,一般需要等待5-10分钟才可以正常同步。启动服务: <code>service ntpd start</code> 因为是连接内网,这次启动等待的时间会比master节点快一些,但是也需要耐心等待一会儿。 <h3>安装zookeeper(所有节点)</h3> 将zookeeper安装在<code>/usr/local/hadoop-2.6.0</code>下,使用3.4.7版本,使用hadoop用户进行解压。 将zookeeper的数据目录设置为<code>/usr/local/hadoop-2.6.0/zookeeper/data</code>。 <h4>设置myid</h4> 在dataDir指定的数据目录(<code>/usr/local/hadoop-2.6.0/zookeeper/data</code>)下,创建文件myid,文件内容为一个正整数值,用来唯一标识当前机器,因此不同机器的数值不能相同,建议从1开始递增标识,以方便记忆和管理。 通过使用echo命令直接写进去,如: <code>echo 1 > myid 或 echo 1 > /usr/local/hadoop-2.6.0/zookeeper/data/myid </code> <h4>修改conf/zoo.cfg</h4> 按下述内容,修改zookeeper配置文件(3台机器都需要,可以先配置好一台,然后通过scp等命令复制到其它机器上): <pre class="lang:default decode:true">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</pre> server.X 用来 配置 ZooKeeper 集群中的各节点,并建议 X 的值和 myid 保持一致。 端口 2181 用于监听客户端的连接,端口 2888 用于 Leader 监听 Follower 的连接,而 3888 则用于 Leader 选举。 <h4>启动zookeeper集群</h4> bin目录下的脚本zkServer.sh用来启动zookeeper集群,但需要带一个start参数,如:<code>./zkServer.sh start</code>。 启动过程中可以通过<code>tailf zookeeper.out</code>来查看即时的连接状态。 脚本 zkServer.sh 不但可以用来启动 ZooKeeper,还可以用来查看状态。使用方式为带 一个 status 参数,如: <code>./zkServer.sh status</code> <h3>安装HBase(所有节点)</h3> 选择HBase1.1.2版本,将下载下来的安装包上传到所有节点的<code>/usr/local/hadoop-2.6.0/</code>下,然后进行解压缩。 <h4>同步jar包版本(所有节点)</h4> 进入hbase的lib目录,查看hadoop jar包的版本 <code>cd hbase-1.1.2/lib</code>然后<code>find -name 'hadoop*jar'</code> 发现与hadoop集群的版本号不一致,需要用hadoop目录下的jar替换<code>hbase/lib</code>目录下的jar文件。 <code>hbase/lib</code> 目录下还有个 <code>slf4j-log4j12-XXX.jar</code>,在机器有装hadoop时,由于classpath中会有hadoop中的这个jar包,会有冲突,直接删除掉。 <h4>修改配置文件(所有节点)</h4> <code>vim conf/hbase-env.sh</code>设置如下: <pre class="lang:default decode:true">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</pre> 第一个参数指定了JDK路径;第二个参数指定了hadoop的配置文件路径;第三个参数设置是否使用hbase默认的zookeeper,因为这时我们已经配置好zookeeper,所以这项设置为false。 <code>vim conf/hbase-site.xml</code>设置如下: <pre class="lang:default decode:true"><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></pre> <code>vim conf/regionservers</code>设置如下: <pre class="lang:default decode:true">master slave1 slave2</pre> <h4>设置环境变量(所有节点)</h4> 这次顺便把hadoop的环境变量也设置了。 在<code>/etc/hosts</code>最后添加如下内容: <pre class="lang:default decode:true"># 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</pre> <h4>故障排除</h4> 上述设置完成之后,包括所有的节点都是设置一样的,我们按照 <code>hadoop >> zookeeper >> hbase</code>这样的顺序启动组件。我们发现hbase启动正常,但是当进入<code>hbase shell</code>的时候,会报错,报错信息如下: <pre class="lang:default decode:true">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</pre> 解决办法即:<code>将$HADOOP_HOME/share/hadoop/common/lib下的htrace-core-3.0.4.jar复制到$HBASE_HOME/lib下。</code> <h3>安装hive(主节点,hadoop)</h3> <h4>创建hive的mysql数据库</h4> 登录mysql 以root用户身份登录 <code>mysql -uroot -phaooop</code> 创建hive用户,数据库等: <pre class="lang:default decode:true">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;</pre> 退出mysql<code>exit;</code>。 验证hive用户输入:<code>mysql -uhive -phive</code>然后:<code>show databases;</code> 看到如下反馈信息,则说明创建成功: <pre class="lang:default decode:true">mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hive | | test | +--------------------+ 3 rows in set (0.00 sec)</pre> <code>exit</code>退出mysql。 <h4>安装hive</h4> 使用hive1.2.1版本,解压到<code>/usr/local/hadoop-2.6.0/</code>下,然后重命名为:hive-1.2.1。过程略。 设置环境变量。同样地在<code>/etc/hosts</code>文件的最后添加以下内容: <pre class="lang:default decode:true">export HIVE_HOME=/usr/local/hadoop-2.6.0/hive-1.2.1 export PATH=$PATH:$HIVE_HOME/bin</pre> <code>source /etc/profile</code>使其生效。 修改<code>hive-site.xml</code> 主要修改以下参数: <pre class="lang:default decode:true"><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></pre> <code>cp conf/hive-default.xml.template conf/hive-site.xml</code>编辑<code>hive-site.xml</code> 创建hive的临时文件夹:iotmp 拷贝<code>mysql-connector-java-5.1.38-bin.jar</code>到hive的lib下面 把jline-2.12.jar拷贝到hadoop相应的目录下,替代jline-0.9.94.jar,否则启动会报错 <code>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/</code> <code>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</code> 直接输入<code>hive</code>启动(hadoop启动的前提下)。 通过<code>hive --hiveconf hive.root.logger= DEBUG,console</code>定位错误。 <h3>安装mahout(主节点,hadoop)</h3> 使用mahout-0.11.1解压至<code>/usr/local/hadoop-2.6.0</code>过程略,设置环境变量如下: <pre class="lang:default decode:true "># 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</pre> <code>source /etc/profile</code>生效。 <h3>安装sqoop(主节点,hadoop)</h3> 使用sqoop1.4.6-hadoop-2.0.4-alpha。 首先是解压,解压至<code>/usr/local/hadoop-2.6.0/</code>下,然后上传<code>mysql-connector-java-5.1.38-bin.jar </code>到sqoop目录下的lib下面。 <h4>设置环境变量</h4> <code>vi /etc/profile</code> <pre class="lang:default decode:true "># 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</pre> zookeeper的环境变量是新补充的,跟sqoop的安装没有关系。 <code>source /etc/profile</code>使设置生效。 <h4>修改配置文件</h4> 在<code>$SQOOP_HOME/conf</code>目录下拷贝sqoop-env-template.sh改名为sqoop-env.sh <code>cp sqoop-env-template.sh sqoop-env.sh</code> <pre class="lang:default decode:true ">#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</pre> 修改<code>$SQOOP_HOME/bin/configure-sqoop</code>: 注释掉HCatalog,Accumulo检查(除非你准备使用HCatalog,Accumulo等HADOOP上的组件) <pre class="lang:default decode:true">## 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</pre> 此时就可以使用sqoop了,可以通过<code>sqoop help</code>验证。 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏