工作中需要使用Hadoop环境,在三节点上搭建了一套Hadoop环境,顺便做下笔记。因为机器内存较低,没有使用CDH,为保证和线上环境一致,使用Hadoop等版本和CDH5.10的一致。
一、环境及软件准备
设置ip地址,hosts,ssh免密登录,scp,sudo,关闭防火墙,yum,ntp时间同步 略。
Java安装 略。
软件选择,这里选择的为CDH5.10中的软件版本。
hadoop-2.6.0.tar.gz
apache-hive-1.1.0-bin.tar.gz
hbase-1.2.0-bin.tar.gz
spark-1.6.0-bin-hadoop2.6.tgz
IP | 主机名 | 节点 |
192.168.30.100 | hadoop1 | zk ,NameNode,ResourceManager,NodeManager, SecondaryNameNode,spark,sparkHistory,HMaster |
192.168.30.101 | hadoop2 | zk,DataNode,NodeManager,spark,HRegionServer |
192.168.30.102 | hadoop3 | zk,DataNode,NodeManager,spark,HRegionServer |
二、ZooKeerper 集群安装
1、解压Zookeeper
tar xf zookeeper-3.3.6.tar.gz -C /home/hadoop
cd /home/hadoop
ln -s zookeeper-3.3.6 zookeeper
2、增加配置文件
(1)bin/zkEnv.sh,配置JDK(可选,如果存在多个JDK)
JAVA_HOME=/home/hadoop/java
(2)进入到zookeeper的conf/中,将zoo_sample.cfg拷贝成zoo.cfg,并添加如下内容:
tickTime=2000
dataDir=/home/hadoop/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
3、将zookeeper目录复制到其他节点上。
scp -r /home/hadoop/zookeeper hadoop@hadoop2:/home/hadoop
scp -r /home/hadoop/zookeeper hadoop@hadoop3:/home/hadoop
4、添加myid文件(每节点都需要)
mkdir data
echo "1" > data/myid
注意,每个节点myid文件要不一致
5、启动并测试
在3个节点上启动ZK服务
[hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/zookeeper-3.3.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@hadoop1 zookeeper]$ jps -l
10760 sun.tools.jps.Jps
10735 org.apache.zookeeper.server.quorum.QuorumPeerMain
进入ZK客户端测试
bin/zkCli.sh
三、Hadoop集群
1、解压软件
tar xf hadoop-2.6.0.tar.gz
ln -s hadoop-2.6.0 hadoop
2、修改配置文件
(1)、etc/hadoop/hadoop-env.sh,配置JDK(可选,如果存在多个JDK)
export JAVA_HOME=/home/hadoop/java
(2)、core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop/data/tmp</value>
</property>
</configuration>
(3)、hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hadoop/data/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hadoop/data/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop1:50090</value>
</property>
</configuration>
(4)、mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(5)、yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
(6)、slaves
hadoop1
hadoop2
hadoop3
2、创建目录文件
mkdir -p /home/hadoop/hadoop/data/name
mkdir -p /home/hadoop/hadoop/data/data
mkdir -p /home/hadoop/hadoop/data/tmp
3、复制Hadoop到其他节点
scp -r hadoop hadoop@hadoop2:/home/hadoop
scp -r hadoop hadoop@hadoop3:/home/hadoop
4、/etc/profile.d/hadoop.sh增加环境变量
export HADOOP_HOME=/home/hadoop/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
5、生效环境变量
source /etc/profile.d/hadoop.sh
6、初始化HDFS
bin/hadoop namenode -format
7、启动集群
sbin/start-all.sh
8、测试
bin/hadoop jar /home/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 5 10
求出pi就ok了
JobList http://hadoop1:8088
Hdfs http://hadoop1:50070
四、安装Spark
1、安装Scala
tar xf scala-2.10.6.tgz -C /home/hadoop/
cd /home/hadoop/
ln -s scala-2.10.6 scala
2、复制Scala到其他节点
scp -r scala hadoop@hadoop2:/home/hadoop/
scp -r scala hadoop@hadoop3:/home/hadoop/
3、/etc/profile.d/scala.sh设置环境变量
export SCALA_HOME=/home/hadoop/scala
export PATH=$PATH:$SCALA_HOME/bin
4、解压Spark
tar xf spark-1.6.0-bin-hadoop2.6.tgz -C /home/hadoop
cd /home/hadoop
ln -s spark-1.6.0-bin-hadoop2.6 spark
5、conf/spark-env.sh设置配置文件
export JAVA_HOME=/home/hadoop/java
export SCALA_HOME=/home/hadoop/scala
export HADOOP_HOME=/home/hadoop/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
6、复制到其他节点
scp -r spark hadoop@hadoop2:/home/hadoop/
scp -r spark hadoop@hadoop3:/home/hadoop/
7、/etc/profile.d/spark.sh设置环境变量
export SPARK_HOME=/home/hadoop/spark
export PATH=$PATH:$SPARK_HOME/bin
8、测试
/home/hadoop/spark/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--driver-memory 1g \
--executor-memory 1g \
--executor-cores 2 \
/home/hadoop/spark/lib/spark-examples-1.6.0-hadoop2.6.0.jar \
10
求出pi便ok了
如果使用JDK1.8可能报错
异常关键如下
ERROR client.TransportClient: Failed to send RPC 8305478367380188725 to /192.168.30.102:43246:
java.lang.IllegalStateException: Spark context stopped while waiting for backend
分析:
按照上述配置提供的信息,目测可能给节点分配的内存太小,yarn直接kill掉了进程,导致ClosedChannelException
解决方案:切换成1.7或修改yarn-site.xml,添加下列property
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
然后重启Yarn即可。
9、配置Spark History Server
(1)spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop1:9000/history
spark.eventLog.compress true
spark.eventLog.enabled:是否记录Spark事件,用于应用程序在完成后的筹够WebUI。
spark.eventLog.dir:设置spark.eventLog.enabled为true后,该属性为记录spark时间的根目录。在此根目录中,Spark为每个应用程序创建分目录,并将应用程序的时间记录到此目录中。用户可以将此属性设置为HDFS目录,以便History Server读取。
spark.eventLog.compress:是否压缩记录Spark事件,前提spark.eventLog.enabled为true,默认使用的是snappy。
(2)spark-env.sh
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=10 -Dspark.history.fs.logDirectory=hdfs://hadoop1:9000/history"
spark.history.ui.port=18080 调整WEBUI访问的端口号为18080
spark.history.fs.logDirectory=hdfs://hadoop1:9000/history 配置了该属性后,在start-history-server.sh时就无需再显示的指定路径
spark.history.retainedApplications=10 指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除
(2)创建HDFS目录
hadoop fs -mkdir /history
(3)启动进程
sbin/start-history-server.sh
SparkHistory http://hadoop1:18080
五、安装HBase
1、解压
tar xf hbase-1.2.0-bin.tar.gz -C /home/hadoop
cd /home/hadoop
ln -s hbase-1.2.0 hbase
2、hbase-env.sh
export JAVA_HOME=/home/hadoop/java
//告诉hbase使用外部的zk
export HBASE_MANAGES_ZK=false
export HBASE_PID_DIR=/home/hadoop/hbase/logs
3、hbase-site.xml
<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop1:9000/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
4、regionservers
hadoop2
hadoop3
5、复制到其他节点
scp -r hbase hadoop@hadoop2:/home/hadoop
scp -r hbase hadoop@hadoop3:/home/hadoop
6、/etc/profile.d/hbase.sh设置环境变量
export HBASE_HOME=/home/hadoop/hbase
export PATH=$PATH:$HBASE_HOME/bin
7、启动集群
bin/start-hbase.sh
管理界面 http://hadoop1:16010
六、安装HIVE
1、安装MySql
1、安装MySQL
yum install -y mysql-server
2、启动MySQL
service mysqld start
3、root登录新建新用户
mysql -u root -p
root初始密码为空,输入命令后直接回车即可。
mysql> use mysql;
mysql> update user set password = Password('root') where User = 'root';
mysql> create user 'hive'@'%' identified by 'hive';
mysql> grant all privileges on *.* to 'hive'@'%' with grant option;
mysql> flush privileges;
mysql> exit;
4、创建数据库
mysql> create database hive;
2、解压
tar xf apache-hive-1.1.0-bin.tar.gz -C /home/hadoop
cd /home/hadoop
ln -s apache-hive-1.1.0-bin hive
cd hive
cp conf/hive-log4j.properties.template conf/hive-log4j.properties
cp conf/hive-default.xml.template conf/hive-site.xml
3、/etc/profile.d/hive.sh环境变量
export HIVE_HOME=/home/hadoop/hive
export PATH=$HIVE_HOME/bin:$PATH
4、创建Hive数据文件目录:
hadoop fs -mkdir /tmp
hadoop fs -mkdir /user/hive/warehouse
hadoop fs -chmod 777 /tmp
hadoop fs -chmod 777 /user/hive/warehouse
其中/tmp用于存放一些执行过程中的临时文件,/user/hive/warehouse用于存放Hive进行管理的数据文件。
5、配置文件
hive-site.xml(修改如下配置)
<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.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
6、添加MySql的jar包
wget http://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar
cp mysql-connector-java-5.1.38.jar /home/hadoop/hive/lib
7、初始化MySql库
bin/schematool -dbType mysql -initSchema
此时可能会报错
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
原因是hadoop目录下存在老版本jline,解决方案,将hive下的新版本jline的JAR包拷贝到hadoop下
mv /home/hadoop/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar /home/hadoop/hadoop/share/hadoop/yarn/lib/jline-0.9.94.jar.bak
cp lib/jline-2.12.jar /home/hadoop/hadoop/share/hadoop/yarn/lib/
8、启动服务
创建临时文件目录
mkdir /home/hadoop/hive/tmp
nohup bin/hive --service hiveserver2 >> tmp/hive-hiveserver2.log 2>&1 &
nohup bin/hive --service metastore >> tmp/hive-metastore.log 2>&1 &
9、启动Shell测试
bin/hive shell
启动报错的话
Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
搜索hive-site.xml中所有system:java.io.tmpdir,并指定到/home/hadoop/hive/tmp即可
10、安装管理端
HWI的运行需要依赖两个包:hive-hwi-<version>.jar和hive-hwi-<version>.war,这两个包应该都部署在$HIVE_HOME/lib目录下。但Hive的安装包lib目录下可能没有提供hive-hwi-<version>.war,解决办法很简单,下载Hive的源码,进入源码的\hwi\web\目录下,将该目录下的文件夹和文件压缩成zip包,再重命名为hive-hwi-<version>.war,放到$HIVE_HOME/lib目录下即可。
(1)解压apache-hive-1.1.0-src.tar.gz
tar xf apache-hive-1.1.0-src.tar.gz
(2)创建压缩文件
cd apache-hive-1.1.0-src/hwi/web
zip -r hive-hwi-1.1.0.war ./*
cp hive-hwi-1.1.0.war /home/hadoop/hive/lib
(3)hive-site.xml(修改如下配置)
<property>
<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hive.hwi.listen.port</name>
<value>9999</value>
</property>
<property>
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-1.1.0.war</value>
</property>
(4)启动服务
复制JDK的tool到HIVE的lib目录(不然进入图形会报错)
Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK.
复制JDK的tool到HIVE的lib目录
cp $JAVA_HOME/lib/tools.jar $HIVE_HOME/lib/
启动服务
nohup bin/hive --service hwi >> tmp/hive-hwi.log 2>&1 &
管理界面 http://hadoop1:9999/hwi/