四 22
1、下載kevinweil-hadoop-lzo
2、rpm -ivh liblzo2_2-2.03-6.el4.x86_64.rpm
3、rpm -ivh libminilzo2-2.03-6.el4.x86_64.rpm
4、rpm -ivh lzo-2.03-6.el4.x86_64.rpm
5、rpm -ivh lzo-devel-2.03-6.el4.i386.rpm
6、cd kevinweil-hadoop-lzo
ant compile-native tar
7、進入build目錄下,把hadoop-lzo-0.4.0.jar拷貝到hadoop的lib目錄,native目錄也拷貝到hadoop的lib目錄下
編輯core-stie.xml文件,增加
<property>
<name>io.compression.codecs</name>
<value>com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
使map的中間結果也是用lzo壓縮,編輯mapred-site.xml文件,增加
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
7、安裝lzop
rpm -ivh –force lzo-1.08-4.2.el4.rf.x86_64.rpm
rpm -ivh lzop-1.01-2.el4.rf.x86_64.rpm
8、Indexing LZO Files
使用lzop壓縮日誌文件后傳到hdfs上
index it in-process via:
hadoop jar /path/to/your/hadoop-lzo.jar com.hadoop.compression.lzo.LzoIndexer big_file.lzo
index it in a map-reduce job via:
hadoop jar /path/to/your/hadoop-lzo.jar com.hadoop.compression.lzo.DistributedLzoIndexer big_file.lzo
將TextInputFormat 修改為 LzoTextInputFormat
Tags:
Hadoop,
lzo 作者:Jock
四 22
1、下載安裝fuse。Linux kernel > 2.6.9
downloaad fuse-2.8.3.tar.gz
解壓configure & make & make install
2、modprobe fuse
3、export JAVA_HOME=
4、export HADOOP_HOME=
5、vi $HADOOP_HOME/src/contrib/fuse-dfs/src/fuse_dfs_wrapper.sh
修改HADOOP_HOME, JAVA_HOME
6、cd $HADOOP_HOME
7、ant compile -Dcompile.c++=true -Dlibhdfs=true
確保你的autoconf版本>2.61,ant 版本>1.7.1,給$HADOOP_HOME/src/contrib/fuse-dfs/configure,$HADOOP_HOME/src/c++/pipes/configure,$HADOOP_HOMEsrc/c++/utils/configure增加執行權限 (chmod +x FILE)
8、ln -s $HADOOP_HOME/build/c++/Linux-amd64-64/lib $HADOOP_HOME/build/libhdfs
9、export LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:$HADOOP_HOME/build/libhdfs:$JAVA_HOME/jre/lib/amd64/server
10、ant compile-contrib -Dlibhdfs=1 -Dfusedfs=1
如果以上都執行正常那就可以開始試著mount了
11、mkdir /export/hdfs (or wherever you want to mount it)
12、$HADOOP_HOME/build/contrib/fuse-dfs/fuse_dfs_wrapper.sh dfs://hadoop_server1.foo.com:9000 /export/hdfs
如果有錯誤看看這個目錄下這2個文件有沒有執行權fuse_dfs fuse_dfs_wrapper.sh
Tags:
dfs,
fuse,
Hadoop 作者:Jock
三 19
把集群升级到20.1之后,map/reduce的效率提升的不是一点半点啊。
升级步骤:
- 执行./bin/stop-all.sh
- mv 旧版本到一个新的目录
- 把配置好的新版本mv过来
- 同步到各个机器上
- hadoop namenode -upgrade
- 启动集群
原先在19.2上需要执行2个多小时的job,到新版本只需要1小时零几分就能完成了。
Tags:
Hadoop,
升级 作者:Jock
三 18
集群搭建
- 通常,集群里的一台机器被指定为 NameNode,另一台的机器被指定为JobTracker,这些机器是masters。余下的机器即作为DataNode也作为TaskTracker。这些机器是slaves。
- 对Hadoop的配置通过conf/目录下的两个重要配置文件完成:
- 此外,通过设置conf/hadoop-env.sh中的变量为集群特有的值,你可以对bin/目录下的Hadoop脚本进行控制。
- 配置Hadoop守护进程的运行参数
- 这部分涉及Hadoop集群的重要参数,这些参数在conf/hadoop-site.xml中指定。
- hadoop-default.xml – 只读的默认配置。
- hadoop-site.xml – 集群特有的配置。
| 参数 |
取值 |
备注 |
| fs.default.name |
NameNode的URI。 |
hdfs://主机名/ |
| mapred.job.tracker |
JobTracker的主机(或者IP)和端口。 |
主机:端口。 |
| dfs.name.dir |
NameNode持久存储名字空间及事务日志的本地文件系统路径。 |
当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。 |
| dfs.data.dir |
DataNode存放块数据的本地文件系统路径,逗号分割的列表。 |
当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。 |
| mapred.system.dir |
Map/Reduce框架存储系统文件的HDFS路径。比如/hadoop/mapred/system/。 |
这个路径是默认文件系统(HDFS)下的路径, 须从服务器和客户端上均可访问。 |
| mapred.local.dir |
本地文件系统下逗号分割的路径列表,Map/Reduce临时数据存放的地方。 |
多路径有助于利用磁盘i/o。 |
| mapred.tasktracker.{map|reduce}.tasks.maximum |
某一TaskTracker上可运行的最大Map/Reduce任务数,这些任务将同时各自运行。 |
默认为2(2个map和2个reduce),可依据硬件情况更改。 |
| dfs.block.size |
每个block的大小,byte |
|
| dfs.replication |
Block缺省的副本数量 |
|
| mapred.reduce.tasks |
每个任务启动的reduce task数量 |
|
HDFS架构和设计简介
- HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
- 文件系统的名字空间 (namespace)
HDFS支持传统的层次型文件组织结构。 Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来
每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的。为了容错,文件的所有数据块都会有副本
为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本
Namenode启动后会进入一个称为安全模式的特殊状态。 Namenode从所有的 Datanode接收心跳信号和块状态报告,块状态报告包括了某个Datanode所有的数据块列表。 更多详细内容 »
Tags:
Hadoop 作者:Jock
七 31
JobConf代表一个Map/Reduce作业的配置。
JobConf是用户向Hadoop框架描述一个Map/Reduce作业如何执行的主要接口。框架会按照JobConf描述的信息忠实地去尝试完成这个作业,然而:
•一些参数可能会被管理者标记为 final,这意味它们不能被更改。
•一些作业的参数可以被直截了当地进行设置(例如: setNumReduceTasks(int)),而另一些参数则与框架或者作业的其他参数之间微妙地相互影响,并且设置起来比较复杂(例如: setNumMapTasks(int))。
通常,JobConf会指明Mapper、Combiner(如果有的话)、 Partitioner、Reducer、InputFormat和 OutputFormat的具体实现。JobConf还能指定一组输入文件 (setInputPaths(JobConf, Path…) /addInputPath(JobConf, Path)) 和(setInputPaths(JobConf, String) /addInputPaths(JobConf, String)) 以及输出文件应该写在哪儿 (setOutputPath(Path))。
JobConf可选择地对作业设置一些高级选项,例如:设置Comparator; 放到DistributedCache上的文件;中间结果或者作业输出结果是否需要压缩以及怎么压缩; 利用用户提供的脚本(setMapDebugScript(String)/setReduceDebugScript(String)) 进行调试;作业是否允许预防性(speculative)任务的执行 (setMapSpeculativeExecution(boolean))/(setReduceSpeculativeExecution(boolean)) ;每个任务最大的尝试次数 (setMaxMapAttempts(int)/setMaxReduceAttempts(int)) ;一个作业能容忍的任务失败的百分比 (setMaxMapTaskFailuresPercent(int)/setMaxReduceTaskFailuresPercent(int)) ;等等。
当然,用户能使用 set(String, String)/get(String, String) 来设置或者取得应用程序需要的任意参数。然而,DistributedCache的使用是面向大规模只读数据的。
Tags:
配置 作者:Jock
七 31
Reduce的数目建议是0.95或1.75乘以 (<no. of nodes> * mapred.tasktracker.reduce.tasks.maximum)。
用0.95,所有reduce可以在maps一完成时就立刻启动,开始传输map的输出结果。用1.75,速度快的节点可以在完成第一轮reduce任务后,可以开始第二轮,这样可以得到比较好的负载均衡的效果。
增加reduce的数目会增加整个框架的开销,但可以改善负载均衡,降低由于执行失败带来的负面影响。
上述比例因子比整体数目稍小一些是为了给框架中的推测性任务(speculative-tasks) 或失败的任务预留一些reduce的资源。
无Reducer
如果没有归约要进行,那么设置reduce任务的数目为零是合法的。
这种情况下,map任务的输出会直接被写入由 setOutputPath(Path)指定的输出路径。框架在把它们写入FileSystem之前没有对它们进行排序。
Tags:
Hadoop,
reduce 作者:Jock
七 23
当HDFS从一个版本升级到另外一个版本的时候,NameNode和DataNode使用的文件格式有可能会改变。当你第一次使用新版本的时候,你要使用/opt/hadoop/bin/start-dfs.sh -upgrade告诉Hadoop 去改变HDFS版本(否则,新版本不会生效)。然后它开始升级,你可以通过 /opt/hadoop/bin/hadoop dfsadmin -upgradeProgress 命令来查看版本升级的情况。当然你可以使用/opt/hadoop/bin/hadoop dfsadmin -upgradeProgress details来查看更多的详细信息。当升级过程被阻塞的时候,你可以使用/opt/hadoop/bin/hadoop dfsadmin -upgradeProgress force 来强制升级继续执行(当你使用这个命令的时候,一定要慎重考虑)。
当HDFS升级完毕后,Hadoop依旧保留着旧版本的有关信息,以便你可以方便的对HDFS进行降级操作。你可以使用/opt/hadoop/bin/start-dfs.sh -rollback来执行降级操作。
Hadoop一次只保存一个版本的备份。当新版本运行几天以后还是没有出现什么问题,你就可以使用/opt/hadoop/bin/hadoop dfsadmin -finalizeUpgrade命令把旧版本的备份从系统中删掉了。删除以后rollback 命令就失效了。在另外一次版本升级前,这个操作是一定要做的。
获取帮助 – 跟 dfs 模块是一样的, 你可以使用 /opt/hadoop/bin/hadoop dfsadmin -help命令来获取特定的命令的一些用法。
Tags:
Hadoop 作者:Jock
七 19
之前曾经介绍过对输入文件采用压缩可以提高部分计算效率。现在作更进一步的说明。
为什么压缩会提高计算速度?这是因为mapreduce计算会将数据文件分散拷贝到所有datanode上,压缩可以减少数据浪费在带宽上的时间,当这些时间大于压缩/解压缩本身的时间时,计算速度就会提高了。
hadoop的压缩除了将输入文件进行压缩外,hadoop本身还可以在计算过程中将map输出以及将reduce输出进行压缩。这种计算当中的压缩又有什么样的效果呢?
测试环境:35台节点的hadoop cluster,单机2 CPU,8 core,8G内存,redhat 2.6.9, 其中namenode和second namenode各一台,namenode和second namenode不作datanode
输入文件大小为2.5G不压缩,records约为3600万条。mapreduce程序分为两个job:
job1:map将record按user字段作key拆分,reduce中作外连接。这样最后reduce输出为87亿records,大小540G
job2:map读入这87亿条数据并输出,reduce进行简单统计,最后的records为2.5亿条,大小16G
计算耗时54min
仅对第二个阶段的map作压缩(第一个阶段的map输出并不大,没有压缩的必要),测试结果:计算耗时39min
可见时间上节约了15min,注意以下参数的不同。
不压缩时:
Local bytes read=1923047905109
Local bytes written=1685607947227
压缩时:
Local bytes read=770579526349
Local bytes written=245469534966
本地读写的的数量大大降低了
至于对reduce输出的压缩,很遗憾经过测试基本没有提高速度的效果。可能是因为第一个job的输出大多数是在本地机上进行map,不经过网络传输的原因。
附:对map输出进行压缩,只需要添加jobConf.setMapOutputCompressorClass(DefaultCodec.class)
经过实际测试运行,一个25个datanode的集群,输入是压缩的话Finished in: 1hrs, 24mins, 52sec,而不压缩的情况下Finished in: 1hrs, 7mins, 43sec因为压缩的输入一个压缩文件只能由一个job去处理,如果文件大小不一,那么执行的效率肯定低一些。
可在配置文件中直接加上对输出是否做压缩处理
对job的输出压缩
1
2
3
4
5
6
| <property>
<name>mapred.output.compress</name>
<value>true</value>
<description>Should the job outputs be compressed?
</description>
</property> |
map结果通过网络在不同node之间传输之前进行压缩。
1
2
3
4
5
6
7
| <property>
<name>mapred.compress.map.output</name>
<value>true</value>
<description>Should the outputs of the maps be compressed before being
sent across the network. Uses SequenceFile compression.
</description>
</property> |
Tags:
Hadoop 作者:Jock
七 10
Safemode: 在Safemode(安全模式) 下,HDFS是只读的。任何的复制,创建,删除操作都是禁止的。在NameNode启动的时候,系统会自动进入这个模式,DataNode 会在这时候注册到NameNode中,并告诉NameNode它们拥有哪些文件块,NameNode由此知道哪些文件块的备份被丢失了。一直到一定百分比的的数量的DataNodes正常工作后,NameNode会退出安全模式。这个百分比在dfs.safemode.threshold.pct 中配置。当达到一定的百分比的时候,安全模式会自动退出,HDFS就允许正常操作了。用户可以通过dfsadmin -safemode enter | leave | get | wait来操作安全模式,参数说明如下:
•enter – 进入安全模式
•leave – 强制NameNode离开安全模式
•get – 返回安全模式是否开启的信息
•wait – 等待,一直到安全模式结束。
执行如下命令强制离开安全模式
/opt/hadoop/bin/hadoop dfsadmin -safemode leave
Tags:
Hadoop 作者:Jock
七 10
所有的hadoop命令均由bin/hadoop脚本引发。不指定参数运行hadoop脚本会打印所有命令的描述。
用法:hadoop [--config confdir] [COMMAND] [GENERIC_OPTIONS] [COMMAND_OPTIONS]
Hadoop有一个选项解析框架用于解析一般的选项和运行类。
命令选项 描述
–config confdir 覆盖缺省配置目录。缺省是${HADOOP_HOME}/conf。
GENERIC_OPTIONS 多个命令都支持的通用选项。
COMMAND
命令选项S 各种各样的命令和它们的选项会在下面提到。这些命令被分为 用户命令 管理命令两组。
常规选项
下面的选项被 dfsadmin, fs, fsck和 job支持。 应用程序要实现 Tool来支持 常规选项。
GENERIC_OPTION 描述
-conf <configuration file> 指定应用程序的配置文件。
-D <property=value> 为指定property指定值value。
-fs <local|namenode:port> 指定namenode。
-jt <local|jobtracker:port> 指定job tracker。只适用于job。
-files <逗号分隔的文件列表> 指定要拷贝到map reduce集群的文件的逗号分隔的列表。 只适用于job。
-libjars <逗号分隔的jar列表> 指定要包含到classpath中的jar文件的逗号分隔的列表。 只适用于job。
-archives <逗号分隔的archive列表> 指定要被解压到计算节点上的档案文件的逗号分割的列表。 只适用于job。
用户命令
hadoop集群用户的常用命令 更多详细内容 »
Tags:
Hadoop 作者:Jock
近期评论