hadoop、hive安装

语言: CN / TW / HK

hadoop(hdfs+mapReduce+yarn)

前提

准备三台服务器(本文使用虚拟机),安装jdk1.8

配置

本文使用hadoop版本为3.3.0,解压hadoop压缩包到任意目录,以/export/server/hadoop-3.3.0/为例。

解压完毕后,进入hadoop目录,修改配置文件,位于/etc/hadoop/目录下,文本中有关路径和网络地址的配置需要根据实际情况修改

  • 指定java路径,指定各个进程运行的用户名 ``` vim hadoop-env.sh

export JAVA_HOME=/export/server/jdk1.8.0_341 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root ```

  • 核心配置文件,共有四个需要修改 ``` vim core-site.xml

fs.defaultFS hdfs://192.168.88.128:8020

hadoop.tmp.dir /export/server/hadoop-3.3.0

hadoop.http.staticuser.user root

hadoop.proxyuser.root.hosts hadoop.proxyuser.root.groups

fs.trash.interval 1440

```

``` vim hdfs-site.xml

dfs.namenode.secondary.http-address 192.168.88.129:9868

dfs.namenode.datanode.registration.ip-hostname-check false

```

``` vim mapred-site.xml

mapreduce.framework.name yarn

mapreduce.jobhistory.address 192.168.88.128:10020

mapreduce.jobhistory.webapp.address 192.168.88.128:19888
yarn.app.mapreduce.am.env HADOOP_MAPRED_HOME=${HADOOP_HOME} mapreduce.map.env HADOOP_MAPRED_HOME=${HADOOP_HOME} mapreduce.reduce.env HADOOP_MAPRED_HOME=${HADOOP_HOME}

```

``` vim yarn-site.xml

yarn.resourcemanager.hostname 192.168.88.128 yarn.nodemanager.aux-services mapreduce_shuffle

yarn.nodemanager.pmem-check-enabled false

yarn.nodemanager.vmem-check-enabled false

yarn.log-aggregation-enable true

yarn.log.server.url http://192.168.88.128:19888/jobhistory/logs

yarn.log-aggregation.retain-seconds 604800

```

  • 设置集群所在的网络地址 ``` vim workers

192.168.88.128 192.168.88.129 192.168.88.130 ```

  • 将hadoop添加到环境变量 ``` vim /etc/profile

export HADOOP_HOME=/export/server/hadoop-3.3.0 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin `` 编译环境变量,source /etc/profile`,执行hadoop命令,验证是否配置成功

  • 将hadoop及环境变量文件同步到其他两个节点,执行编译

  • 初始化hdfs 在主节点机器执行hdfs namenode -format,如果出现storage directory /export/server/hadoop-3.3.0/dfs/name has been successfully formatted,说明成功

启动

start-all.sh 启动成功后,在浏览器输入namenode所在服务器地址加上9870端口,可查看hdfs管理界面,如192.168.88.128:9870;在浏览器输入namenode所在服务器地址加上8088端口,可查看mapReduce管理界面,如192.168.88.128:8088

问题记录

启动时,报错Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

需要配置免密登录,才可以启动其他服务器下的hadoop服务,参考SSH免密登录配置

hdfs

上传下载命令

注: 1. 其他常见文件操作命令基本与linux相同,故不记录 2. 本地路径可直接写路径,也可用前缀file:///指明绝对路径;hdfs路径可直接写路径,也可用前缀hdfs://${namenode}:8020/指明绝对路径

  • 上传文件

hadoop fs -put 本地路径 hdfs路径

  • 下载文件

hadoop fs -get hdfs路径 本地路径

问题记录

使用start-dfs.sh启动,控制台显示成功,进入管理界面,live nodes显示只有一个

可能是使用ip连接的NameNode,如果是这样的话,需要在hdfs-site.xml添加如下配置 <property> <name>dfs.namenode.datanode.registration.ip-hostname-check</name> <value>false</value> </property>

进入管理界面,live nodes显示三个,点进去只显示一个,如下图 image.png

node列表以主机名+端口去重,三个节点的主机名都是localhost,端口又一样,因此只显示一个,解决方法是修改主机名或端口,本文中使用第一个

修改/etc/hostname文件或使用命令hostnamectl set-hostname node1修改三个节点的主机名,之后重启服务器

mr

说明

当前大数据技术下,很多框架封装了MapReduce,因此对于它了解即可

执行计算圆周率,进入/export/server/hadoop-3.3.0/share/hadoop/mapreduce/目录,执行hadoop -jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2命令,后面两个参数可任意修改

问题记录

执行example的计算pi任务,进入管理界面,发现任务一直没有执行,或者进度长期没有变化

执行资源调度的是node1,之前设置了主机名,如果分配给node2节点执行,发起的url为node2:${port},此时node1节点并不知道它的实际地址,所以任务进度长期没有变化

在node1节点上修改/etc/hosts文件,将所有节点的ip与主机名映射

执行example的计算pi任务,报异常java.net.UnknownHostException: node3

只修改了node1映射,其他节点的映射也需要修改

hive

前提

  • 启动mysql服务并配置可远程连接
  • 整合hadoop,在core-sile.xml文件上,之前已经配置好了,见注释整合hive 用户代理设置

配置

本文使用hive版本为3.1.2,解压hive压缩包到任意目录,以/export/server/hive-3.1.2/为例,文本中有关路径、网络地址、及MySQL配置信息等需要根据实际情况修改

  • 解决hive与hadoop之间guava版本差异 cd /export/server/hive-3.1.2/lib rm -rf guava-19.0.jar cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar .

  • 修改配置文件,进入conf目录,将hive-env.sh.template重命名为hive-env.sh,添加以下配置 ``` vim hive-env.sh

export HADOOP_HOME=/export/server/hadoop-3.3.0 export HIVE_CONF_DIR=/export/server/hive-3.1.2/conf export HIVE_AUX_JARS_PATH=/export/server/hive-3.1.2/lib ```

  • conf目录下的hive-site.xml,添加如下配置 ``` vim hive-site.xml

javax.jdo.option.ConnectionURL jdbc:mysql://192.168.26.1/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8

javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver

javax.jdo.option.ConnectionUserName root

javax.jdo.option.ConnectionPassword root

hive.server2.thrift.bind.host node1

hive.metastore.uris thrift://node1:9083

hive.metastore.event.db.notification.api.auth false ```

  • 将mysql驱动放到hive安装包lib下,jar包名称为mysql-connector-java-8.0.22.jar,具体过程略

  • 初始化hive 执行bin/schematool -initSchema -dbType mysql -verbos --verbose,如果出现Initialization script completed,说明成功。查看MySQL,发现已经有hive3数据库,且数据表也初始化了

  • 支持中文 如果对字段、表使用中文注释,查看时会发现显示???,这是因为没有设置UTF-8字符集,因此还需要对元数据表字段做一些调整 ALTER TABLE `hive3`.`columns_v2` MODIFY COLUMN `COMMENT` varchar(256) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`table_params` MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`partition_params` MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`partition_keys` MODIFY COLUMN `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`index_params` MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8mb4;

启动

``` nohup ./hive --service metastore &

nohup ./hive --service hiveserver2 & `` hive默认开放两个端口。若启动成功,在浏览器输入ip:10002,可查看后台页面;10000端口使客户端以jdbc方式连接,连接地址为jdbc:hive2://ip:10000`

连接

  1. beeline连接 java ./beeline -u jdbc:hive2://ip:10000 -n root 或者 ./beeline !connect jdbc:hive2://ip:10000 root
  2. 使用idea、dbeaver之类的软件连接,好处是写SQL时有智能提示