Hive实践之动态分区

在上篇文章中“浅谈Hive中索引、分区对查询的优化”,提到了静态分区,对只有几条分区规则的时候勉强可以这么做,但是当有大量数据导入的时候,这样做未免太影响效率,所以可以开启动态分区

– 对现存hive表的分区

首先,新建一张我们需要的分区以后的表:
create table pv (click int) partitioned by (ds string);

(ps:若现存hive表中没有分区信息,我们需要手动修改hive配置数据库来增加hive表的分区信息。hive表分区存在PARTITION_KEYS数据表中,其中表项的| TBL_ID | PKEY_COMMENT | PKEY_NAME | PKEY_TYPE | INTEGER_IDX |分别是hive表名(在TBLS中存储),备注,分区名,分区索引的顺序。建立完成后我们就有一张类似于原始表,但是带有分区的表。)

然后,修改一下hive的默认设置以支持动态分区:

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

第二步,使用动态分区字段做分区索引。

然后用hive的insert命令进行插入操作。注意,除了所有列外,需要将分区的动态字段跟在后面。

hive>INSERT OVERWRITE TABLE pv PARTITION (ds)  SELECT click_pv, time FROM orgin;

这样,得到了一张分区后的hive大表。

通过hdfs看一下咯:

[hadoop@localhost Desktop]$ hadoop fs -ls /opt/hive/warehouse/pv

Found 2 items

drwxr-xr-x – root supergroup 0 2015-08-15 00:33 /opt/hive/warehouse/pv/ds=20150802

drwxr-xr-x – root supergroup 0 2015-08-15 00:33 /opt/hive/warehouse/pv/ds=20150804

另:

备注一下我这里使用的orgin,仅做测试。

hive> select * from orgin;

OK

10 20150804

10 20150802

Time taken: 0.038 seconds, Fetched: 2 row(s)

 

浅谈Hive中索引、分区对查询的优化

索引:用户可以在某些列上创建索引来加速某些操作,给一个表创建的索引数据被保存在另外的表中。 但不是所有的查询都会受惠于Hive索引。可以使用EXPLAIN语法来分析HiveQL语句是否可以使用索引来提升用户查询的性能。像RDBMS中的索引一样,需要评估索引创建的是否合理,毕竟,索引需要更多的磁盘空间,并且创建维护索引也会有一定的代价。 用户必须要权衡从索引得到的好处和代价:
可以自己在hive上尝试一下先建立一张表,然后导入一些数据,再对数据的某一列建索引。
hive> create index your_index on table your_table(your_column)
> as ‘org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’
> with deferred rebuild
> IN TABLE your_index_table;
hive> alter index your_index on your_table rebuild;
通过select * from your_table where your_column=’xxx’;
可以比较建立索引前后查询花费的时间。
分区:在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。
这个具体是怎么工作的呢?我用一个实例来说明吧:
先在hive上建个带有分区的表:
hive> create table test (a string) partitioned by (b string, c string); //用b,c字段建立分区
OK
Time taken: 0.242 seconds
hive> alter table test add partition(b=’1′,c=’1′); //手动添加一个分区信息
OK
Time taken: 0.197 seconds
然后我插入一条数据:
hive> insert into test partition(b=’1′,c=’1′) values(‘1’);
可以看到hive的提示信息:
Moving data to: hdfs://localhost:9000/opt/hive/warehouse/test/b=1/c=1
我们再在hdfs上查看这个文件夹:
[hadoop@localhost Desktop]$ hadoop fs -ls /opt/hive/warehouse/test/b=1/c=1
Found 1 items
-rw-r–r– 1 root supergroup 2 2015-08-14 23:59 /opt/hive/warehouse/test/b=1/c=1/000000_0
ok,想必已经理解到了分区是怎么一回事了,我们事先对其进行分区,然后相应的数据根据对partition的指定就会被存到hdfs上相应的文件目录下。这样子在查询的时候就可以避免扫整个表,通过文件夹目录就对数据进行读取了。

Hadoop YARN 架构

之前自己虚拟机上的伪分布是1.x的,而公司集群是2.x的,导致我的mapreduce会出现一些问题,现在先对hadoop2.0有一个清晰认识后,再在虚拟机上新部署2.x,模拟集群环境,修改代码。

diffs

 

从上图,我们可以清晰的看见1.0-2.0的一个架构上的变化,简单来说就是从定制化变成可插拔组件的形式。

hadoop2中yarn是一个资源管理系统,其上除了可运行MapReduce外,还可以运行内存计算框架Spark,实时流数据处理框架Storm等。1.0可以看成是一个框架,而现在的2.0能理解成一个平台,可以运行别的框架。

那yarn的架构是怎么样的呢?

yarn

 

其中:

Resource Manager:

  • 处理客户端请求
  • 启动/监控applicationmaster(application manager 会向resource manager进行 resource request)
  • 监控nodemanager
  • 资源分配与调度

Node Manager:

  • 单个节点上的资源管理
  • 处理来自resource manager的命令
  • 处理来自application manager的命令

Application Manager:

  • 数据切分
  • 为应用程序申请资源,并分配给内部任务(node 上的 task)
  • 任务监控与容错

多角度理解yarn

单机并行计算角度:

操作系统中:

bx

yarn的一一对应:
bx2

 

hadoop 常见问题记录(持续更新0805)

1. 启动Hadoop时出现log4j:ERROR setFile(null,true) call failed.

建议切换到root来执行,中间尝试几次chown到hadoop, 持续遇到其他问题

2. 启动后通过jps发现namenode或者jobtracker丢了

重新格式化namenode。 hadoop namenode -format

3.hadoop使用中出现Java heap space

因为设置heapsize设置的太小了,这个实际上是 Out Of Memory OOM问题。

在mapred-site.xml中添加:

<property>
<name>mapred.child.java.opts</name>
<value>-Xmx200m</value>  –将此处改大点,比如我改成了 -Xmx4000m  因为我是给虚拟机用的,然后单机伪分布,所以比较大,各位自行设置
</property>

然后

hadoop-env.sh中

export HADOOP_HEAPSIZE=4000  --也是单机的原因

4. 0804遇到的问题,当我的盘满了之后,mapreduce任务无法继续执行,再次执行任务时,报错。

则删掉hdfs/data/current下的所有文件,再关掉hadoop, 格式化 hadoop namenode -format,重启,执行任务,ok

 

hadoop: hashcode

这是一个很重要的概念,是map到reduce时shuffle的原理。

 看下一个hash实例:

/**
* Returns a hash code for this string. The hash code for a
* <code>String</code> object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
* </pre></blockquote>
* using <code>int</code> arithmetic, where <code>s[i]</code> is the
* <i>i</i>th character of the string, <code>n</code> is the length of
* the string, and <code>^</code> indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

可见实际可以看作是一种权重的算法,在前面的字符的权重大。

这样的好处就在于,map后输出的key譬如是字符串,前缀相同的字符串得到的hashcode值会非常接近。完全一样的key,hashcode值是一样的,那么肯定会被分到一个reduce区(不考虑都是这个词儿,因为容量满了放到其他区去了)。假设我们在做一个wordcount的任务,hash值相邻,如果存放在容器,比如HashSet,HashMap中时,实际存放的内存的位置也相邻,则存取的效率也高。(程序局部性原理)

以31为倍数,原因是31的二进制全是1,则可以有效地离散数据。

以下为转载:

hashcode理论

1、Hash值有什么用?
     HashMap、HashTable、HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode。HashCode是Key,这种计算为提高计算的性能。想想看,一般来说,数组算是比较快的集合类了吧,直接用index定位元素,简直就是O(1)的级别。但是添加元素就不这么乐观了。但是使用hash类的集合,添加元素,移动的元素少,只影响一小块,并且查找元素,由于hash值已经进行了定位分组,所以也会大大缩小涉及面,快速定位。

2、Hash值应该怎么计算?
   A、简单计算就是组成成员的hash值直接相加即可。比如ObjectA有三个属性,propA、propB和propC,最直接的计算方式就是propA.hashcode+propB.hashcode+propC.hashcode。

   B、但是如果遇到有顺序相关的怎么办?比如String类型是由char数组组成,并且这些数组是有顺序的。如果使用第一种计算方法,则“ABCD”和“BCDA”就会产生同样的hashCode,那么怎么办呢?最直接想到的办法就是加权,不同的index加不同的权值,这个权值的确定最直接的方法就是某个常数值的几次幂。比如为String的计算hash值为K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的选择也有说法,最好不要是偶数,因为偶数的相乘会造成信息的丢失(乘以2就是左移1位,一旦溢出就会造成信息的丢失,这种计算会造成溢出后的值与某个看似不相关的数值得到的结果是一样的),所以最好是奇数,在这一点上比较推荐使用7,因为7=8-1=2^3-1,这样计算的时候,直接左移几位再进行一次普通的加减法即可(Java中常用的是31(32-1=2^5-1))。

hadoop快速回顾的笔记

下面的记录不适合当教程看,就给自己记录下体会。

基本概念

hdfs -文件系统 

mapreduce-框架

块(block):固定大小的逻辑单元,文件拆分成块存储,64mb

nameNode : 存放元数据;即文件与数据块的映射表与数据块与datanodes间的映射表。

datanode:存放数据块。

数据块副本: 为了保证容错,不同机架(一份),不同节点(同一机架2份)。保存3份

心跳检测,datanode定期向namenode发送心跳信息,这可让namenode知道datanode是否挂了。

secondnamenode(相当于一个namenode的备份) : 存放 fsimage, editlog ;元数据会由namenode同步到二级namenode,但secondnamenode不接受请求。

如果namenode挂了的话,secondnamenode会切换成namenode

文件读写流程:

一、文件读取请求

客户端 - 发送路径(比如hdfs://192.168.1.2/opt/hadoop/warehouse/test)等给namenode: namenode返回元数据及映射关系(在哪个datanode中)

客户端 - 根据返回的元数据读取datanode中的blocks

二、文件写入请求

1、文件拆分成块-blocks 64mb,

2、1块1块地通知namenode,得到返回的datanodes

3、根据返回的datanode信息,将当前块写入datanodes(通过复制管道备份,流水线复制)

4、复制完成后,更新元数据。如果还有没处理的块,返回2。否则完成

特点:

数据冗余、硬件容错,流式数据访问(写一次、读多次,修改的话,会删了再追加block,形成新的元数据),存储大文件(小文件的话,可以想象地到namenode的负载压力)

适合数据批量读写,吞吐量高。

不支持多用户并发写相同文件

hdfs命令行操作

启动之前,有一个格式化操作 hadoop namenode -format

hadoop fs -ls / 打印目录内容

hadoop -rm(+f不提示) wannadelete.data 删除

hadoop fs -mkdir input 创建目录在制定的目录下(可参加目录的设置)

hadoop fs -put hadoop-test.file  input/ 把文件放到相应目录

hadoop fs -cat /input/haddop-test.file 打印文件内容

hadoop fs -get input/haddop-env.sh hadoop-env2.sh 获取文件

hadoop dfs -report 得到一个hadoop当前的信息

mapreduce原理:

jobtracker - 管理tasktracker,跟踪任务进度,检测tasktracker的状态。

task tracker - 执行任务,向jobtracker汇报自己的工作进展,自身状态。

(一般和datanode是一起的,移动计算而不是移动数据,提高速度。map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫运算移动,数据不移动。而分配reduce任务时并不考虑数据本地化。

过程:客户端向jobtracker提交任务,jobtraker把输入的文件分成若干个,给若干tasktracker去做map任务,形成新的key-value对,然后这个作为一个输出给若干tasktracker去做reduce任务。

故障时候的做法:

1、重复提交

2、推测,新的一个tasktracker执行相同的任务

另外:

map、reduce中的shuffle操作:

map完了后,进入reduce,是把相应key的数据哈希到对应的reduce分区中去。

一个任务到执行的过程:(忽略了写mapreduce程序的过程)

javac编译

javac -classpath  hadoop-core.jar  lib/common.jar  -d somepath/ yourfile.java

打包

jar -cvf wordcount.jar *.class

—> wordcount.jar

hdfs上的准备:

hadoop fs -mkdir dire/ 创建文件夹

hadoop fs -put ./* dire/ 提交文件到hdfs对应的文件夹

执行任务

hadoop jar dire/yourfile.jar 指定main函数名 需要的参数(比如输入输出的文件夹名,如果没有的话,会自动创建的)

Mahout 安装及测试

Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现、分类、聚类等。Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能。

在Mahout实现的机器学习算法:
算法类 算法名 中文名
分类算法 Logistic Regression 逻辑回归
Bayesian 贝叶斯
SVM 支持向量机
Perceptron 感知器算法
Neural Network 神经网络
Random Forests 随机森林
Restricted Boltzmann Machines 有限波尔兹曼机
聚类算法 Canopy Clustering Canopy聚类
K-means Clustering K均值算法
Fuzzy K-means 模糊K均值
Expectation Maximization EM聚类(期望最大化聚类)
Mean Shift Clustering 均值漂移聚类
Hierarchical Clustering 层次聚类
Dirichlet Process Clustering 狄里克雷过程聚类
Latent Dirichlet Allocation LDA聚类
Spectral Clustering 谱聚类
关联规则挖掘 Parallel FP Growth Algorithm 并行FP Growth算法
回归 Locally Weighted Linear Regression 局部加权线性回归
降维/维约简 Singular Value Decomposition 奇异值分解
Principal Components Analysis 主成分分析
Independent Component Analysis 独立成分分析
Gaussian Discriminative Analysis 高斯判别分析
进化算法 并行化了Watchmaker框架
推荐/协同过滤 Non-distributed recommenders Taste(UserCF, ItemCF, SlopeOne)
Distributed Recommenders ItemCF
向量相似度计算 RowSimilarityJob 计算列间相似度
VectorDistanceJob 计算向量间距离
非Map-Reduce算法 Hidden Markov Models 隐马尔科夫模型
集合方法扩展 Collections 扩展了java的Collections类

 

二、Mahout安装、配置

一、下载Mahout

http://archive.apache.org/dist/mahout/
二、解压
tar -zxvf mahout-distribution-0.9.tar.gz
三、配置环境变量
3.1、配置Mahout环境变量
/etc/profile.d
mahout.sh
export MAHOUT_HOME=/home/yujianxin/mahout/mahout-distribution-0.9
export MAHOUT_CONF_DIR=$MAHOUT_HOME/conf
/etc
vim profile
export PATH=$MAHOUT_HOME/conf:$MAHOUT_HOME/bin:$PATH
3.2、配置Mahout所需的Hadoop环境变量
(安装hadoopshi3已经做过了,所以不再演示)
不过之前没有加过 hadoop_conf_dir的得加一个,为了之后mahout在hadoop上运行时使用
/etc/profile.d
vim hadoop.sh
export HADOOP_CONF_DIR=${HADOOP_HOME}/conf
source mahout.sh, profile
启动mahout, 如果出现

mahout_local is not set, 这个,不要以为是错误信息

MAHOUT_LOCAL:设置是否本地运行,如果设置这个参数就不会运行hadoop了,一旦设置这个参数,那HADOOP_CONF_DIR 和HADOOP_HOME 这两个参数的设置就自动失效了。

四、测试 
启动Hadoop
start-all.sh
下载测试数据
synthetic_control.data
上传测试数据到hdfs
1:将样本数据集放到hdfs中指定文件下,应该在testdata文件夹下
hadoop fs -put synthetic_control.data /user/hadoop/testdata
2:使用Mahout中的kmeans聚类算法,执行命令:
mahout -core  org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
5.5 查看聚类结果
当然,此次安装我主要是为了实现协同过滤算法,所以之后我还会给的例子会是一个简单的实现了协调过滤算法的例子。待出新篇吧

hive的搭建

背景:hadoop 1.2.1

HIVE 1.2.1

下载解压等不再赘述。

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

Hive的配置:
配置hive-env.sh  添加hadoop_home路径:
将export HADOOP_HOME前面的‘#’号去掉,
并让它指向您所安装hadoop的目录 (就是切换到这个目录下有hadoop的conf,lib,bin 等文件夹的目录),
(mine:HADOOP_HOME=/opt/hadoop)
其实在安装hive时需要指定HADOOP_HOME的原理基本上与
在安装Hadoop时需要指定JAVA_HOME的原理是相类似的。
Hadoop需要java作支撑,而hive需要hadoop作为支撑。
将export HIVE_CONF_DIR=/opt/hive/conf,并且把‘#’号去掉
将export HIVE_AUX_JARS_PATH=/opt/hive/lib

source /hive-env.sh(生效文件)
[root@db96 conf]# vim hive-env.sh
HADOOP_HOME=/opt/hadoop/xxxx 。。。 根据你的定
export HIVE_CONF_DIR=/opt/hadoop/xxxxx/conf
export HIVE_AUX_JARS_PATH=/opt/hive/lib
———————————————————-finish hive-env.sh
在修改之前,要相应的创建目录,以便与配置文件中的路径相对应,否则在运行hive时会报错的。
mkdir -p /opt/hive/warehouse
mkdir -p /opt/hive/tmp
mkdir -p /opt/hive/log
进入hive安装目录下的conf文件夹下:
cp  hive-default.xml.template hive-site.xml
这个文件中的配置项很多,篇幅也很长,所以要有耐心看。
当然也可以使用搜索匹配字符串的方式进行查找:
键入‘/hive.metastore.warehouse.dir’(回车)
就会锁定到所需要的字符串上。
其中有4处需要修改:
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/opt/hive/warehouse</value>
</property>
这个是设定数据目录
————————————-
<property>

<name>hive.exec.mode.local.auto</name>

<value>true</value>  —修改为true, 我是伪分布,自然先检查是否是本地模式..

<description>Let Hive determine whether to run in local mode automatically</description>

</property>

<property>

<name>hive.exec.scratchdir</name>

<value>/opt/hive/tmp</value>  — 改了

<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/&lt;username&gt; is created, with ${hive.scratch.dir.permission}.</description>

</property> <property>
————————————–
再搜一个querylog, 修改为/opt/hive/log
这个是用于存放hive相关日志的目录
其余的不用修改。
————————————–finish hive-site.xml

接下来创建并修改hdfs中权限:

(如果是高版本的hadoop, 将下面命令的hadoop 换为 hdfs)

hadoop dfs -mkdir -p  /opt/hive/warehouse

hadoop dfs -mkdir -p /opt/hive/tmp

hadoop dfs -mkdir -p /opt/hive/log

hadoop dfs -chmod 777 /opt/hive/warehouse

hadoop dfs -chmod 777 /opt/hive/tmp

hadoop dfs -chmod 777 /opt/hive/log

如果还发现在启动hive的过程中,有报错的话,多半是权限问题,将相应的

hadoop dfs -chmod 777 the_directory

就好了。

持续报错的,可以选择用root来启动hive,可能是hadoop用户的一些权限问题。

然后 hive-site.xml中所有含有“system:java.io.tmpdir”的配置项的值修改为一个固定的地址,比如 /opt/hive/iotmp,也要给够权限。

现在应该可以运行了。

扩充:

默认情况下,Hive元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。为了支持多用户多会话,则需要一个独立的元数据库,我们使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持,配置一个独立的元数据库需要增加以下几步骤:

一、为Hive建立相应的MySQL账户,并赋予足够的权限,执行命令如下:

hadoop@localhost:~$ mysql -uroot -pmysql
mysql> CREATE USER 'hive' IDENTIFIED BY 'mysql';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' WITH GRANT OPTION;
mysql> flush privileges;

默认情况下Mysql只允许本地登录,所以需要修改配置文件将地址绑定给注释掉:

root@localhost:~# sudo gedit /etc/mysql/my.cnf

找到如下内容:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1  <---注释掉这一行就可以远程登录了

重启mysql服务:

sudo service mysql restart

二、:建立 Hive 专用的元数据库,记得创建时用刚才创建的“hive”账号登陆。

mysql> exit;
hadoop@localhost:~$ mysql -uhive -pmysql
mysql> create database hive;

三:在Hive的conf目录下的文件“hive-site.xml”中修改如下配置:

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

<configuration>
    <property>
        <name>hive.metastore.local</name>
        <value>true</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>hive</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>mysql</value>
    </property>
</configuration>

四、:把MySQL的JDBC驱动包复制到Hive的lib目录下。
JDBC驱动包的版本:mysql-connector-java-5.1.18-bin.jar

五、:启动 Hive Shell, 执行“show tables;”命令,如果不报错,表明基于独立元数据库的 Hive 已经安装成功了。

hadoop@localhost:~$ hive
Logging initialized using configuration in file:/home/hadoop/hive-0.9.0/conf/hive-log4j.properties
Hive history file=/tmp/hadoop/hive_job_log_hadoop_201303041631_450140463.txt
hive> show tables;
OK
Time taken: 1.988 seconds
hive>

六、:验证Hive配置是否有误,进入Hive的shell新建表,在MySQL的Hive数据库中可以看到相应的元数据库信息。
1)在Hive上建立数据表
hive> CREATE TABLE xp(id INT,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;
2)从 MySQL 数据库上查看元数据信息
用到的 SQL 语句:
use hive; //使用 hive 数据库库
show tables;//显示 hive 数据库中的数据表
select * from TBLS;//查看 hive 的元数据信息
到此Hive集成Mysql作为元数据已完成。

远程模式安装
远程模式安装是把 metastore 配置到远程机器上,可以配置多个。在独立模式的基础上需要在 hive-site.xml 文件中增加的配置项如下:

<property>
    <name>hive.metastore.local</name>
    <value>local</value>
</property>
<property>
    <name>hive.metastore.uris</name>
    <value>uri1,uri2,... </value>//可配置多个 uri
    <description>JDBC connect string for a JDBC metastore</description>
</property>

centos 6.5 搭建hadoop伪分布服务器

做协同过滤,打算用apache mahout,首先得先搞个hadoop,之前一直说弄,都没机会,现在需要的时候,来弄一下。纪录一下全过程。

环境: centos 6.6 final 64bit

hadoop包:hadoop-1.2.1-bin.tag.gz (官网下不到了,可以自行搜,csdn上有)

jdk :jdk1.8.0_51

一、准备

jdk解压什么的..就不说了..

1. 设置jdk环境变量(根据自己安装的来)

/etc/profile.d

java.sh

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_51

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar jvm/jdk1.8.0_51

2.创建一个hadoop用户

groupadd hadoop

useradd hadoop -g hadoop

passwd hadoop

3.hadoop的准备

创建文件夹:

mkdir /hadoop
mkdir /hadoop/hdfs
mkdir /hadoop/hdfs/data
mkdir /hadoop/hdfs/name
mkdir /hadoop/mapred
mkdir /hadoop/mapred/local
mkdir /hadoop/mapred/system
mkdir /hadoop/tmp

更改owner:

chown -R hadoop /hadoop

4.设置Hadoop用户使之可以免密码ssh到localhost(很重要)

su – hadoop
ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub>> ~/.ssh/authorized_keys

cd /home/hadoop/.ssh
chmod 600 authorized_keys

注意这里的权限问题,保证.ssh目录权限为700,authorized_keys为600

 

验证: ssh localhost 能连上去且不要密码就行了.

二、安装与配置

5. 安装hadoop

su 先切换到root

mkdir /opt/hadoop 创建一个文件夹用来装hadoop

把安装文件拷贝到/opt/hadoop

mv hadoop….tar.gz /opt/hadoop

cd /opt/hadoop

tar -zxvf hadoop-x…tar.gz

done.

更改owner

chown -R hadoop /opt/hadoop

6. 配置hadoop

su hadoop

cd /opt/hadoop/hadoop-1.2.1/conf

接下来的配置,跟上面第3步中创建的文件夹以及你安装hadoop以及java的目录有关,需要自己根据自己的创建情况来做。

core-site.xml

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>   –tmp目录
</property>
</configuration>

hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/hadoop/hdfs/name</value>  –name目录
</property>
<property>
<name>dfs.data.dir</name>
<value>/hadoop/hdfs/data</value>   –date目录
</property>
</configuration>

mapred-site.xml

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>

hadoop-env.sh
配置JAVA_HOME 与 HADOOP_HOME_WARN_SUPPRESS。
PS:HADOOP_HOME_WARN_SUPPRESS这个变量可以避免某些情况下出现这样的提醒 “WARM: HADOOP_HOME is deprecated”
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_51
export HADOOP_HOME_WARN_SUPPRESS=”TRUE”
重新配置 /etc/profile 文件,最终如:
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
测试安装:
hadoop  version
ok。
三、启动
首次启动先格式化namenode,再启动
hadoop namenode -format
start-all.sh
验证: jps
如果看到以下进程,那么就ok了:
18596 JobTracker
18341 DataNode
18730 TaskTracker
18204 NameNode
18494 SecondaryNameNode
如果有什么问题,可以去/opt/hadoop/hadoop-1.2.1/logs查看相应的日志
最后就可以通过以下链接访问haddop服务了
localhost:50030/   for the Jobtracker
localhost:50070/   for the Namenode
localhost:50060/   for the Tasktracker
PS:完全分布式的安装与伪分布式的安装大同小异,注意如下几点即可
1.集群内ssh免用户登录
2.配置文件中指定具体的ip地址(或机器名),而不是localhost
3.配置masters和slaves文件,加入相关ip地址(或机器名)即可
以上配置需要在各个节点上保持一致。
安装中的问题:
可能遇到namenode启动不了的情况,建议查看是否hadoop-env.sh中启用了java_home的设置,以及可能是先没有格式化,就直接start-all.sh了,那么就先闪一下/hadoop/tmp这个文件夹,再重新生成一下:
stop-all.sh
rm -rf /hadoop/tmp
mkdir /hadoop/tmp
然后再:
hadoop namenode -format
start-all.sh