一、准备工作
虽然前面已经给出了Hadoop搭建的教程,但是因为这里要将Hadoop、HBase和Hive三者一起搭建,所以这里还是从头开始搭建一遍,需要准备的材料如下:
材料地址:https://pan.baidu.com/s/19s05T_aVTOi2i1Cpi_uQ1w 提取码:tzrm
下面开始解压这些压缩包,我这里事先在根目录新建一个临时存放压缩包的目录software,将上面8个文件全都拖进去,然后逐个解压到opt目录下,在对其简化一些解压后的名字,这里我就不做详细说明,相信你们都已经熟练操作解压步骤了,我只展示一下我修改后的目录名称:
[root@hadoop1 opt]# ll
total 40
drwxr-xr-x. 17 1106 4001 4096 Jun 26 18:22 hadoop
drwxr-xr-x. 32 1106 4001 4096 Jun 26 14:36 hbase
drwxr-xr-x. 11 1106 4001 197 Mar 28 2018 hive
drwxr-xr-x. 7 10 143 245 Jul 4 2019 java8
drwxr-xr-x. 10 1000 1000 4096 Jun 28 22:50 zookeeper
其中Mysql的两个压缩包我们先不管他们,后面配到Hive再来对它们进行解压。
二、hadoop搭建
1.配置主机名和主机列表
首先就是新建好一台虚拟机,配置好网络地址,我这里配置的是:192.168.234.111。下面开始修改hostname和hosts,以便后面远程连接时比较方便。下面我就简化步骤了,详细的可以看我之前写的hadoop环境搭建。
vi /etc/hostname
第一台的主机名就叫hadoop1。
然后配置主机列表:
vi /etc/hosts
我这里提前增加了三个主机名:hadoop1、hadoop2、hadoop3,为后面集群搭建要三台虚拟机做准备。
2.配置免密登录
这里我们可以先将私钥和免密登录设置好:
ssh-keygen -t rsa -P "" --生成私钥
cat .ssh/id_rsa.pub > .ssh/authorized_keys 复制成公钥
3.配置环境变量
因为我们后面需要用到jdk、hadoop、hbase、hive,所以这里配置环境变量就直接一次性配置完成,后面的复制虚拟机就可以不需要再对另外两台机器再次配置了。
export JAVA_HOME=/opt/java8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/dt.jar:$JAVA_HOME/tools.jar:$JAVA_HOME/rt.jar
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export HADOOP_HOME=/opt/hadoop
export HIVE_HOME=/opt/hive
export HBASE_HOME=/opt/hbase
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$HBASE_HOME/bin:$HIVE_HOME/bin
就这么几个,相信你们能记得下来,我这里每一个名称的使用都是我改过后的名字,注意一下。
4.配置hadoop配置文件
这里我就不在赘述了,相信你们已经搭了几百遍了,不清楚的可以继续参考我之前的hadoop环境搭建。然后就可以尝试启动hadoop,也可以用连接网页测试。
三、HBase配置
这里直接切到/opt/hbase/conf/下,然后开始配置相关文件。
1.配置hbase-site.xml文件
下面的配置信息可能很长,需要修改的部分我已经在后面加了注释,一共有两个地方。
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop1:9000/hbase</value> ----修改成自己的主机名
<description>The directory shared by region servers.</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1,hadoop2,hadoop3</value> ----集群的每一个主机名,这里可以提前写好,因为集群我们还没有配置
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>300</value>
</property>
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>70</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>60000</value>
</property>
<property>
<name>hbase.regionserver.restart.on.zk.expire</name>
<value>true</value>
<description>
Zookeeper session expired will force regionserver exit.
Enable this will make the regionserver restart.
</description>
</property>
<property>
<name>hbase.replication</name>
<value>false</value>
</property>
<property>
<name>hfile.block.cache.size</name>
<value>0.4</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.35</value>
</property>
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>8</value>
</property>
<property>
<name>hbase.server.thread.wakefrequency</name>
<value>100</value>
</property>
<property>
<name>hbase.master.distributed.log.splitting</name>
<value>false</value>
</property>
<property>
<name>hbase.regionserver.hlog.splitlog.writer.threads</name>
<value>3</value>
</property>
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>20</value>
</property>
<propetty>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
</property>
<property>
<name>hbase.hregion.memstore.mslab.enabled</name>
<value>true</value>
</property>
</configuration>
2.配置hbase-env.sh文件
export HBASE_HEAPSIZE=4000
export HBASE_OFFHEAPSIZE=1G
export JAVA_HOME=/opt/java8
export HBASE_OPTS="-Xmx4g -Xms4g -Xmn128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log" ----这里的Xmx4g -Xms4g是基于自己虚拟机设置的内存来配置的,因为我配置的是4096M(4G),所以这里写的是4G。
export HBASE_MANAGES_ZK=false
export HBASE_CLASSPATH=/opt/hadoop ----hadoop配置文件位置
这些参数文件里应该都是注释掉的,可以直接添加在文件的最后,但还是要看仔细,防止名称一样,路径不一样。
3.配置log4j.properties文件
hbase.root.logger=WARN,console
log4j.logger.org.apache.hadoop.hbase=WARN
这里需要自己找一下这两个配置,原本都是INFO,需要改成WARN。只对WARN以上级别的日志进行保存。
4.配置regionservers
这里就是加上集群的所有节点名就可以了。配置完后这里先不启动,先去搭建集群和配置zookeeper后再启动。
四、集群搭建
这里前面和之前hadoop集群搭建一样,只要注意修改主机地址、再次生成MAC地址、修改主机名。
完成后开始配置三台机器的远程连接。
另外两台机器也要配置好私钥、免密登录。然后实现远程连接:
ssh-copy-id -i .ssh/id_rsa.pub -p22 [email protected]
ssh-copy-id -i .ssh/id_rsa.pub -p22 [email protected]
然后另外两台也对其他两台进行连接。
1.修改hdfs-site.xml文件
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value> --改成3个副本
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop2:50090</value> ----hadoop2作为namenode的从元数据节点,合并NameNode的edit logs到fsimage文件中,
辅助NameNode将内存中元数据信息持久化
</property>
</configuration>
2.修改slaves文件
hadoop1
hadoop2
hadoop2
3.复制到另外两台机器上
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@hadoop2:/opt/hadoop/etc/hadoop/hdfs-site.xml
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@hadoop3:/opt/hadoop/etc/hadoop/hdfs-site.xml
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/slaves root@hadoop2:/opt/hadoop/etc/hadoop/slaves
[root@hadoop01 hadoop]# scp /opt/hadoop/etc/hadoop/slaves root@hadoop3:/opt/hadoop/etc/hadoop/slaves
这样我们集群就搭建完毕,下面可以开始配置zookeeper。
五、Zookeeper搭建
zookeeper是hadoop和hbase的一个重要组件。直接切到zookeeper目录下的conf目录。可以看到其目录下有一个zoo.cfg文件(如果不叫这个名字,可能是zoo.xxx.cfg,直接改成zoo.cfg就可以)。然后开始配置这个文件。
1.配置zoo.cfg文件
# The number of milliseconds of each tick
tickTime=2000 --时间单元
maxClientCnxns=0 ----这里是指单个客户端和单个服务器之间连接数的限制,我们将其设置成0,不作任何限制。
# The number of ticks that the initial
# synchronization phase can take
initLimit=50 ----集群中的服务器和主服务器之间的初始化连接时间,50表示50个tickTime时间
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5 ----主节点和分节点请求和应答时间
# the directory where the snapshot is stored.
dataDir=/opt/hadoop/zookeeperdata ----存储快照文件snapshot的目录
# the port at which the clients will connect
clientPort=2181 ----客户端连接server的端口号,一般设置为2181
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888 ----每台机器的服务器要与主机名对应
2.创建myid文件并启动zookeeper
配置完后,将这个文件复制到另外两台机器上,完成之后,在刚刚配置存储快照目录下面新建一个myid文件,里面写上对应的server号,例如hadoop1下的myid文件就要填入1。另外两台重复此步骤。配置完成后就可以启动zookeeper了:
[root@hadoop1 zookeeper]# ./bin/zkServer.sh start
3.启动hbase
成功启动zookeeper后,便可以开始启动hbase了,切到hbase目录下,输入命令启动hbase:
start-hbase.sh
能够成功启动就可以jps查看所有启动的进程,有下面几个:
[root@hadoop1 hbase]# jps
6626 Jps
3242 NameNode
4186 HMaster
3371 DataNode
2700 QuorumPeerMain
3612 ResourceManager
3710 NodeManager
4334 HRegionServer
zookeeper成功启动的进程是:2700 QuorumPeerMain
hbase成功启动的进程是:4186 HMaster 和 4334 HRegionServer
如果不能成功显示这些,因为报错的问题太不统一,这里如果有问题,需要自己去解决了qaq。
4.测试hbase
成功启动hbase后,我们可以测试一下hbase,输入命令:
hbase shell
跳出hbase编辑命令行,类似于mysql:
[root@hadoop1 hbase]# hbase shell
2020-06-29 00:58:03,948 INFO [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hbase/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.0-cdh5.14.2, rUnknown, Tue Mar 27 13:31:54 PDT 2018
hbase(main):001:0>
能够成功跳出此信息的,可以先查看一下当前的list信息,直接输入list回车,应该显示的是0rows,然后可以使用命令创建一个table:
create 'stu','name','age' ----table名stu,列字段名name 和age
然后回车,再次输入list查看一下,会显示table名:
hbase(main):001:0> create 'stu','name','age'
0 row(s) in 1.4660 seconds
=> Hbase::Table - stu
hbase(main):002:0> list
TABLE
aaa
hello1
stu
3 row(s) in 0.0150 seconds
=> ["aaa", "hello1", "stu"]
hbase(main):003:0>
我这里之前已经建了两个table了。所以一共是3rows。
5.最常见的异常
异常:Can’t get master address from ZooKeeper; znode data == null
这个问题会在hbase shell 跳出命令行后输入list产生,出现此问题,有一下两种可能
(1).zookeeper不稳定
这里的解决办法就是重启hbase,先stop掉,然后再start。
(2).三台机器的网络时间不同步
参考博客:ntp同步时间
六、Hive搭建
1.Mysql配置和创建用户和数据库
配置hive之前,先将两个Mysql的rpm文件进行解压,这里我就不多做说明,你们已经做烂了。
解压完之后,在mysql命令行输入:
use mysql;
create user 'bigdata'@'hadoop1' IDENTIFIED BY ’ok‘; ----创建用户
create database hive_metadata ----创建数据库
grant all privileges on "." to 'bigdata'@'hadoop1' ----给hadoop1的bigdata用户赋所有权限
flush privileges ----使赋权即时生效
ok之后开始配置hive配置文件。
2.修改hive-env.sh文件
切花到/opt/hive/conf目录下,修改hive-env.sh文件(这里可能是hive-env.sh.template文件,修改成hive-env.sh文件):
export HADOOP_HOME=/opt/hadoop
export HIVE_CONF_DIR=/opt/hive/conf
export HIVE_AUX_JARS_PATH=/opt/hive/lib
export JAVA_HOME=/opt/java8
添加这四个路径信息。
3.修改hive-site.xml文件
hive-site.xml文件是根据hive-default.xml.template 修改过后的,如果没有这个文件,需要自己写一个hive-site.xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" ?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/opt/hive/warehouse</value> ----hive目录
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value> ----是否是本地的hive库
</property>
<!-- 如果是远程mysql数据库的话需要在这里写入远程的IP或hosts -->
<property>
<name>javax.jdo.option.ConnectionURL</name> ----URL
<value>jdbc:mysql://127.0.0.1:3306/hive_metadata?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name> ----DRIVER
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name> ----USERNAME
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name> ----PASSWORD
<value>ok</value>
</property>
</configuration>
4.修改hive-log4j-properties文件
hive.log.threshold=ALL
hive.root.logger=WARN,DRFA
hive.log.dir=/opt/soft/hive/logs
hive.log.file=hive.log
5.上传Mysql的connecter的jar包
将mysql-connector-java-5.1.38.jar上传到/opt/hive/lib下。
资料链接:jar文件地址 提取码:2do2
6.创建hdfs文件夹,并赋予权限
hadoop fs -mkdir -p /opt/hive/warehouse ----创建warehouse目录
hadoop fs -chmod 777 /user/opt/warehouse ----赋权
hadoop fs -chmod -R 777 /opt/hive ----给hive也赋权
7.初始化hive并启动hive
schematool -dbType mysql -initSchema ----初始化
初始化成功后,直接输入:hive,然后就可以跳出hive命令行:
hive> show tables;
OK
aaa
Time taken: 3.888 seconds, Fetched: 1 row(s)
hive>
这里的aaa是我之前在Mysql那边建的一个aaa表,下面就可以使用mysql命令进行一系列操作了。
七、总结
讲实话,这么多操作,不练习个几十遍,怎么能记得住。这里面有太多的坑,需要自己一步一步百度搜答案,总之,加油吧!