手把手教你搭建hadoop+hive测试环境(新手向)

本文由网易云 发布。

作者:唐雕龙

本篇文章仅限内部分享,如需转载,请联系网易获取授权。


面向新手的hadoop+hive学习环境搭建,加对我走过的坑总结,避免大家踩坑。

对于hive相关docker,并没有官方的docker,第三方维护经过测试各种不靠谱,所以才想到自己搭建一套,然后后期在整理成docker上传~~~


基础环境:

1. 公司云主机debain8.8 (不像docker,所以对系统内核无要求)


1. 前置安装:

1.1 jdk8(hive要求jdk7以上,千万不要jdk9!!!!!详情见末尾作死一)1.2 hadoop 2.7.X以上1.3 mysql或者postgresql(作为hive metastore的数据库)


2. 安装hadoop:

1.安装metastore所用到数据库。

对于mysql或者postgresql就偷懒直接docker pull 然后docker run了一个出来。毕竟仅仅作为hive元信息储存角色。

docker pull mysql:5.7

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=XXX -d mysql:5.7


2.jdk版本升级。

官方下载jdk8的二进制包,使用whichjava查看系统自带java目录下载好的二进制包直接解压后编辑etc/profile文件设置java相关的环境变量.

export JAVA_HOME=/xx/xx/jdk8 

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

编辑完后记得source /etc/profile,接着运行java -version确认是否成功


3.增加hadoop安装用户

官方建议增加hadoop用户组以及hadoop用户,我也建议这样做,但是公司云主机的话我就直接用我们有数的公共账号。


4.安装ssh服务器

hadoop使用到了ssh,所以需要

apt-get install openssh-server

然后测试

ssh localhost #会生成.ssh文件夹

并且配置ssh无密码登陆

cd /home/XXXX/.ssh/ #XX为你的用户名,比如有数账号是youdata,XXX就是youdata 

ssh-keygen -t rsa# 一路按回车就可以

cat ./id_rsa.pub >> ./authorized_keys # 加入授权

在执行一下ssh localhost 确保配置成功。


5.hadoop服务安装

直接找到官方下载url,wget下来我用的是:

wget heep://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

顺便也把hive下载下来吧

wget http://mirror.bit.edu.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz

下载过后解压即可,最好选择挂载的比较大云硬盘上。然后记得对你的安装用户给权限。

sudo chown -R hadoop ./hadoop#hadoop为用户,第二个为解压后的文件夹名

然后进入hadoop目录下,执行

./bin/hadoop version

如果成功就说明下载的hadoop是可用的。 接下来修改hadoop配置达到单机伪分布式启动.所谓伪分布式就是在单机上以分离的java进程运行,节点同时扮演NameNode和DataNode,读取的是HDFS中的文件。


6.hadoop伪分布式配置

Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-

site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

6.1. core-site.xml修改:

       hadoop.tmp.dir

       file:/usr/local/hadoop/tmp

       fs.defaultFS

      hdfs://localhost:9000

其中目录同样推荐放在空间较大的盘上。并且确保用户有权限,所以最好用当前用户建一个~~

6.2. hdfs-site.xml修改:

       dfs.replication

       1

       dfs.namenode.name.dir

       file:/usr/local/hadoop/tmp/dfs/name

       dfs.datanode.data.dir

       file:/usr/local/hadoop/tmp/dfs/data

同样的,这两个文件目录最好自己指定并且用当前用户建,指定的好处是避免误删导致hadoop需要重新format.


7.初始化hadoop节点

配置完后在hadoop目录下执行

./bin/hdfs namenode -format

成功后可以看到Exitting with status 0

坑一: 启动时候提示:ssh: Could not resolve hostname xxx,设置hadoop环境变量即可解决

export HADOOP_HOME=/usr/local/hadoop

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

启动日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以应该查看这个后缀为 .log 的文件;


8.hadoop服务启动

启动hadoop执行:

./sbin/start-dfs.sh

启动成功后执行jps,可以看到

youdata@hzadg-youdata-test:/srv/nbs/0/hadoop$ jps 

35664 SecondaryNameNode

52310 Jps

35320 NameNode

35485 DataNode

会出现 “NameNode”、”DataNode” 和 “SecondaryNameNode” 要关闭hadoop执行

./sbin/stop-dfs.sh

额外的启动Yarn:YARN 是从 MapReduce 中分离出来的,负责资源管理与任务调度。YARN 运行于 MapReduce 之上,提供了高可用性、高扩展性 上述通过 ./sbin/start-dfs.sh 启动 Hadoop,仅仅是启动了 MapReduce 环境,我们可以启动YARN ,让 YARN 来负责资源管理与任务调度。 编辑/etc/hadoop/mapred-site.xml

       mapreduce.framework.name

       yarn

接着修改yarn-site.xml

       yarn.nodemanager.aux-services

       mapreduce_shuffle

然后启动mapreduce即上面的

./sbin/start-dfs.sh # 启动MapReduce

./sbin/start-yarn.sh # 启动YARN

./sbin/mr-jobhistory-daemon.sh start historyserver #开启历史服务器,才能在Web中查看任务运行情况

YARN 有个好处是可以通过 Web 界面查看任务的运行情况:http://localhost:8088/cluster至此hadoop安装完毕,接下来安装hive.


3. 安装hive:

1.对hive基本介绍

metadata: 即元数据。元数据包含用Hive创建的database、table等的元信息。元数据存储在关系型数据库中。如Derby、MySQL等。 Metastore:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即 可 。然 后 对 于 metastore 有 三 种 配 置 方 式 : 

1.内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接                                                                                                                                                     

2.本地元存储和远程元存储都采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server.在这里我们使用MySQL。                                                                                                                                     

3.本地元存储和远程元存储的区别是:本地元存储不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。

2.hive配置

hive配置文件位于解压目录下的conf里 1.修改hive-env.sh 

export JAVA_HOME=/opt/java ##Java路径

export HADOOP_HOME=/opt/hadoop ##Hadoop安装路径

export HIVE_HOME=/opt/hive ##Hive安装路径

export HIVE_CONF_DIR=/opt/hive/conf ##Hive配置文件路径

2.创建hdfs目录并赋予权限

hdfs dfs -mkdir -p /user/hive/warehouse 

hdfs dfs -mkdir -p /user/hive/tmp

hdfs dfs -mkdir -p /user/hive/log

hdfs dfs -chmod g+w /user/hive/warehouse 

hdfs dfs -chmod g+w /usr/hive/tmp

hdfs dfs -chmod g+w /usr/hive/log

3.修改hive-site.xml 将 hive-site.xml 文件中以下几个配置项的值设置成上一步中创建的几个路径,同样建议放于空间较大的盘上

       hive.exec.scratchdir

       /user/hive/tmp

       hive.metastore.warehouse.dir

       /user/hive/warehouse

       hive.querylog.location

       /user/hive/log

4.增加metastore使用到的数据库相关连接信息的配置,修改hive-site.xml

       javax.jdo.option.ConnectionURL

       jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncodig=UTF-8&useSSL=

       javax.jdo.option.ConnectionDriverName

       com.mysql.jdbc.Driver

       javax.jdo.option.ConnectionUserName

       hive

       javax.jdo.option.ConnectionPassword

       hive

运行Hive 在命令行运行 hive 命令时必须保证以下两点: HDFS 已经启动。可以使用 start-dfs.sh 脚本来启动 HDFS。MySQL jdbc jar包添加到 $HIVE_HOME/lib 目录下。 然后在hive目录下,执行

./bin/schematool-dbtype mysql-initSchema

执行成功后就可以执行hive看成功了吗

./bin/hive

启动hive服务则是

./bin hive --service hiveserver2 &

测试用beeline连接,如果出现类似

org.apache.hive.service.cli.HiveSQLException: Failed to open new session: java.lang.RuntimeException: org.apache

就是你这个用户不允许伪装为 anonymous(hive的默认用户,默认配置可以查看)。 修改hadoop的core-site.xml文件增加

       hadoop.proxyuser.XXX.hosts

       *

       hadoop.proxyuser.XXX.groups

      *

即可,XXX是你的用户名,然后重启hadoop. 至此,hadoop+hive测试环境就已经搭建完成。 额外的:

作死一:好奇使用jdk9

因为jdk9还不成熟,并且我直观上对之前老版本编译出的jar包有些不兼容,比如

Exception in thread "main" java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoa

这个还能搜到原因,是因为jdk9的 将URLClassLoader 作为系统的ClassLoaders的superclass导致,所以之前用到他两转化的都会出错需要重写代码。 又或者:

java.lang.Integer (jdbc-type="", sql-type="") cant be mapped for this datastore. No mapping is available.

在使用mysql作为metastore时候报错,使用到的mysqljdbc为:mysql-connector-java-5.1.42.jar 这个错误完全搜不到原因,不过看报错是java类型到sql映射出错。所以猜测仍然是jdk9对之前版本的某些jar或者之前jdk的某些用法不支持。 后来更换mysqljdbc版本到6.06仍然这个错误。后来更换jdk版本就不再出错。。。。。所以,现在先别作死生产环境用java9......


网易有数:企业级大数据可视化分析平台。面向业务人员的自助式敏捷分析平台,采用PPT模式的报告制作,更加易学易用,具备强大的探索分析功能,真正帮助用户洞察数据发现价值。可点击这里免费试用。

你可能感兴趣的:(手把手教你搭建hadoop+hive测试环境(新手向))