Update at: 2017-06-03
最近发现了两款很不错的软件:Ambari 和 Cloudera Manager,于是尝试了以下 Ambari 发现比自己装不知道好了多少,于是乎更新了以下这篇博客,展示一下如何使用 Ambari 安装 Hadoop 系列软件。
根据我的了解,Ambari 有两个系列,分别是 Apache 的最初版本系列和 Hortonwork 出品的稍作改进版系列,因为之前一直在用 Hortonwork 的产品,所以我就选择了 Hortonwork 的版本,不过根据参考资料[5] 中的介绍,这两个版本差别不大,基本上共通的。
安装前准备
在真正安装 Ambari 之前,其实还是有很多准备工作的,下面就一一处理这些情况,想介绍一下环境,我计划安装三台服务器,分别是:
- hdp-master:192.168.9.164
- hdp-slave1:192.168.9.165
- hdp-slave2:192.168.9.166
修改 hosts
因为前面说了我有三台机器,所以我这里需要修改一下 hosts,修改后的 hosts 文件是:
192.168.9.164 hdp-master 192.168.9.165 hdp-slave1 192.168.9.166 hdp-slave2
创建免密码登陆
因为在安装各种服务的时候需要多机器安装,而我们的 Ambari 只安装在一台机器上,所以我们需要进行各个机器之间的无密码登陆,操作方法为:
登陆各个机器,创建 ssh 公私钥:
ssh-keygen -t RSA
然后一路回车就好了,完了之后你可以在
~/.ssh/
目录下发现多了几个文件:添加公钥
然后将每台机器的
~/.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
一行一个公钥串
- 192.168.9.164 机器上的 ~/.ssh/id_rsa.pub 为:
打开 ntp
因为多机器之间时间需要同步,所以需要启用 ntp,操作步骤为:
systemctl is-enabled ntpd systemctl enable ntpd systemctl start ntpd
打开防火墙
因为 Hadoop 系的产品基本上都是集群的,所以有很多端口是需要互相访问的,我因为做了局域网限制,所以直接就把防火墙关掉了:
service iptabels stop
安装 Ambari
做完准备工作,是时候开始安装 Ambari 了,根据下面的步骤开始呗:
设置 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 的源信息了。
安装 Ambari
yum install ambari-server
这期间可能需要确认安装 postgresql 等软件需要注意一下。
设置 Ambari
安装完之后,是时候开始设置一下了,首先敲这个命令:
ambari-server setup
,然后一路确认下去。启动 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
MySQL数据库
- 安装参考http://www.cnblogs.com/liuchangchun/p/4099003.html
- 新建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;
解压文件:
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
添加 path
vim /etc/profile
添加内容:
export HIVE_HOME=/usr/local/hive export PATH=$HBASE_HOME/bin:$HIVE_HOME/bin:$PATH
配置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数据库驱动、数据库名、用户名及密码,修改的内容如下所示
- 修改 hive-env.sh
<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>
- 修改hive/bin下的hive-config.sh文件,设置JAVA_HOME,HADOOP_HOME
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
下载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/
在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
启动hadoop。进入hive shell,输入一些命令查看
hive> show databases; hive> show tables;
在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
第一行给出了分区的汇总信息。每个分区行给出分区信息。
- “leader” 节点是1.
- “replicas” 信息,在节点1,2,0上,不管node死活,只是列出信息而已.
- “isr” 工作中的复制节点的集合. 也就是活的节点的集合.
来看看一开始创建的节点:
> 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 就算集成完毕了,接下来就可以玩耍了。