专栏首页Python数据科学使用Excel&Python&Hive&SparkSQL进行数据分析开篇-环境搭建攻略!

使用Excel&Python&Hive&SparkSQL进行数据分析开篇-环境搭建攻略!

作者:石晓文

来源:小小挖掘机

计划写一个新系列,分别使用Excel、Python、Hive、SparkSQL四种方式来实现简单的数据分析功能,例如GroupBy、透视表等功能。

俗话说的好,工欲善其事,必先利其器,所以咱们先介绍一下环境的搭建!虽说Hive和Spark都是分布式的宠儿,但是咱们仅仅实现单机版!

所有需要安装的工具列表如下:

1、Excel 2、Python 3、JDK 4、IDEA 5、Mysql 6、Scala 7、Spark 8、Hadoop 9、Hive

前五个咱们就不说了,网上的工具一大堆,我默认你已经全部安装过了,咱们重点讲下后面四个的安装和配置。废话不多说,一个个来,踩坑一天的经验全部分享给你!

1、Scala安装

下载压缩包并解压

首先我们要到官网下载安装包。官网传送门: http://www.scala-lang.org/download/ 我下载的是scala-2.12.3.tar. 下载后进入安装包所在目录进行解压操作:

tar -zxvf scala-2.12.3.tar

添加环境变量

执行如下命令打开配置文件:

vim ~/.bash_profile

添加如下两行:

export SCALA_HOME=你Scala的路径/scala
export PATH=$PATH:$SCALA_HOME/bin

添加结束后推出编辑配置文件,使用如下的命令使配置生效:

source ~/.bash_profile

检验是否配置生效

在命令行输入scala,并测试一段简单的语句,证明scala安装成功:

输入:q可以退出scala的交互环境。

2、Spark安装

下载压缩包并解压

到官网下载spark的安装包,我用的是spark-2.1.1-bin-hadoop2.7.tgz

使用如下的命令进行解压:

tar -zxvf spark-2.1.1-bin-hadoop2.7.tgz 

修改配置文件

解压后进入conf 文件夹下将 spark-env.sh.template 改名为 spark-env.sh,并修改 spark-env.sh 文件添加信息:

export SCALA_HOME=/Users/yangyibo/Software/scala
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home
export SPARK_MASTER_IP=192.168.100.176
export SPARK_WORKER_MEMORY=512m 
export master=spark://192.168.100.176:7070

上面的ip地址需要替换成你自己电脑的ip,可以使用ifconfig命令查看。

随后,修改 slaves.template 添加信息:

master

配置环境变量

执行如下命令打开配置文件:

vim ~/.bash_profile

添加如下信息:

export SPARK_HOME=你的spark路径
export PATH=$PATH:$SPARK_HOME/bin

添加结束后推出编辑配置文件,使用如下的命令使配置生效:

source ~/.bash_profile

验证安装情况

进入安装包的sbin 目录执行 start-all.sh 脚本

./start-all.sh

如果出现上面的错误,其实是没问题的,因为是单机版,所以ssh并不需要配置

启动后进入spark 的bin 目录运行spark-shell 进入终端。

./spark-shell

如果看到下面的结果,就证明你安装成功啦,你就可以直接在交互环境中编写scala和spark语句啦。

停止spark

进入spark的sbin目录,执行命令

$ ./stop-all.sh

3、使用IDEA创建Project

安装好了Spark,咱们先用IDEA测试一下。

打开IDEA之后,新建一个project:

选择scala工程:

配置scala的版本和JDK的版本:

工程建好后,已经有scala和java的相关jar包了,咱们还得把spark相关的包进行导入:

点击+号后,选择spark解压路径下jars文件夹即可:

此时,新建一个Scala的Object:

测试一下sparkSession能否创建成功(spark2.x统一使用SparkSession),编写如下代码

import org.apache.spark.sql.SparkSession


object DemoTest {
  def main(args:Array[String]): Unit= {
    
    val spark = SparkSession
      .builder()
      .appName("Spark SQL basic example")
    //  .enableHiveSupport()
      .config("spark.some.config.option", "some-value")
      .getOrCreate()
    import spark.implicits._
  }
}

直接右键点击run执行程序是不行的,会报错:

因此需要配置运行环境:

输入如下配置:

再次运行,执行成功,打印了一大堆日志,就不贴了。

上午被一个错误折腾了半天,给大家贴出来看看,如果你运行时发现如下错误:

这种的话一般是scala的包冲突了,找了半天,在jdk下面的包中,也有scala的包,把它删掉就好了:

至此,spark安装及运行成功!

4、Hadoop安装及配置

先去官网下载安装包:https://hadoop.apache.org/releases.html,我下载了一个相对新的版本:

下载之后还是放到指定的位置解压并重命名:

tar -zxvf hadoop-2.7.7.tar
mv hadoop-2.7.7 hadoop

修改/etc/hadoop下的配置文件:

修改/etc/hadoop/core-site.xml 第二项的路径需要根据你的电脑实际路径进行配置。

<configuration>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
    <description>The name of the default file system.</description>
  </property>

  <property>
    <name>hadoop.tmp.dir</name>
    <value>/Users/meituan_sxw/hadoop/tmp</value>
    <description>A base for other temporary directories.</description>
  </property>

  <property>
    <name>io.native.lib.available</name>
    <value>false</value>
    <description>default value is true:Should native hadoop libraries, if present, be used.</description>
  </property>
</configuration>

修改hdfs-site.xml

<property>
        <name>dfs.replication</name>
        <value>1</value>
        <!--如果是单节点配置为1,如果是集群根据实际集群数量配置 -->
</property>

修改yarn-site.xml

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

修改mapred-site.xml 首先执行下面的命令,创建mapred-site.xml:

cp mapred-site.xml.template mapred-site.xml

随后进行修改:

<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        <final>true</final>
</property>

修改完之后,将Hadoop添加至环境变量中:

vim ~/.bash_profile

添加如下内容:

export HADOOP_HOME=/Users/meituan_sxw/hadoop
export HADOOP_PREFIX=$HADOOP_HOME
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

当然还需要让修改的环境变量生效:

source ~/.bash_profile

接下来,就是启动Hadoop了,首先对NameNode进行格式化:

hadoop namenode -format

在这里,报错了:

原因就是core-site.xml中的hadoop.tmp.dir属性我没有修改,这里要修改为自己电脑的路径,同时创建相应的文件夹,并赋予777的权限:

sudo chmod -R a+w /Users/meituan_sxw/hadoop

然后进行格式化:

hadoop namenode -format

成功格式化:

接下来,在sbin目录下启动hdfs和yarn:

start-dfs.sh
start-yarn.sh

使用jps命令查看是否启动成功:

关闭hadoop,同样在sbin路径下执行:

stop-hdfs.sh
stop-yarn.sh

每次想要重新启动hadoop的时候,需要先关闭hadoop,再清除hadoop.tmp.dir下的文件,随后格式化namenode,最后再启动hdfs和yarn,少一步都有可能导致启动失败。这里小编踩过的坑就是没有清除hadoop.tmp.dir下的文件,导致每次启动时datanode没有启动成功。

5、Hive安装及配置

还是去官网下载一个Hive吧:https://hive.apache.org/downloads.html,一路点点点:

下载后还是先解压再重命名:

tar -zxvf apache-hive-2.3.5-bin.tar 
mv apache-hive-2.3.5-bin hive

配置环境变量:

export HIVE_HOME=/Users/meituan_sxw/hive
export PATH=$HIVE_HOME/bin:$PATH

接下来修改Hive的配置文件,在conf路径下:

cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml

修改 hive-env.sh

 HADOOP_HOME=/Users/meituan_sxw/hadoop
export HIVE_CONF_DIR=/Users/meituan_sxw/hive/conf
export HIVE_AUX_JARS_PATH=/Users/meituan_sxw/hive/lib

修改hive-site.xml 首先,将所有的${system:java.io.tmpdir} 和 ${system:user.name}替换,这里随便换一下就好,如果不换,会报如下的错误:

随后,根据name找到如下四项,进行修改(注意这里是修改,而不是追加,即根据name找到对应的位置,再把value进行替换),后面两项是你本地的mysql用户名和密码:

<property>
 <name>javax.jdo.option.ConnectionURL</name>
 <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&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>
</property>
<property>
 <name>javax.jdo.option.ConnectionPassword</name>
 <value>123456</value>
</property>

接下来,需要下载一个mysql包放到hive的lib路径下,下载地址为:https://mvnrepository.com/artifact/mysql/mysql-connector-java

我这里下载的一个低版本的:

随后,为hive创建HDFS目录:

hdfs dfs -mkdir -p  /usr/hive/warehouse
hdfs dfs -mkdir -p /usr/hive/tmp
hdfs dfs -mkdir -p /usr/hive/log
hdfs dfs -chmod -R  777 /usr/hive

可以查看有没有创建成功,每次重启hadoop都需要重新创建:

接下来,在hive中的bin路径下,初始化数据库:

schematool -initSchema -dbType mysql

登陆mysql中查看:

mysql -u root -p

退出mysql,输入hive,启动成功:

我们可以写一个简单的建表语句测试一下:

可以发现,成功创建:

6、Spark和Hive连通

万事俱备,只欠东风!最后一步,我们来将spark和hive进行联通!

首先,我们需要在刚才创建的project的resources路径下添加hive-site.xml文件。如果有resources路径的话直接添加即可,如果没有resources路径的话,创建一个resources文件夹,并选择将其作为resources路径:

在hive-site.xml中添加跟刚才一样的内容:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&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>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>0845</value>
    </property>
   
</configuration>

接下来,将刚才下载的mysql的jar包也添加到项目中来:

接下来咱们在spark sql代码中创建一个数据表,并插入两行数据:

def main(args:Array[String]): Unit= {

    val spark = SparkSession
      .builder()
      .appName("Spark SQL basic example")
      .enableHiveSupport()
      .config("spark.some.config.option", "some-value")
      .getOrCreate()
    import spark.implicits._


    spark.sql(
      s"""
     CREATE TABLE IF NOT EXISTS usersdb1(
       user_id int,
       user_name string
     )
     PARTITIONED BY (dt string)
     """)

    val df = Seq(
      (1, "First Value","20190627"),
      (2, "Second Value", "20190628")
    ).toDF("user_id","user_name","dt")

    df.show()

    df.createOrReplaceTempView("outputdata")

    spark.sql("select  * from outputdata").show()

    spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
    spark.sql(
      s"""
         |insert overwrite table usersdb1 PARTITION (dt)
         |select
         |  user_id,
         |  user_name,
         |  dt
         |from
         |  outputdata
      """.stripMargin)


    spark.sql(
      """
        |select * from usersdb1 where dt=20190627
      """.stripMargin).show()

  }

在hive下查看下数据有没有写入:

成功!不过还是再说明两点,一是sparkSession创建时.enableHiveSupport()一定要打开,而是插入数据库时,最好 指定spark.sql("set hive.exec.dynamic.partition.mode=nonstrict"),至于为什么,咱们后面再说,一下子说这么多我怕你也撑不住,哈哈。

虽然折腾了一天,不过终于配置成功了!下一篇咱们先来讲讲数据的导入,主要是spark sql如何创建dataframe,期待一下吧!

专注于数据科学领域的知识分享

欢迎在文章下方留言与交流

本文分享自微信公众号 - Python数据科学(PyDataScience),作者:石晓文

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货 | 深度学习必懂的13种概率分布

    作为机器学习从业者,你需要知道概率分布相关的知识。这里有一份最常见的基本概率分布教程,大多数和使用 python 库进行深度学习有关。

    用户2769421
  • 基础必备 | Python处理文件系统的10种方法

    【导读】在编写一些Python程序的时候,我们常常需要与文件系统进行交互。在本文中,营长为大家整理了10个常用的相关命令,涉及查看信息、更改信息、删除文件等,并...

    用户2769421
  • 骚年,这简历一看就是包装过了

    https://my.oschina.net/hooker/blog/3014656

    用户2769421
  • 使用Excel&Python&Hive&SparkSQL进行数据分析开篇-环境搭建攻略!

    计划写一个新系列,分别使用Excel、Python、Hive、SparkSQL四种方式来实现简单的数据分析功能,例如GroupBy、透视表等功能。

    石晓文
  • tp自动验证流程和返回空数组的问题

    今天下午上班做配置表数据自动验证更新时,发现验证失败返回false,而验证成功返回的却只是空数组,导致一直判断为false;

    仙士可
  • 内置标签2

    二.遍历循环 ThinkPHP 内置标签提供了 Volist 标签、Foreach 标签和 For 标签。 //给模版传一个数据库数据 $user = M('U...

    公众号php_pachong
  • 微信小程序环境下将文件上传到 OSS

    步骤 1: 配置 Bucket 跨域 客户端进行表单直传到 OSS 时,会从浏览器向 OSS 发送带有 Origin 的请求消息。OSS 对带有 Origin...

    达达前端
  • 搭建行政资源管理系统 项目开发环境

    本次的项目开发采用的是Spring MVC + MyBatis开发模式,并且所有的数据验证都将通过拦截器完成。那么在整个项目的整合过程之中,有部分的操作是可以进...

    爱明依
  • Spark 如何摆脱java双亲委托机制优先从用户jar加载类?

    spark的类加载及参数传递过程还是很复杂的,主要是因为他运行环境太复杂了,不同的集群管理器完全不一样,即使是同一集群管理器cluster和client也不一样...

    Spark学习技巧
  • 完全分布式的搭建

    伪分布式,也就是像我们之前做的那样,把NameNode,DataNode,NodeManager,ResourceManager,SecondaryNameNo...

    可爱见见

扫码关注云+社区

领取腾讯云代金券