Hadoop&Hive&Spark的本地安装全流程与踩坑实录

一、Hadoop安装配置启动流程

1、下载

下载地址:https://mirrors.tuna.tsinghua.edu.cn(清华大学开源软件镜像站);

具体地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.2/ (版本3.2.2)

2、解压后修改配置

一共需要修改七个文件(如果要配置集群则还需要再加上一个文件,共八个)

(1)hadoop-3.2.2/etc/hadoop目录下,修改“core-site.xml”:

增加

<configuration>
	<!-- 本属性为jdbc连接的url地址和端口,为连接本机 -->
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://127.0.0.1:9000</value>
	</property>
	<!-- 本属性会指定hadoop的临时文件目录 默认在Linux的/tmp目录下 但是由于Linux重启后/tmp目录下的所有文件会清空 会造成hadoop临时文件丢失。而hdfs-default.xml文件中的配置项dfs.namenode.name.dir默认就是在hadoop的临时文件目录下 它保存的是fsimage文件 因此一旦配置在默认路径下 Linux重启后fsimage文件就会丢失 元数据十分重要 一旦丢失 整个hdfs集群就会崩溃 因此需要将hadoop临时文件配置在其他安全的目录。 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/home/mi/DevelopHome/hadoop-3.2.2/hadoop_tempdir</value>
	</property>
</configuration>

(2)hadoop-3.2.2/etc/hadoop目录下,修改“hadoop-env.sh”:

增加

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

(3)hadoop-3.2.2/etc/hadoop目录下,修改“hdfs-site.xml”:

增加

<configuration>
	<!-- hdfs分区备份数,默认为3,这里设置为1 -->
	<property>
        <name>dfs.replication</name>
        <value>1</value>
	</property>
</configuration>

(4)hadoop-3.2.2/etc/hadoop目录下,修改“mapred-env.sh”:

增加

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

(5)hadoop-3.2.2/etc/hadoop目录下,修改“mapred-site.xml”:

增加

<!-- 把所有路径对应好hadoop安装的根路径 -->
<configuration>
	<property>
        <name>mapreduce.application.classpath</name>
  		<value>/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/mapreduce/*, /home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/mapreduce/lib/*</value>
    </property>     

    <!-- 设置hadoop资源管理器为yarn -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=/home/mi/DevelopHome/hadoop-3.2.2</value>
    </property>

    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/home/mi/DevelopHome/hadoop-3.2.2</value>
    </property>

    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/home/mi/DevelopHome/hadoop-3.2.2</value>
    </property>
</configuration>

(6)hadoop-3.2.2/etc/hadoop目录下,修改“yarn-env.sh”:

增加

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

(7)hadoop-3.2.2/etc/hadoop目录下,修改“yarn-site.xml”:

增加

<configuration>
	<!-- namenode对应的地址,本地测试则为本机 -->
	<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>127.0.0.1</value>
    </property>

    <!-- shuffle机制 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!-- 本属性的值,由终端中录入:hadoop classpath而生成 -->
    <property>
        <name>yarn.application.classpath</name>
        <value>/home/mi/DevelopHome/hadoop-3.2.2/etc/hadoop:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/common/lib/*:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/common/*:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/hdfs:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/hdfs/lib/*:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/hdfs/*:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/mapreduce/lib/*:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/mapreduce/*:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/yarn:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/yarn/lib/*:/home/mi/DevelopHome/hadoop-3.2.2/share/hadoop/yarn/*</value>
    </property>

</configuration>

3、在profile添加Hadoop_Home

修改/etc/profile,添加如下:

export HADOOP_HOME=/home/mi/DevelopHome/hadoop-3.2.2
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

注意修改后在终端录入:

source /etc/profile 

使其立刻生效。

4、初始化hdfs文件夹

在master上格式化hdfs文件系统:

hdfs namenode -format

这个命令只能在指定的namenode上输入,初始化后会在二(1)配置的临时文件中生成初始文件,该初始化过程一般只在最开始安装完成hadoop后初始化一次。

5、设置本机ssh权限

如果跳过本步执行下面,会报出无权限的问题,需要设置。

(1)生成ssh公钥和私钥(如果已经进行git的ssh设置则可以直接跳过此步,进行下面的追加公钥):

ssh-keygen

会让你指定公钥和私钥的生成地址,默认在.ssh目录中,一路下一步就好。

(2)追加公钥:

将公钥追加到本地的认证文件中:

cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

6、在master上启动hadoop

在新的终端下启动hdfs和yarn

start-dfs.sh
start-yarn.sh

或者直接全部启动:

start-all.sh

如果没有设置免密登录 此时就会多次报出无权限。

hadoop的启动为hive启动的前置工作。到此为止,hadoop配置并启动完成!

注意事项:

(1)hadoop 3的http默认端口号为9870(2为50070),进入hadoop的http页面,可以查看hdfs存储文件,点击导航栏【Utilities】,在二级菜单中点击【Browse the file system】浏览文件系统。hdfs的默认存储目录在上面设置为了“/user/hive_remote/warehouse”。

(2)namenode 3的rpc默认端口号为9820(2为8020))。

(3)yarn的http端口号为8088,可以查看任务提交情况。

(4)如果想查看JobHistory,可以调用指令

mr-jobhistory-daemon.sh start historyserver

启动其然后查看,启动后访问JobHistory的http端口为:19888。

7、关闭hadoop

利用jps-l或者jps-m查看hadoop的启动进程,为NodeManager、DataNode、SecondaryNameNode、NameNode。
执行下面指令直接全部关闭:

stop-all.sh

二、Hive安装配置启动流程

1、下载

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.2/

2、解压后修改配置

一共需要修改两个文件

(1)/apache-hive-3.1.2-bin/conf目录下,复制“hive-env.sh.template”文件,修改为“hive-env.sh”:

增加

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64

HADOOP_HOME=/home/mi/DevelopHome/hadoop-3.2.2

(2)/apache-hive-3.1.2-bin/conf目录下,复制“hive-default.xml.template”文件,修改为“hive-site.xml”:

去掉

<configuration>
......
</configuration>

所有配置,然后再增加

<configuration>
<!-- 这里的value为hdfs文件存储位置 -->
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/user/hive_remote/warehouse</value>  
</property>  
   
<!-- 是否调用本地的metastore:否 -->
<property>  
  <name>hive.metastore.local</name>  
  <value>false</value>  
</property> 

<!-- 远程metastore的地址:localhost:9083 -->
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://localhost:9083</value>
</property> 

   <!-- mysql作为hive的metastore,于是设置mysql的url地址与端口,这里为本机地址和mysql的默认端口,下面的value信息中,metastore的存储库为hive,“createDatabaseIfNotExist=true”表示如果该库不存在就去创建该库,且注意,要设置useSSL=false从而取消ssl校验 -->
<property>  
  <name>javax.jdo.option.ConnectionURL</name>  
  <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value> 
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionDriverName</name>  
  <value>com.mysql.jdbc.Driver</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionUserName</name>  
  <value>root</value>  <!--这里设置的是本地mysql的用户名-->
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionPassword</name>  
  <value>123456</value>  <!--这里设置的是本地mysql的密码-->
</property>
<property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
<description>不存在时,自动创建Hive元数据表</description>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
<description>不存在时,自动创建Hive元数据列</description>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.autoStartMechanism</name>
<value>SchemaTable</value>
</property>   
</configuration>

3、在profile添加Hive_Home

修改/etc/profile,添加如下:

export HIVE_HOME=/home/mi/DevelopHome/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH

注意修改后在终端录入:

source /etc/profile 

使其立刻生效。

4、真正启动Hive前的问题处理:

(1)guava的jar包版本冲突问题:

apache-hive-3.1.2-bin/lib下的guava版本为19,hadoop-3.2.2/share/hadoop/common/lib下的guava版本为27,两者的不一致,会导致启动hive相关时报出找不到方法的异常,因此将apache-hive-3.1.2-bin/lib下的guava直接替换成hadoop的版本27的,从而解决。

(2)mysql的jar包引入问题

用mysql作为metastore,需要在apache-hive-3.1.2-bin/lib下引入“mysql-connector-java-5.1.47.jar”(版本可自行选择)

5、启动hive的metastore

在新的终端下

hive --service metastore

6、启动hiveserver2

在新的终端下

hive --service hiveserver2

7、启动Hive

由于已经修改了/etc/profile,则在新的终端下直接录入

hive

到此为止,hive配置启动完成!

注释:以上的启动新终端的流程,可以直接利用后台执行的方式:

nohup 要执行的指令 &

8、关闭Hive

直接查看hive的进程名称,利用

jps -l

或者查看进程名称和所属jar文件

jps -m

杀掉对应了HiveMetaStore的RunJar的进程号的进程和对应了HiveServer2的RunJar的进程号的进程,利用

kill -9 进程号

到此,Hive的关闭流程执行完成。

9、创建表后mysql的metastore的查看

进入mysql的hive库后查看表,DBS表内存储着元数据,COLUMNS_V2表存储着表对应的字段信息,TBLS表可以查看表owner以及该表到底是内部表还是外部表,PARTITIONS表可以查看分区信息。

10、利用jdbc连接hive

hive默认的对本机的连接ip端口为:jdbc:hive2://127.0.0.1:10000
driverName为:org.apache.hive.jdbc.HiveDriver

(1)在maven中引入pom文件:

注意hadoop和hive的版本要与下载的hadoop和hive尽量一致,以防止冲突。

<dependencies>
<!--        hadoop 3.2.2-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.2.2</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.2.2</version>
        </dependency>
        
<!--        hive 3.1.2-->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-metastore</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>

(2)写入java代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class HiveConnection {
  private static final String driverName = "org.apache.hive.jdbc.HiveDriver";
  private static final String url = "jdbc:hive2://127.0.0.1:10000";
  private static Connection con = null;
  private static Statement state = null;
  private static ResultSet res = null;
  
  public static void main(String[] args) throws Exception {
    Class.forName(driverName);
    con = DriverManager.getConnection(url);
    state = con.createStatement();
    res = state.executeQuery("show databases");//执行的sql为查询所有db
    while (res.next()) {
      System.out.println(res.getString(1));
    }
  }
}

此时直接执行会报出禁止匿名访问、拒绝连接等错误,所以需要在hadoop的core-site.xml配置文件中对访问进行开放。

(3)修改hadoop的core-site.xml

在core-site.xml的 configuration标签中加入property,如下:

<!-- mi为当前本机的用户名,需要灵活修改,本属性的意义为允许用户组的一切访问 -->
	<property>
		<name>hadoop.proxyuser.mi.groups</name>
		<value>*</value>
	</property>
	<!-- mi为当前本机的用户名,需要灵活修改,本属性的意义为开放host的一切访问 -->
	<property>
		<name>hadoop.proxyuser.mi.hosts</name>
		<value>*</value>
	</property>

此时再去执行jdbc连接,可以成功获得结果!

三、Spark安装配置启动流程

需要说明:spark的安装,只为了直接在终端执行spark-shell(sparkSQL)和spark-submit(提交sparkjob的jar文件给spark),不需要安装spark,则已经可以通过代码,引入spark的pom,在代码中调用spark操作。
参见笔者的另一篇博客:
Spark的基本使用入门
引入pom,编写scala代码即可。

1、下载

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/spark/(清华大学开源软件镜像站);

2、解压后修改配置

(1) 把解压出的spark文件夹放到相应目录,本机配置环境变量:

export SPARK_HOME=/home/mypc/DevelopHome/spark-3.2.0-bin-hadoop3.2
export PATH=$SPARK_HOME/bin:$PATH

(2)修改spark的conf/spark-defaults.conf配置

spark.yarn.historyServer.address=127.0.0.1:18080		#设置了spark在yarn上的historyserver地址端口
spark.history.ui.port=18080
spark.eventLog.enabled=true		#开启spark的event日志
spark.eventLog.dir=hdfs://127.0.0.1:9000/tmp/spark/events		#设置event日志目录,该目录在hdfs上如果没有创建,则需要先手动创建,创建方式见附5,127.0.0.1:9000为本机的hadoop的rpc链接
spark.history.fs.logDirectory=hdfs://127.0.0.1:9000/tmp/spark/events		#设置history日志目录,该目录在hdfs上如果没有创建,则需要先手动创建,创建方式见附5,与上面日志设置为统一目录,127.0.0.1:9000为本机的hadoop的rpc链接

(3)对hadoop的配置文件yarn-site.xml增加内容,如下:

<!-- 开启对yarn内的日志聚合,否则,暂存与8088下可以看到的job信息,一段时间会过期被清理 -->
<property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
</property>
<!-- 设置yarn下聚合到JobHistory时,JobHistory的地址 -->
<property>
        <name>yarn.log.server.url</name>
        <value>http://127.0.0.1:19888/jobhistory/logs</value>
</property>
<!-- 设置是否开启pmem(physics memory)物理内存检查:关闭。防止yarn把job下占用内存空间较大的container杀掉 -->
<property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
</property>
<!-- 设置是否开启vmem(virtual memory)虚拟内存检查:关闭。防止yarn把job下占用内存空间较大的container杀掉 -->
<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
</property>

(4)在hadoop-3.1.2/etc/hadoop/mapred-site.xml配置文件中,设置mr任务历史信息目录:

<property>
		<name>mapreduce.jobhistory.done-dir</name>
		<value>/user/history/done</value>
</property>
<property>
		<name>mapreduce.jobhistory.intermediate-done-dir</name>
		<value>/user/history/done_intermediate</value>
</property>

3、启动spark-shell前为spark确立yarn-site:

为了使spark能够确立找到本机的yarn-site.xml,需要再在环境变量中增加如下配置,则spark会默认到这个目录中寻找对应的yarn-site.xml:

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

4、正式启动spark-shell:

spark-shell --master yarn --deploy-mode client

deploy-mode分为cluster和client,cluster是指job会调用集群中负载量最低的进行操作,client是指job会调用当前节点进行操作,spark-shell指定了只能使用client的模式。

5、附:hdfs文件的访问与基本操作

(1)访问方式:
在配好环境变量的前提下,基本访问格式如下:

hadoop fs 相关指令(都以-开头)

由于是针对hdfs进行操作的,所以与下面格式指令等效

hdfs dfs 相关指令(都以-开头)

(2)查看指定目录下的信息
下面为查看根目录下的test1文件夹下的内容

hadoop fs -ls /test1

(3)查看指定目录下的文件内的信息
下面为查看根目录下的test1下的hehe.xml文件内的信息

hadoop fs -cat /test1/hehe.xml

(4)复制本地文件到hdfs
下面为把本地目录/home/mypc/文档/hehe.xml这个文件复制到hdfs的/test1目录

hadoop fs -put /home/mypc/文档/hehe.xml /test1

(5)复制hdfs文件到本地
下面为把hdfs目录下的/test1/hehe.xml这个文件复制到本地目录/home/mypc/文档

hadoop fs -get /test1/hehe.xml /home/mypc/文档

(6)在hdfs上从一个文件目录复制到另一个文件目录
下面为把hdfs目录下的/test1/hehe.xml这个文件复制到hdfs的/abc目录

hadoop fs -cp /test1/hehe.xml /abc

(7)创建文件夹
下面为在根目录创建文件夹/abc

hadoop fs -mkdir /abc

(8)创建级联文件夹

hadoop fs -mkdir -p /aaa/bbb

(9)创建文件

hadoop fs -touch /aaa/wa.txt

(10)删除指定文件或文件夹
下面为删除指定文件/abc/hehe.xml

hadoop fs -rm /abc/hehe.xml

(11)递归删除指定文件夹下所有内容
下面为删除指定文件夹/abc下所有内容

hadoop fs -rmr /abc

(12)查看目录下所有文件大小
查看目录/abc下所有文件大小

hadoop fs -du /abc
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值