本文由 网易云 发布
作者:唐雕龙
本篇文章仅限内部分享,如需转载,请联系网易获取授权。
面向新手的hadoop+hive学习环境搭建,加对我走过的坑总结,避免大家踩坑。
对于hive相关docker,并没有官方的docker,第三方维护经过测试各种不靠谱,所以才想到自己搭建一套,然后后期在整理成docker上传~~~
1. 公司云主机debain8.8 (不像docker,所以对系统内核无要求)
1.1 jdk8(hive要求jdk7以上,千万不要jdk9!!!!!详情见末尾作死一)1.2 hadoop 2.7.X以上1.3 mysql或者postgresql(作为hive metastore的数据库)
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
官方下载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确认是否成功
官方建议增加hadoop用户组以及hadoop用户,我也建议这样做,但是公司云主机的话我就直接用我们有数的公共账号。
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 确保配置成功。
直接找到官方下载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中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-
site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
6.1. core-site.xml修改:
<configuration>
<property>
<name>hadoop.tmp.dirname>
<value>file:/usr/local/hadoop/tmpvalue>
property>
<property>
<name>fs.defaultFSname>
<value>hdfs://localhost:9000value>
property>
configuration>
其中目录同样推荐放在空间较大的盘上。并且确保用户有权限,所以最好用当前用户建一个~~
6.2. hdfs-site.xml修改:
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:/usr/local/hadoop/tmp/dfs/datavalue>
property>
configuration>
同样的,这两个文件目录最好自己指定并且用当前用户建,指定的好处是避免误删导致hadoop需要重新format.
配置完后在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 的文件;
启动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
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
接着修改yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
configuration>
然后启动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.
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 文件中以下几个配置项的值设置成上一步中创建的几个路径,同样建议放于空间较大的盘上
<configuration>
<property>
<name>hive.exec.scratchdirname>
<value>/user/hive/tmpvalue>
property>
<property>
<name>hive.metastore.warehouse.dirname>
<value>/user/hive/warehousevalue>
property>
<property>
<name>hive.querylog.locationname>
<value>/user/hive/logvalue>
property>
configuration>
4.增加metastore使用到的数据库相关连接信息的配置,修改hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncodig=UTF-8&useSSL=
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>hivevalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>hivevalue>
property>
configuration>
运行Hive 在命令行运行 hive 命令时必须保证以下两点: HDFS 已经启动。可以使用 start-dfs.sh 脚本来启动 HDFS。MySQL jdbc jar包添加到 $HIVE_HOME/lib 目录下。 然后在hive目录下,执行
执行成功后就可以执行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文件增加
<configuration>
<property>
<name>hadoop.proxyuser.XXX.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.XXX.groupsname>
<value>*value>
property>
configuration>
即可,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......
了解 网易云 :
网易云官网:https://www.163yun.com/
新用户大礼包:https://www.163yun.com/gift
网易云社区:https://sq.163yun.com/