Update at: 2017-06-03

最近发现了两款很不错的软件:Ambari 和 Cloudera Manager,于是尝试了以下 Ambari 发现比自己装不知道好了多少,于是乎更新了以下这篇博客,展示一下如何使用 Ambari 安装 Hadoop 系列软件。


根据我的了解,Ambari 有两个系列,分别是 Apache 的最初版本系列和 Hortonwork 出品的稍作改进版系列,因为之前一直在用 Hortonwork 的产品,所以我就选择了 Hortonwork 的版本,不过根据参考资料[5] 中的介绍,这两个版本差别不大,基本上共通的。

安装前准备

在真正安装 Ambari 之前,其实还是有很多准备工作的,下面就一一处理这些情况,想介绍一下环境,我计划安装三台服务器,分别是:

  1. 修改 hosts

    因为前面说了我有三台机器,所以我这里需要修改一下 hosts,修改后的 hosts 文件是:

     192.168.9.164 hdp-master
     192.168.9.165 hdp-slave1
     192.168.9.166 hdp-slave2
    
  2. 创建免密码登陆

    因为在安装各种服务的时候需要多机器安装,而我们的 Ambari 只安装在一台机器上,所以我们需要进行各个机器之间的无密码登陆,操作方法为:

    1. 登陆各个机器,创建 ssh 公私钥:

       ssh-keygen -t RSA
      

      然后一路回车就好了,完了之后你可以在 ~/.ssh/ 目录下发现多了几个文件:

      ls-al-ssh

    2. 添加公钥

      然后将每台机器的 ~/.ssh/id_rsa.pub 都复制到所有的机器中的文件 ~/.ssh/authorized_keys 中,例如我的环境:

      • 192.168.9.164 机器上的 ~/.ssh/id_rsa.pub 为:abc
      • 192.168.9.164 机器上的 ~/.ssh/id_rsa.pub 为:def
      • 192.168.9.164 机器上的 ~/.ssh/id_rsa.pub 为:ghi

        那么在每台机器上的 ~/.ssh/authorized_keys 都应该是:

        abc
        def 
        ghi
        

        一行一个公钥串

    1. 打开 ntp

      因为多机器之间时间需要同步,所以需要启用 ntp,操作步骤为:

        systemctl is-enabled ntpd
        systemctl enable ntpd
        systemctl start ntpd
      
    2. 打开防火墙

      因为 Hadoop 系的产品基本上都是集群的,所以有很多端口是需要互相访问的,我因为做了局域网限制,所以直接就把防火墙关掉了:

        service iptabels stop
      

安装 Ambari

做完准备工作,是时候开始安装 Ambari 了,根据下面的步骤开始呗:

  1. 设置 Ambari 源

     wget -nv http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.1.2.1/ambari.repo -O /etc/yum.repos.d/ambari.repo
     yum repolist
    

    敲完之后,你应该可以看到关于 Ambari 的源信息了。

  2. 安装 Ambari

     yum install ambari-server
    

    这期间可能需要确认安装 postgresql 等软件需要注意一下。

  3. 设置 Ambari

    安装完之后,是时候开始设置一下了,首先敲这个命令: ambari-server setup,然后一路确认下去。

  4. 启动 Ambari

    设置完成之后,我们就将 Ambari 启动起来吧:

     ambari-server start
     ambari-server status
    

安装 Hadoop

安装完 Ambari 之后,安装就很简单了,直接选择要安装的组件列表以及主机名称,就可以进行安装了。


以下为旧文内容

下载安装包

速度比较快的下载站:http://apache.uberglobalmirror.com

准备工作

创建用户

sudo addgroup hadoop 
sudo adduser --ingroup hadoop hadoop  
sudo gedit /etc/sudoers

root ALL=(ALL:ALL) ALL 的下面添加一行 hadoop ALL=(ALL:ALL) ALL,然后保存退出即可。

然后切换到 hadoop 账户:

su – hadoop

配置 SSH 免密码登录

sudo apt-get install openssh-server 
sudo /etc/init.d/ssh start
ssh-keygen -t rsa -P ""  
cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys

安装 JDK

sudo apt-get install openjdk-7-jdk  
java -version

安装 Hadoop

安装 hadoop 文件

su - hadoop  
cd /usr/local
sudo tar xzf hadoop-2.5.1.tar.gz  
sudo mv hadoop-2.5.1 /usr/local/hadoop  
sudo chown -R hadoop:hadoop hadoop

配置 Hadoop

sudo gedit hadoop/etc/hadoop/hadoop-env.sh

修改export JAVA_HOME=后面的内容,我的JDK路径为 /usr/lib/jvm/Java-7-openjdk-amd64

配置yarn-env.sh

sudo gedit hadoop/etc/hadoop/yarn-env.sh

修改 JAVA_HOME

配置环境变量

sudo vim /etc/profile

添加以下内容:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64  
export PATH=$PATH:/usr/lib/jvm/java-7-openjdk-amd64/bin  
export HADOOP_HOME=/usr/local/hadoop  
export PATH=$PATH:$HADOOP_HOME/bin  
export PATH=$PATH:$HADOOP_HOME/sbin  
export PATH=$PATH:$HADOOP_HOME/lib  
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop  
export YARN_HOME=/usr/local/hadoop  
export YARN_CONF_DIR=$YARN_HOME/etc/hadoop

生效配置

hadoop@mr-OptiPlex-780:/usr/local$ source /etc/profile  
hadoop@mr-OptiPlex-780:/usr/local$ source usr/local/hadoop/etc/hadoop-env.sh  
hadoop@mr-OptiPlex-780:/usr/local$ source usr.local/hadoop/etc/yarn-env.sh

确认环境变量

hadoop@mr-OptiPlex-780:/usr/local$ echo $PATH

配置core-site.xml

vim /usr/local/hadoop/etc/hadoop/core-site.xml

然后配置内容:

<configuration>    
  <property>    
     <name>fs.default.name</name>    
     <value>hdfs://localhost:9000</value>    
  </property>    
  <property>    
     <name>hadoop.tmp.dir</name>    
     <value>/usr/local/hadoop/tmp </value>    
  </property>    
</configuration>

配置hdfs-site.xml

vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml

内容为:

<configuration>    
  <property>    
    <name>dfs.namenode.name.dir</name>    
    <value>file:/home/hadoop/dfs/name</value>    
  </property>    
  <property>    
    <name>dfs.namenode.data.dir</name>    
    <value>file:/home/hadoop/dfs/data</value>    
  </property>    
  <property>    
    <name>dfs.replication</name>    
    <value>1</value>    
  </property>

新建mapred_site.xml

vim /usr/local/hadoop/etc/hadoop/mapred_site.xml

内容为:

<configuration>       
    <property>      
        <name>mapred.job.tracker</name>    
        <value>localhost:9001</value>       
    </property>    
</configuration>

启动Hadoop

hadoop namenode -format 
hadoop@mr-OptiPlex-780:/usr/local$ hadoop/sbin/start-dfs.sh  
hadoop@mr-OptiPlex-780:/usr/local/hadoop$ sbin/start-dfs.sh

验证

hadoop@mr-OptiPlex-780:/usr/local$ jps

出现这几项即为成功:

32160 SecondaryNameNode
32560 ResourceManager
4739 Jps
31779 NameNode
903 HMaster
31961 DataNode
1098 Main
32683 NodeManager

WEB界面

http://localhost:50070
http://localhost:8088

安装 HBase

使用 root 用户执行:

tar zxvf hbase-0.98.23-hadoop2-bin.tar.gz
mv hbase-0.98.23-hadoop2 /usr/local/hbase
cd /usr/local/hbase
vim conf/hbase-site.xml

里面内容:

<configuration>  
  ...  
  <property>  
    <name>hbase.rootdir</name>  
    <value>hdfs://localhost:9000/hbase</value>  
    <description>The directory shared by RegionServers.  
    </description>  
  </property>  
  <property>  
    <name>dfs.replication</name>  
    <value>1</value>  
    <description>The replication count for HLog & HFile storage. Should not be greater than HDFS datanode count.  
    </description>  
  </property>  
  ...  
</configuration>

然后尝试启动 HBase

使用 hadoop 用户执行:

export HBASE_HOME=/usr/local/hbase
export PATH=$HBASE_HOME/bin:$PATH
./bin/start-hbase.sh

安装 Hive

  1. MySQL数据库

    1. 安装参考http://www.cnblogs.com/liuchangchun/p/4099003.html
    2. 新建hive数据库,用户,赋予权限
       mysql -u root -p
       insert into user(Host,User,Password) values("localhost","hive",password("hive"));
       FLUSH PRIVILEGES;
       GRANT ALL PRIVILEGES ON *.*  TO 'hive'@'localhost' IDENTIFIED BY 'hive';
       FLUSH PRIVILEGES;
      
  2. 解压文件:

     wget https://archive.apache.org/dist/hive/hive-0.14.0/apache-hive-0.14.0-bin.tar.gz
     tar zxvf apache-hive-0.14.0-bin.tar.gz
     mv apache-hive-0.14.0-bin /usr/local/hive
    
  3. 添加 path

     vim /etc/profile
    

    添加内容:

     export HIVE_HOME=/usr/local/hive
     export PATH=$HBASE_HOME/bin:$HIVE_HOME/bin:$PATH
    
  4. 配置hive环境变量

     cp conf/hive-env.sh.template /bin/hive-env.sh
     cp conf/hive-default.xml.template conf/hive-site.xml
    
    • 修改 hive-env.sh
      • 指定 HADOOP_HOME=/usr/local/hadoop
    • 修改hive-site.xml文件,指定MySQL数据库驱动、数据库名、用户名及密码,修改的内容如下所示
        <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
          <description>JDBC connect string for a JDBC metastore</description>
        </property>

        <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
          <value>com.mysql.jdbc.Driver</value>
          <description>Driver class name for a JDBC metastore</description>
        </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>
          <description>password to use against metastore database</description>
        </property>

        <property>
          <name>hive.metastore.local</name>
          <value>true</value>
          <description></description>
        </property>

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

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

        <property>
            <name>hive.downloaded.resources.dir</name>
            <value>/usr/local/hive/iotmp</value>
            <description>Temporary local directory for added resources in the remote file system.</description>
        </property>
        export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64  
        export HADOOP_HOME=/usr/local/hadoop  
        export HIVE_HOME=/usr/local/hive
  1. 下载mysql-connector-java-5.1.27-bin.jar文件,并放到$HIVE_HOME/lib目录下

     wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.27/mysql-connector-java-5.1.27.jar
     mv mysql-connector-java-5.1.27.jar /usr/local/hive/lib/
    
  2. 在HDFS中创建/tmp和/user/hive/warehouse并设置权限

     hadoop fs -mkdir /tmp
     hadoop fs -mkdir /user/
     hadoop fs -mkdir /user/hive/
     hadoop fs -mkdir /user/hive/warehouse
     hadoop fs -chmod g+w /tmp
     hadoop fs -chmod g+w /user/hive/warehouse
    
  3. 启动hadoop。进入hive shell,输入一些命令查看

     hive> show databases;
     hive> show tables;
    
  4. 在hadoop中查看hive生产的文件

     hadoop dfs -ls /user/hive/warehouse
    

安装 Kafka

下载代码

下载 0.9.0.1 版本并解压。 (当前最新的稳定版本是0.9.0.1)

tar -xzf kafka_2.11-0.9.0.1.tgz
cd kafka_2.11-0.9.0.1/

启动服务

Kafka使用Zookeeper所以你可能先要安装一个ZooKeeper.你可以使用kafka中打包好的脚本或者一个配置好的Zookeeper.

> bin/zookeeper-server-start.sh config/zookeeper.properties
[2013-04-22 15:01:37,495] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)

现在可以启动Kafka了:

> bin/kafka-server-start.sh config/server.properties
[2013-04-22 15:01:47,028] INFO Verifying properties (kafka.utils.VerifiableProperties)
[2013-04-22 15:01:47,051] INFO Property socket.send.buffer.bytes is overridden to 1048576 (kafka.utils.VerifiableProperties)
...

新建一个话题Topic

Topic的名字叫”test”,只有一个分区和一个备份。

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

查看存在的Topic列表:

> bin/kafka-topics.sh --list --zookeeper localhost:2181
test

除了手工创建Topic,你也可以配置你的broker当发布一个不存在的topic时自动创建topic。

发送消息

Kafka提供了一个命令行的工具,可以从输入文件或者命令行中读取消息并发送给Kafka集群。每一行是一条消息。

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
This is a message
This is another message

消费消息

Kafka也提供了一个消费消息的命令行工具。

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
This is a message
This is another message

这些命令行工具有很多的选项,你可以查看他们的文档来了解更多的功能。

设置多个broker

目前我们运行在一个broker,不好玩,让我们来点大的。

首先为每个broker创建一个配置文件。

> cp config/server.properties config/server-1.properties
> cp config/server.properties config/server-2.properties

修改文件如下:

config/server-1.properties:
broker.id=1
port=9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
port=9094
log.dir=/tmp/kafka-logs-2

broker.id属性别重样。为了在一台机器上启动两个broker,改了一下它们的port的。
Zookeeper还在,上面用的broker还活着。 来启动这两个broker.

> bin/kafka-server-start.sh config/server-1.properties &
...
> bin/kafka-server-start.sh config/server-2.properties &
...

创建一个topic试试, 奢侈一把,把备份设置为3:

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

成了。运行 “describe topics” 命令瞧瞧:

> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0

第一行给出了分区的汇总信息。每个分区行给出分区信息。

来看看一开始创建的节点:

> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
Topic:test PartitionCount:1 ReplicationFactor:1 Configs:
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0

毫无新意,想必你已经明了了。

发布个消息:

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
...
my test message 1
my test message 2
^C

消费它:

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C

测试一下容错. 干掉leader,也就是Broker 1:

> ps | grep server-1.properties
7564 ttys002 0:15.91 /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java...
> kill -9 7564

Leader被切换到一个follower上节, 点 1 不会被列在isr中了,因为它死了:

> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 1,2,0 Isr: 2,0

但是,消息没丢啊,不信你试试:

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C

安装 Zookeeper

至此,Hadoop + HBase + Hive 就算集成完毕了,接下来就可以玩耍了。

Reference