hive安装配置及遇到的问题解决

1.下载Hive安装包apache-hive-1.2.1-bin.tar.gz

2.解压安装包,并移动到要安装的路径下

sudo tar -zxvf apache-hive-1.2.1-bin.tar.gz

sudo mv -r hive1.2.1 /usr/local/

3.配置hive环境变量

 vi /etc/profile 添加环境变量值
  export HIVE_HOME=/home/likehua/hive/hive-0.12.0
 export PATH = $HIVE_HOME/bin:$PATH
 source /etc/profile 使修改的环境变量立即生效

4.进入解压后的hive目录,进入conf

cp hive-env.sh.template hive-env.sh

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

hive的配置:

配置hive-env.sh文件:

(1)添加hadoop_home路径:将export HADOOP_HOME前面的‘#’号去掉,
并让它指向您所安装Hadoop的目录 (就是切换到这个目录下有hadoop的conf,lib,bin 等文件夹的目录),(mine:HADOOP_HOME=/usr/local/hadoop)

其实在安装hive时需要指定HADOOP_HOME的原理基本上与在安装Hadoop时需要指定JAVA_HOME的原理是相类似的。Hadoop需要Java作支撑,而hive

需要hadoop作为支撑。

(2)将export HIVE_CONF_DIR=/usr/local/hive1.2.1/conf,并且把‘#’号去掉
(3)将export HIVE_AUX_JARS_PATH=/usr/local/hive1.2.1/lib,并且把‘#’号去掉

保存,用source /hive-env.sh(生效文件)

在修改之前,要相应的创建目录,以便与配置文件中的路径相对应,否则在运行hive时会报错的。

mkdir -p /usr/local/hive1.2.1/warehouse
mkdir -p /usr/local/hive1.2.1/tmp
mkdir -p /usr/local/hive1.2.1/log

进入hive安装目录下的conf文件夹下,配置hive-site.xml文件

其中有三处需要修改:

搜索“/hive.metastore.warehouse.dir”

<property>
<name>hive.metastore.warehouse.dir</name>
<value>/usr/local/hive1.2.1/warehouse</value>
</property>
这个是设定数据目录
-------------------------------------

<property>
<name>hive.exec.scratchdir</name>
<value>/usr/local/hive1.2.1/tmp</value>
</property>
这个是设定临时文件目录
--------------------------------------
注://这个在笔者的文件中没有,可以自己添加
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive1.2.1/log</value>
</property>
这个是用于存放hive相关日志的目录,修改的这些目录都是上一步中创建的文件夹目录
其余的不用修改。

到此,hive-site.xml文件修改完成。

然后在conf文件夹下,cp hive-log4j.properties.template  hive-log4j.proprties

打开hive-log4j.proprties文件,sudo gedit hive-log4j.proprties

寻找hive.log.dir=
这个是当hive运行时,相应的日志文档存储到什么地方

(mine:hive.log.dir=/usr/local/hive1.2.1/log/${user.name})

hive.log.file=hive.log
这个是hive日志文件的名字是什么
默认的就可以,只要您能认出是日志就好

只有一个比较重要的需要修改一下,否则会报错。

log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter
如果没有修改的话会出现:

WARNING: org.apache.hadoop.metrics.EventCounter is deprecated.
please use org.apache.hadoop.log.metrics.EventCounter  in all the  log4j.properties files.
(只要按照警告提示修改即可)。

至此,hive-log4j.proprties文件修改完成。

这是在derby模式下的hive的配置,完成。

在hive目录下的bin目录下,执行hive可以开启hive。

hadoop@schpc:/usr/local/hive1.2.1$ bin/hive

结果显示(如下错误):

16/05/17 10:48:15 WARN conf.HiveConf: HiveConf of name hive.exec.scratdir does not exist
Logging initialized using configuration in file:/usr/local/hive1.2.1/conf/hive-log4j.properties
Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: java.NET.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.IllegalArgumentException: java.Net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
at org.apache.hadoop.fs.Path.initialize(Path.java:206)

at org.apache.hadoop.fs.Path.<init>(Path.java:172)
at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:563)
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:508)
... 8 more
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
at java.net.URI.checkPath(URI.java:1823)
at java.net.URI.<init>(URI.java:745)
at org.apache.hadoop.fs.Path.initialize(Path.java:203)
... 11 more

错误原因, ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D at org.apache.hadoop.fs.Path.initialize(Path.java:206)路径问题,只要把此处的相对路径改成

绝对路径就可以了。百度system:java.io.tmpdir,网页上显示Linux下面的路径为/tmp/,因此把hive-site.xml文件里面的两个system:java.io.tmpdir分别更改为/tmp/

hive配置相关错误解决方法。http://blog.csdn.net/jim110/article/details/44907745

再次运行bin/hive,运行成功。

hadoop@schpc:/usr/local/hive1.2.1$ bin/hive
16/05/17 11:02:05 WARN conf.HiveConf: HiveConf of name hive.exec.scratdir does not exist

Logging initialized using configuration in file:/usr/local/hive1.2.1/conf/hive-log4j.properties
hive>

在hive中建表后,使用show tables;命令结果显示如下错误:


经网上搜索查询得知:貌似hive.log的路径中不能出现":"。然后我把system后面的冒号改成了.号,结果耗时不行。

然后,恍然大悟hive/conf下面的配置文件hive-site.xml和hive-log4j.properties都提到了hive中的日志log的存放路径以及名字。四不四两个文件中的设置

不一致造成的呢,查询了一下果真两个文件中的配置目录不一致。所以我把两者的目录都改成了/tmp/hive/<user.name>(hive-log4j.properties中),/tmp/hive/${user.name}

(hive-site.xml中)保存,重启hive,然后再次执行show tables,ok得到如下结果:


以上是使用derby模式下的hive已经能够成功运行,这说明在系统中关于hive配置文件中的参数是正确的,即hive-env.sh和

hive-site.xml这两个文件中的配置是正确的。

接下来要配置的是以MySQL作为存储元数据库的hive的安装(此中模式下是将hive的metadata存储在mysql中,mysql的运行环境支撑双向同步和集群工作环境,这样的话

,至少两台数据库服务器上汇备份hive的元数据),要使用hadoop来创建相应的文件夹路径,

并设置权限:

bin/hadoop fs -mkdir /user/hadoop/hive/warehouse

bin/hadoop fs -mkdir /user/hadoop/hive/tmp

bin/hadoop fs -mkdir /user/hadoop/hive/log

bin/hadoop fs -chmod g+w /user/hadoop/hive/warehouse

bin/hadoop fs -chmod g+w /user/hadoop/hive/tmp

bin/hadoop fs -chmod g+w /user/hadoop/hive/log

继续配置hive-site.xml

[1]

<property>
<name>hive.metastore.warehouse.dir</name>
<value>hdfs://localhost:9000/user/hadoop/hive/warehouse</value>
(这里就与前面的hadoop fs -mkdir -p /user/hadoop/hive/warehouse相对应)
</property>
其中localhost指的是笔者的NameNode的hostname;

[2]

<property>
<name>hive.exec.scratchdir</name>
<value>hdfs://localhost:9000/user/hadoop/hive/scratchdir</value>
</property>

[3]

//这个没有变化与derby配置时相同
<property>
<name>hive.querylog.location</name>
<value>/usr/hive/log</value>
</property>
-------------------------------------

[4]

<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNoExist=true</value>
</property>
javax.jdo.option.ConnectionURL
这个参数使用来设置元数据连接字串

注意红字部分在hive-site.xml中是有的,不用自己添加。

我自己的错误:没有在文件中找到这个属性,然后就自己添加了结果导致开启hive一直报错。最后找到了文件中的该属性选项然后修改,才启动成功。

Unableto open a test connection to the given database. JDBC url =jdbc:derby:;databaseName=/usr/local/hive121/metastore_db;create=true,username = hive. Terminating connection pool (set lazyInit to true ifyou expect to start your database after your app). OriginalException: ------

java.sql.SQLException:Failed to create database '/usr/local/hive121/metastore_db', see thenext exception for details.

atorg.apache.derby.impl.jdbc.SQLE


-------------------------------------

[5]

<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
javax.jdo.option.ConnectionDriverName

关于在hive中用java来开发与mysql进行交互时,需要用到一个关于mysql的connector,这个可以将java语言描述的对database进行的操作转化为mysql可以理解的语句。

connector是一个用java语言描述的jar文件,而这个connector可以在官方网站上下载,经验正是connector与mysql的版本号不一致也可以运行。

connector要copy到/usr/local/hive1.2.1/lib目录下

[6]

<property>
<name>javax.jdo.option.ConnectorUserName</name>
<value>hive</value>
</property>
这个javax.jdo.option.ConnectionUserName
是用来设置hive存放元数据的数据库(这里是mysql数据库)的用户名称的。

[7]

--------------------------------------
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
这个javax.jdo.option.ConnetionPassword是用来设置,
用户登录数据库(上面的数据库)的时候需要输入的密码的.

[8]

<property>
<name>hive.aux.jars.path</name>
<value>file:///usr/local/hive/lib/hive-Hbase-handler-0.13.1.jar,file:///usr/local/hive/lib/protobuf-java-2.5.0.jar,file:///us
r/local/hive/lib/hbase-client-0.96.0-hadoop2.jar,file:///usr/local/hive/lib/hbase-common-0.96.0-hadoop2.jar,file:///usr/local
/hive/lib/zookeeper-3.4.5.jar,file:///usr/local/hive/lib/guava-11.0.2.jar</value>
</property>

/相应的jar包要从hbase的lib文件夹下复制到hive的lib文件夹下。

[9]

<property>  
<name>hive.metastore.uris</name>  
<value>thrift://localhost:9083</value>  
</property>  
</configuration>

---------------------------------------- 到此原理介绍完毕

要使用Hadoop来创建相应的文件路径,
并且要为它们设定权限:
hdfs dfs -mkdir -p  /usr/hive/warehouse
hdfs dfs -mkdir -p /usr/hive/tmp
hdfs dfs -mkdir -p /usr/hive/log
hdfs dfs -chmod g+w /usr/hive/warehouse
hdfs dfs -chmod g+w /usr/hive/tmp
hdfs dfs -chmod g+w /usr/hive/log

[root@db96 ~]# hadoop fs -mkdir -p /hive/scratchdir
[root@db96 ~]# hadoop fs -mkdir /tmp
[root@db96 ~]# hadoop fs -ls /hive
[root@db96 ~]# hadoop fs -chmod -R g+w /hive/
[root@db96 ~]# hadoop fs -chmod -R g+w /tmp
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 问题:如何使用Spark连接Hive,并将数据保存到Hive中? 解决方法: 1. 确认Hive配置信息 在Spark中连接Hive之前,需要确认Hive配置信息是否正确。可以通过以下命令查看Hive配置信息: ``` hive --config /path/to/hive/conf -e "set;" ``` 2. 创建SparkSession对象 使用Spark连接Hive需要创建SparkSession对象,可以通过以下代码创建: ``` from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Spark Hive Example") \ .config("spark.sql.warehouse.dir", "/path/to/hive/warehouse") \ .enableHiveSupport() \ .getOrCreate() ``` 其中,`appName`为应用程序名称,`config`为Hive的仓库目录,`enableHiveSupport`为启用Hive支持。 3. 读取Hive表数据 使用Spark连接Hive后,可以通过以下代码读取Hive表数据: ``` df = spark.sql("SELECT * FROM hive_table") ``` 其中,`hive_table`为Hive中的表名。 4. 将数据保存到Hive中 使用Spark连接Hive后,可以通过以下代码将数据保存到Hive中: ``` df.write.mode("overwrite").saveAsTable("hive_table") ``` 其中,`mode`为写入模式,`saveAsTable`为保存到Hive表中。 完整代码示例: ``` from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Spark Hive Example") \ .config("spark.sql.warehouse.dir", "/path/to/hive/warehouse") \ .enableHiveSupport() \ .getOrCreate() df = spark.sql("SELECT * FROM hive_table") df.write.mode("overwrite").saveAsTable("hive_table") ``` 注意:在使用Spark连接Hive时,需要确保Spark和Hive的版本兼容。 ### 回答2: 问题:如何使用Spark连接Hive并保存数据? 解决方法:要使用Spark连接Hive并保存数据,需要按照以下步骤进行操作: 1. 配置Spark环境:确保安装了Spark和Hive,并在Spark配置文件中指定Hive配置信息。 2. 创建SparkSession:在Spark中,可以通过创建SparkSession与Hive进行交互。可以使用以下代码创建一个SparkSession对象: ```scala val spark = SparkSession.builder() .appName("Spark Hive Example") .config("spark.sql.warehouse.dir", "/user/hive/warehouse") .enableHiveSupport() .getOrCreate() ``` 3. 加载Hive表数据:可以使用SparkSession的read方法加载Hive表数据,并创建一个DataFrame对象,例如: ```scala val data = spark.read.table("database_name.table_name") ``` 4. 在DataFrame上进行转换和处理:可以对加载的数据进行各种转换和处理操作,例如添加新列、过滤数据等。 5. 保存数据到Hive表:可以使用DataFrame的write方法将数据保存到Hive表中,例如: ```scala data.write.mode("overwrite").saveAsTable("database_name.table_name") ``` 这将会将数据覆盖性地保存到指定的Hive表中。 以上就是使用Spark连接Hive并保存数据的基本步骤。通过配置环境、创建SparkSession对象、加载Hive表数据、进行数据转换和处理以及保存数据到Hive表,可以实现Spark与Hive的连接和数据操作。 ### 回答3: 问题: 在使用Spark连接Hive并保存数据时,可能会遇到以下问题: 1. 如何在Spark中连接Hive? 2. 如何将Spark处理的数据保存到Hive表中? 解决方案: 1. 在Spark中连接Hive可以通过配置Hive元数据连接来实现。首先,确保在Spark的配置文件中,如spark-defaults.conf中,设置了Spark的master地址。然后,引入Hive的依赖,创建一个SparkSession对象,并设置其配置属性hive.metastore.uris为Hive的元数据存储地址。例如: ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Spark Connect Hive") \ .config("spark.master", "local") \ .config("spark.sql.warehouse.dir", "hdfs://<HDFS路径>") \ .config("hive.metastore.uris", "thrift://<Hive元数据存储地址>") \ .enableHiveSupport() \ .getOrCreate() ``` 在这个示例中,我们使用`enableHiveSupport()`来启用Hive支持,并设置了Hive的元数据存储地址。 2. 将Spark处理的数据保存到Hive表中可以使用Spark的DataFrame API或SQL语句来实现。首先,通过Spark从各种数据源(如HDFS、关系型数据库等)读取数据,并转换为DataFrame。然后,使用DataFrame的`write.saveAsTable(<表名>)`方法将数据保存到Hive表中。例如: ```python # 从HDFS读取数据并转换为DataFrame df = spark.read.load("hdfs://<HDFS路径>") # 将DataFrame保存到Hive表中 df.write.saveAsTable("<表名>") ``` 通过上述代码,我们可以将DataFrame保存为Hive表。还可以根据需要使用其他选项,如`mode`来指定保存模式(例如追加、覆盖等),以及`partitionBy`来指定分区列。 总结: 通过设置Spark的配置属性,我们可以在Spark中连接Hive。然后,通过使用Spark的DataFrame API或SQL语句,我们可以将Spark处理的数据保存到Hive表中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值