第一篇:Hadoop之JobTrack分析
Hadoop之JobTrack分析
1.client端指定Job的各种参数配置之后调用job.waitForCompletion(true)方法提交Job给JobTracker,等待Job 完成。
[java] view plaincopyprint?
1.public void submit()throws IOException, InterruptedException, 2.ClassNotFoundException { 3.ensureState(JobState.DEFINE);//检查JobState状态
4.setUseNewAPI();//检查及设置是否使用新的MapReduce API
5.6.// Connect to the JobTracker and submit the job
7.connect();//链接JobTracker
8.info = jobClient.submitJobInternal(conf);//将job信息提交
9.super.setJobID(info.getID());
10.state = JobState.RUNNING;//更改job状态
11.}
以上代码主要有两步骤,连接JobTracker并提交Job信息。connect方法主要是实例化JobClient对象,包括设置JobConf和init工作:
[java] view plaincopyprint?
1.public void init(JobConf conf)throws IOException {
2.String tracker = conf.get(“mapred.job.tracker”, “local”);//读取配置文件信息用于判断该Job是运行于本地单机模式还是分布式模式
3.tasklogtimeout = conf.getInt(4.TASKLOG_PULL_TIMEOUT_KEY, DEFAULT_TASKLOG_TIMEOUT);5.this.ugi = UserGroupInformation.getCurrentUser();
6.if(“local”.equals(tracker)){//如果是单机模式,new LocalJobRunner
7.conf.setNumMapTasks(1);
8.this.jobSubmitClient = new LocalJobRunner(conf);9.} else {
10.this.jobSubmitClient = createRPCProxy(JobTracker.getAddress(conf), conf);
11.} 12.}
分布式模式下就会创建一个RPC代理链接:
[java] view plaincopyprint?
1.public static VersionedProtocol getProxy(2.Class extends VersionedProtocol> protocol,3.long clientVersion, InetSocketAddress addr, UserGroupInformation ticket,4.Configuration conf, SocketFactory factory, int rpcTimeout)throws IOException { 5.6.if(UserGroupInformation.isSecurityEnabled()){ 7.SaslRpcServer.init(conf);8.}
9.VersionedProtocol proxy =
10.(VersionedProtocol)Proxy.newProxyInstance(11.protocol.getClassLoader(), new Class[] { protocol },12.new Invoker(protocol, addr, ticket, conf, factory, rpcTimeout));
13.long serverVersion = proxy.getProtocolVersion(protocol.getName(), 14.clientVersion);15.if(serverVersion == clientVersion){ 16.return proxy;17.} else {
18.throw new VersionMismatch(protocol.getName(), clientVersion, 19.serverVersion);20.} 21.}
从上述代码可以看出hadoop实际上使用了Java自带的Proxy API来实现Remote Procedure Call 初始完之后,需要提交job [java] view plaincopyprint?
1.info = jobClient.submitJobInternal(conf);//将job信息提交
submit方法做以下几件事情:
1.将conf中目录名字替换成hdfs代理的名字
2.检查output是否合法:比如路径是否已经存在,是否是明确的3.将数据分成多个split并放到hdfs上面,写入job.xml文件
4.调用JobTracker的submitJob方法
该方法主要新建JobInProgress对象,然后检查访问权限和系统参数是否满足job,最后addJob:
[java] view plaincopyprint?
1.private synchronized JobStatus addJob(JobID jobId, JobInProgress job)2.throws IOException { 3.totalSubmissions++;4.5.synchronized(jobs){
6.synchronized(taskScheduler){
7.jobs.put(job.getProfile().getJobID(), job);
8.for(JobInProgressListener listener : jobInProgressListeners){ 9.listener.jobAdded(job);10.} 11.} 12.}
13.myInstrumentation.submitJob(job.getJobConf(), jobId);14.job.getQueueMetrics().submitJob(job.getJobConf(), jobId);15.16.LOG.info(“Job ” + jobId + “ added successfully for user '”
17.+ job.getJobConf().getUser()+ “' to queue '”
18.+ job.getJobConf().getQueueName()+ “'”);19.AuditLogger.logSuccess(job.getUser(),20.Operation.SUBMIT_JOB.name(), jobId.toString());21.return job.getStatus();22.}
totalSubmissions记录client端提交job到JobTracker的次数。而jobs则是JobTracker所有可以管理的job的映射表
Map
hadoop job调度机制; public enum SchedulingMode { FAIR, FIFO } 1.公平调度FairScheduler 对于每个用户而言,分布式资源是公平分配的,每个用户都有一个job池,假若某个用户目前所占有的资源很多,对于其他用户而言是不公平的,那么调度器就会杀掉占有资源多的用户的一些task,释放资源供他人使用 2.容量调度JobQueueTaskScheduler 在分布式系统上维护多个队列,每个队列都有一定的容量,每个队列中的job按照FIFO的策略进行调度。队列中可以包含队列。
两个Scheduler都要实现TaskScheduler的public synchronized List
接下来看看JobTracker的工作: 记录更新JobTracker重试的次数:
[java] view plaincopyprint?
1.while(true){ 2.try {
3.recoveryManager.updateRestartCount();4.break;
5.} catch(IOException ioe){
6.LOG.warn(“Failed to initialize recovery manager.”, ioe);7.// wait for some time
8.Thread.sleep(FS_ACCESS_RETRY_PERIOD);9.LOG.warn(“Retrying...”);10.} 11.}
启动Job调度器,默认是FairScheduler: taskScheduler.start();主要是初始化一些管理对象,比如job pool管理池
[java] view plaincopyprint?
1.// Initialize other pieces of the scheduler
2.jobInitializer = new JobInitializer(conf, taskTrackerManager);3.taskTrackerManager.addJobInProgressListener(jobListener);4.poolMgr = new PoolManager(this);5.poolMgr.initialize();
6.loadMgr =(LoadManager)ReflectionUtils.newInstance(7.conf.getClass(“mapred.fairscheduler.loadmanager”, 8.CapBasedLoadManager.class, LoadManager.class), conf);9.loadMgr.setTaskTrackerManager(taskTrackerManager);10.loadMgr.setEventLog(eventLog);11.loadMgr.start();
12.taskSelector =(TaskSelector)ReflectionUtils.newInstance(13.conf.getClass(“mapred.fairscheduler.taskselector”, 14.DefaultTaskSelector.class, TaskSelector.class), conf);15.taskSelector.setTaskTrackerManager(taskTrackerManager);16.taskSelector.start();
[java] view plaincopyprint?
1.JobInitializer有一个确定大小的ExecutorService threadPool,每个thread用于初始化job
[java] view plaincopyprint?
1.try {
2.JobStatus prevStatus =(JobStatus)job.getStatus().clone();3.LOG.info(“Initializing ” + job.getJobID());4.job.initTasks();
5.// Inform the listeners if the job state has changed 6.// Note : that the job will be in PREP state.7.JobStatus newStatus =(JobStatus)job.getStatus().clone();8.if(prevStatus.getRunState()!= newStatus.getRunState()){ 9.JobStatusChangeEvent event =
10.new JobStatusChangeEvent(job, EventType.RUN_STATE_CHANGED, prevStatus,11.newStatus);
12.synchronized(JobTracker.this){ 13.updateJobInProgressListeners(event);14.} 15.} 16.}
初始化操作主要用于初始化生成tasks然后通知其他的监听者执行其他操作。initTasks主要处理以下工作:
[java] view plaincopyprint?
1.// 记录用户提交的运行的job信息
2.try {
3.userUGI.doAs(new PrivilegedExceptionAction
5.public Object run()throws Exception {
6.JobHistory.JobInfo.logSubmitted(getJobID(), conf, jobFile, 7.startTimeFinal, hasRestarted());8.return null;9.} 10.});
11.} catch(InterruptedException ie){ 12.throw new IOException(ie);13.} 14.15.// 设置并记录job的优先级
16.setPriority(this.priority);17.18.//
19.//生成每个Task需要的密钥
20.//
21.generateAndStoreTokens();22.然后读取JobTracker split的数据的元信息,元信息包括以下属性信息:
[java] view plaincopyprint?
1.private TaskSplitIndex splitIndex;//洗牌后的索引位置
2.private long inputDataLength;//洗牌后数据长度 3.private String[] locations;//数据存储位置
然后根据元信息的长度来计算numMapTasks并校验数据存储地址是否可以连接 接下来生成map tasks和reducer tasks:
[java] view plaincopyprint?
1.maps = new TaskInProgress[numMapTasks];2.for(int i=0;i < numMapTasks;++i){
3.inputLength += splits[i].getInputDataLength();4.maps[i] = new TaskInProgress(jobId, jobFile, 5.splits[i],6.jobtracker, conf, this, i, numSlotsPerMap);
7.}
[java] view plaincopyprint?
1.this.jobFile = jobFile;2.this.splitInfo = split;3.this.jobtracker = jobtracker;4.this.job = job;5.this.conf = conf;
6.this.partition = partition;
7.this.maxSkipRecords = SkipBadRecords.getMapperMaxSkipRecords(conf);8.this.numSlotsRequired = numSlotsRequired;9.setMaxTaskAttempts();10.init(jobid);
以上除了task对应的jobTracker,split信息和job信息外,还设置了
[java] view plaincopyprint?
1.maxSkipRecords---记录task执行的时候最大可以跳过的错误记录数;
2.
setMaxTaskAttempts--设置task最多可以执行的次数。当一个task执行两次都失败了之后,会以skip mode模式再重新执行一次,记录那些bad record,3.然后第四次再执行的时候,跳过这些bad records 4.
5.新建reducer task的过程也很类似。
6.7.
8.
10.
12.
14.
第二篇:hadoop学习心得
1.FileInputFormat splits only large files.Here “large” means larger than an HDFS block.The split size is normally the size of an HDFS block, which is appropriate for most applications;however,it is possible to control this value by setting various Hadoop properties.2.So the split size is blockSize.3.Making the minimum split size greater than the block size increases the split size, but at the cost of locality.4.One reason for this is that FileInputFormat generates splits in such a way that each split is all or part of a single file.If the file is very small(“small” means significantly smaller than an HDFS block)and there are a lot of them, then each map task will process very little input, and there will be a lot of them(one per file), each of which imposes extra bookkeeping overhead.hadoop处理大量小数据文件效果不好:
hadoop对数据的处理是分块处理的,默认是64M分为一个数据块,如果存在大量小数据文件(例如:2-3M一个的文件)这样的小数据文件远远不到一个数据块的大小就要按一个数据块来进行处理。
这样处理带来的后果由两个:1.存储大量小文件占据存储空间,致使存储效率不高检索速度也比大文件慢。
2.在进行MapReduce运算的时候这样的小文件消费计算能力,默认是按块来分配Map任务的(这个应该是使用小文件的主要缺点)
那么如何解决这个问题呢?
1.使用Hadoop提供的Har文件,Hadoop命令手册中有可以对小文件进行归档。2.自己对数据进行处理,把若干小文件存储成超过64M的大文件。
FileInputFormat is the base class for all implementations of InputFormat that use files as their data source(see Figure 7-2).It provides two things: a place to define which files are included as the input to a job, and an implementation for generating splits for the input files.The job of dividing splits into records is performed by subclasses.An InputSplit has a length in bytes, and a set of storage locations, which are just hostname strings.Notice that a split doesn’t contain the input data;it is just a reference to the data.As a MapReduce application writer, you don’t need to deal with InputSplits directly, as they are created by an InputFormat.An InputFormat is responsible for creating the input splits, and dividing them into records.Before we see some concrete examples of InputFormat, let’s briefly examine how it is used in MapReduce.Here’s the interface:
public interface InputFormat
The JobClient calls the getSplits()method.On a tasktracker, the map task passes the split to the getRecordReader()method on InputFormat to obtain a RecordReader for that split.A related requirement that sometimes crops up is for mappers to have access to the full contents of a file.Not splitting the file gets you part of the way there, but you also need to have a RecordReader that delivers the file contents as the value of the record.One reason for this is that FileInputFormat generates splits in such a way that each split is all or part of a single file.If the file is very small(“small” means significantly smaller than an HDFS block)and there are a lot of them, then each map task will process very little input, and there will be a lot of them(one per file), each of which imposes extra bookkeeping overhead.Example 7-2.An InputFormat for reading a whole file as a record public class WholeFileInputFormat extends FileInputFormat
Input splits are represented by the Java interface, InputSplit(which, like all of the classes mentioned in this section, is in the org.apache.hadoop.mapred package†): public interface InputSplit extends Writable { long getLength()throws IOException;String[] getLocations()throws IOException;}
An InputSplit has a length in bytes, and a set of storage locations, which are just hostname strings.Notice that a split doesn’t contain the input data;it is just a reference to the data.The storage locations are used by the MapReduce system to place map tasks as close to the split’s data as possible, and the size is used to order the splits so that the largest get processed first, in an attempt to minimize the job runtime(this is an instance of a greedy approximation algorithm).As a MapReduce application writer, you don’t need to deal with InputSplits directly, as they are created by an InputFormat.An InputFormat is responsible for creating the input splits, and dividing them into records.Before we see some concrete examples of InputFormat, let’s briefly examine how it is used in MapReduce.Here’s the interface:
public interface InputFormat
Having calculated the splits, the client sends them to the jobtracker, which uses their storage locations to schedule map tasks to process them on the tasktrackers.A path may represent a file, a directory, or, by using a glob, a collection of files and directories.A path representing a directory includes all the files in the directory as input to the job.See “File patterns” on page 60 for more on using globs.It is a common requirement to process sets of files in a single operation.For example, a MapReduce job for log processing might analyze a month worth of files, contained in a number of directories.Rather than having to enumerate each file and directory to specify the input, it is convenient to use wildcard characters to match multiple files with a single expression, an operation that is known as globbing.Hadoop provides two FileSystem methods for processing globs: public FileStatus[] globStatus(Path pathPattern)throws IOException public FileStatus[] globStatus(Path pathPattern, PathFilter filter)throws IOException
第三篇:Hadoop的顶级汇报、分析、可视化、集成和开发工具
驯服大数据的七种武器
随着泰国洪水抬高的硬盘价格逐渐回落到正常水平,数据存储容量的增长速度有望重新开始飙升。这将让风头盖过商业智能的“大数据”应用更加火爆,上至白宫下至沃尔玛都在使用Hadoop、NoSQL数据库和廉价通用服务器的组合进行低成本的大数据分析,不过虽然大数据分析的软硬件成本在降低,但是为数十台大数据服务器编写应用依然比传统SQL数据库来得复杂。而且Hadoop任务是用Java编写的,这进一步增加了复杂性。目前已经有很多大数据工具能够帮助人们驾驭大数据的分布式计算马力,这些工具大多也能与NoSQL数据库一起工作,这与传统数据库相比,NoSQL数据库要灵活得多。
面对大数据,最大的挑战也许来自对数据的理解和提出正确的分析命题/问题,这远比让你的Hadoop任务运行得更快有意义。所以以下列举的这些工具也只是大数据的”器“,而非”道“。
一、Jaspersoft BI Suite
Jaspersoft是从列数据库生成PDF报告的最好的开源软件。JasperReport正跳上大数据的班车,在大数据和其报告生成软件之间增加了一个软件层。JasperReports服务器目前提供软件用于从许多主流存储平台读取数据,包括MongoDB,Cassandra、Redis、Riak、CouchDB和Neo4j。Hadoop自然也不会缺席,JasperReports向HBase提供了一个Hive Connector。但是Jaspersoft的大数据整合工作开始不久,还没有实现完全的集成,例如可视化查询设计工具还不能跟Cassandra的CQL对接,你需要手动输入。
二、Pentaho Business Analytics
Pentaho也是以报告生成引擎起步的软件平台,与Jaspersoft的策略类似,也是通过增加新的数据源来进入大数据市场。你可以讲Pentaho的工具与大多数流行的NoSQL数据库如MongoDB和Cassandra挂接起来。当连接上数据库后,你就能拖放数据库列到窗口和报告界面,就像是用来自SQL数据库的信息一样。Pentaho还提供软件用于从Hadoop集群中抽取HDFS文件数据和HBase数据。其中最新吸引人的工具要数图形编程界面Kettle,也称Pentaho Data Integration。
三、Karmasphere Studio and Analyst
并非所有大数据工具都从报告工具开始。Karmasphere Studio就是基于Eclipse开发的一组插件。它是一个专业化的IDE集成开发环境,可以让Hadoop任务的创建和运行更加容易。
四、Talend Open Studio
Talend也提供了一个基于Eclipse的IDE,用于串联Hadoop的数据处理任务。Talend的工具可用于数据集成、数据质量和数据管理工作,同时为这些工作准备了相应的子程序。Talend Studio允许你通过向模板拖拽建立任务,例如获取RSS的feeds。Talend的TalendForge是一些列的开源扩展,可以与该公司的其他软件搭配工作。大多数工具看上去都是库过滤器,用于将Talend的软件与其他主流厂商如Salesforce.com和SugarCRM的产品进行连接。你可以从这些系统读取数据到到你自己的项目中,这简化了集成工作。
五、Skytree Server
并非所有的工具都被设计用来简化代码与虚拟机制的串联。Skytree提供了一个功能群组,提供了更加复杂的机器学习(Machine-learning)算法。你只需要将正确的命令输入正确的命令行。
六、Tableau 桌面和服务器版
Tableau桌面版是一个可视化工具,能让你更直观地审视数据,你还能抽离数据从不同角度观察,你还能降其他数据混合进来获得新的结果。Tableau在几个版本前就开始拥抱Hadoop,现在你能想处理其他数据一样处理Hadoop的数据。Tableau通过Hive来结构化查询,然后将尽可能多的数据缓存在内存里以实现交互。其他的报告工具都是离线生成报告,而Tableau洗完功能提供一种交互机制,这样你就能不断分割数据。缓存能够部分解决Hadoop集群的延迟问题。
七、Splunk
Splunk与上述工具有所不同,它并不是一个纯粹的报告生成工具或AI路径的集合,虽然它在很大程度上也能实现这些功能。Splunk为你的海量数据创建一个索引,将其整理成可以搜索的链接,其方式就好像这些数据是一本书或者文本块。虽然数据库也内建有指标,但是Splunk的索引方式更像是文本搜索处理。
Splunk的索引功能非常灵活,可以兼容很多数据源,包括日志、配置文件、消息等,基本上所有应用产生的文本数据它都能”吃“下去。Splunk还有很多解决方案套装出售,其中包括监控微软Exchange服务器以及政策web攻击。
Splunk围绕索引抽取文本串和搜索、提供报警和报告功能。你可以敲入重要文章的URL或者IP地址。Splunk会根据数据中的时间戳将结果以时间轴的方式展示出来。这只是一个简单的应用,但如果你在数据Feed中找到的正确的指针,Splunk将非常强大。Splunk非常适合处理日志文件。
Splunk的一个新工具Shep,目前正在Beta内测,提供Hadoop和Splunk之间的双向集成,可以在两个系统间交换数据,你还可以从Hadoop中查询Splunk的数据。
第四篇:Hadoop常见错误总结
Hadoop常见错误总结 2010-12-30 13:55 错误1:bin/hadoop dfs 不能正常启动,持续提示:
INFO ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000.Already tried 0 time(s).原因:由于 dfs 的部分文件默认保存在tmp文件夹,在系统重启时被删除。解决:修改core-site.xml 的 hadoop.tmp.dir配置文件路径:/home/hadoop/tmp。
错误2:hadoop出现了一些问题。用$ bin/hadoop dfsadmin-report 测试的时候,发现dfs没有加载。显示如下:
Configured Capacity: 0(0 KB)Present Capacity: 0(0 KB)DFS Remaining: 0(0 KB)DFS Used: 0(0 KB)DFS Used%: ?% Under replicated blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 查看日志:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /home/hadoop/data: namenode namespaceID = 2033006627;datanode namespaceID = 1589898341 经分析,是由于namenode namespaceID = 2033006627;和datanode namespaceID = 1589898341 不一致造成原因。
修改了namenode namespaceID = 1589898341 可以使用,但是重启之后,又不可以用了。
最后解决方案:删除hadoop用户下的name文件夹,data文件夹,tmp文件夹,temp文件里的内容,然后重新执行namenode命令。重启电脑之后,正常。
错误3:File /home/hadoop/tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1 出现此错误,一般发生在datanode与namenode还没有进行连接,就开始往hdfs系统上put数据了。稍等待一会,就可以了。
也可以使用:hadoop dfsadmin –report命令查看集群的状态。错误4:
每次启动总有部分datanade不能去全部启动,查看日志文件,显示为: ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.net.UnknownHostException: zgchen-ubutun: zgchen-ubutun at java.net.InetAddress.getLocalHost(InetAddress.java:1426)。分析:这是由于datanode 找不到服务host引起的。
解决:通过查找/etc/hostname 找到hostname;比如:ubuntu。然后找到/etc/hosts,添加:127.0.1.1 ubuntu 错误5:
java.lang.OutOfMemoryError: GC overhead limit exceeded 分析:这个是JDK6新添的错误类型。是发生在GC占用大量时间为释放很小空间的时候发生的,是一种保护机制。解决方案是,关闭该功能,可以添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit 添加位置是:mapred-site.xml 里新增项:mapred.child.java.opts 内容:-XX:-UseGCOverheadLimit java.lang.OutOfMemoryError: Java heap space 出现这种异常,明显是jvm内存不够得原因,要修改所有的datanode的jvm内存大小。
Java-Xms1024m-Xmx4096m 一般jvm的最大内存使用应该为总内存大小的一半,我们使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。(其实对于最好设置为真实物理内存大小的0.8)
错误6:Too many fetch-failures Answer: 出现这个问题主要是结点间的连通不够全面。1)检查、/etc/hosts 要求本机ip 对应 服务器名
要求要包含所有的服务器ip + 服务器名 2)检查.ssh/authorized_keys 要求包含所有服务器(包括其自身)的public key 错误7:处理速度特别的慢 出现map很快 但是reduce很慢 而且反复出现 reduce=0% Answer: 结合第二点,然后修改可用内存大小。
conf/hadoop-env.sh 中的export HADOOP_HEAPSIZE=4000 错误8:能够启动datanode,但无法访问,也无法结束的错误
在重新格式化一个新的分布式文件时,需要将你NameNode上所配置的dfs.name.dir这一namenode用来存放NameNode 持久存储名字空间及事务日志的本地文件系统路径删除,同时将各DataNode上的dfs.data.dir的路径 DataNode 存放块数据的本地文件系统路径的目录也删除。如本此配置就是在NameNode上删除/home/hadoop/NameData,在DataNode上删除/home/hadoop/DataNode1和/home/hadoop/DataNode2。这是因为Hadoop在格式化一个新的分布式文件系统时,每个存储的名字空间都对应了建立时间的那个版本(可以查看/home/hadoop /NameData/current目录下的VERSION文件,上面记录了版本信息),在重新格式化新的分布式系统文件时,最好先删除NameData 目录。必须删除各DataNode的dfs.data.dir。这样才可以使namedode和datanode记录的信息版本对应。
注意:删除是个很危险的动作,不能确认的情况下不能删除!做好删除的文件等通通备份!
错误9:java.io.IOException: Could not obtain block: blk_***469_1100 file=/user/hive/warehouse/src_20100924_log/src_20100924_log 出现这种情况大多是结点断了,没有连接上。或者
mapred.tasktracker.map.tasks.maximum 的设置 超过 cpu cores数目,导致出现获取不到文件。
错误10:Task Id : attempt_201010291615_0001_m_000234_0, Status : FAILED Error: java.io.IOException: No space left on device Task Id : attempt_201010291615_0001_m_000240_0, Status : FAILED java.io.IOException: Spill failed 磁盘空间不够,应该分析磁盘空间df-h 检查是否还存在磁盘空间。错误11:Task Id : attempt_201011011336_0007_m_000001_0, Status : FAILED org.apache.hadoop.hbase.client.RegionOfflineException: region offline: lm,1288597709144 网上说,将/hbase删除;重启hbase后,可以正常应用了。但是我找不到/hbase目录,只好自己重新删除掉一些hadoop文件,重新生成文件管理系统。
还有一个可能是,配置错了/hbase/conf/hbase-env.sh的HBASE_CLASSPATH,这个默认是不配置的,所以可以不配置。
错误12:org.apache.hadoop.hbase.TableNotFoundException: org.apache.hadoop.hbase.TableNotFoundException: lm 找不到表,hbase启动了,检查一下是否存在需要的Htable。
第五篇:bote之分析(定稿)
波特五力模型分析汽车行业[2]
我国汽车市场的连续快速增长和总规模的不断扩大,使我国汽车市场的国际地位显著提升,我国汽车市场已经成为世界汽车市场不可分割的重要组成部分。我国汽车销量占全球汽车总销量的比例,已经由2001年的4.3%提升到2004年的8.1%,2005年全年汽车总需求达到575万辆左右,中国已成为与日本相比的全球第二大汽车消费市场,进一步提升到8.7%。全球每年汽车销量的增量中我国占25%左右,我国已经成为推动全球汽车市场增长的主要力量。
五力分析模型是迈克尔·波特(Michael Porter)于80年代初提出,对企业战略制定产生全球性的深远影响。用于竞争战略的分析,可以有效的分析客户的竞争环境。波特五力分析属于外部环境分析中的微观环境分析,主要用来分析本行业的企业竞争格局以及本行业与其他行业之间的关系。根据波特(M.E.Porter)的观点,一个行业中的竞争,不止是在原有竞争对手中进行,而是存在着五种基本的竞争力量:潜在的行业新进入者、替代品的竞争、买方讨价还价的能力、供应商讨价还价的能力以及行业内竞争者现在的竞争能力。这五种基本竞争力量的状况及综合强度,决定着行业的竞争激烈程度,从而决定着行业中最终的获利潜力以及资本向本行业的流向程度,这一切最终决定着企业保持高收益的能力。一种可行战略的提出首先应该包括确认并评价这五种力量,不同力量的特性和重要性因行业和公司的不同而变化,波特的竞争力模型的意义在于,五种竞争力量的抗争中蕴含着三类成功的战略思想,那就是大家熟知的:总成本领先战略、差异化战略、专一化战略。
下面用五力分析模型来分析下汽车行业及其领域内的战略方针。
1.供应商的讨价还价能力
许多汽车够加大了中国市场战略部署,例如:福特汽车公司未来在中国将不断加强投入与合作力度,争取取得轿车市场10%的占有率,生产能力将实现从原有的四万辆达到40万辆的巨大转变,并实现大部分车辆生产本地化。丰田汽车公司全球生产布局显示,除日本本土外,北美地区(特别是美国)和亚洲地区(特别是中国)是丰田在海外投资最大的地区。美国和中国已经成为丰田在海外主要的生产基地,丰田公司的总体市场目标是到2010~2012年在中国拥有10%的市场份额。本田汽车公司计划未来获得中国10%的市场份额,并计划将生产能力由现在的27万辆扩大到2006年下半年的53万辆(含出口5万辆)。
目前局势来看,我国汽车市场不仅成为大众、通用、本田、现代等在中国已经具有重大影响的跨国公司的战略市场,现代汽车公司已将中国作为其全球战略的重要组成部分,计划到2010年乘用车在华产能达到100万辆,使中国成为其四大海外工厂中仅次于印度的第二大海外工厂;同时,以汽车生产销售为中心,通过制造、服务、金融等汽车相关产业的扩大,来达到2010年200亿美元的销售目标;此外,现代还计划进军中国的商用车市场,有可能与江淮携手建立商用车生产基地,计划在2010年前形成年产五万台小型商用车发动机、一万辆客车和九万辆货车的生产能力。世界各汽车零配件行业巨头,也纷纷做出了增资中国的计划,美国固特异轮胎橡胶有限公司将其亚太总部迁至上海,博世也要在中国追加投资。
由此可见波特五力模型中的成本领先战略已经被各大汽车公司消无生息的运作开了,在中国建造生产基地,按国情来看无疑降低了成本、人力、运输费用,大大降低了成本,同时也面对着许多客观问题降低了购买者讨价还价的负面影响。供方主要通过其提高投入要素价格与降低单位价值质量的能力,来影响行业中现有企业的盈利能力与产品竞争力。进口汽车供方力量的强弱主要取决于他们所提供给买主的是什么投入要素,当供方所提供的投入要素其价值构成了买主产品总成本的较大比例、对买主产品生产过程非常重要、或者严重影响买主产品的质量时,供方对于买主的潜在讨价还价力量就大大增强。
2.购买者的讨价还价能力
购买者主要通过其压价与要求提供较高的产品或服务质量的能力,来影响行业中现有企业的盈利能力。汽车在国内的卖方行业由大量相对外资企业来说规模较小的企业所组成,这些企业的市场价明显低于原装进口汽车,仅仅因为made in China?还有更多的可能是一种低价位符合国情的亲众的营销策略。
在中国发达地区,如北京、上海等城市购买者所购买的基本上是一种标准化产品,同时向多个卖主购买产品在经济上也完全可行。这就对每个产品产生了购买方分流,并会处于同时被几家竞争对手比较的局面。这就形成了购买者有能力实现後向一体化,而卖主不可能前向一体化的潜在市场不利因素。提高了购买者讨价还价能力,国产轿车价格仍将有一定幅度的下降。如果没有人民币的大幅度升值,进口轿车价格下降对国产轿车的价格压力已经很小,2006年引起国产轿车价格下降的主要动力来自于国内厂商之间的竞争,从根本上讲是产能过剩导致的供过于求。但是产能过剩并不一定直接带来价格下降,如美国、日本等国家汽车工业普遍存在产能过剩的问题,而这些国家的轿车价格不仅没有下降,反而在逐年缓慢上涨。之所以判断2008年国产轿车价格将继续出现一定幅度的下降,主要是目前我国轿车市场运行中既有价格下降的必要性,又存在价格下降的现实可能性。其次,汽车零部件平均关税下降人民币升值压力将有利于进口车价的下调。2005年7月份人民币对美元的汇率一次性升值2%,之后的半年时间内人民币对美元的汇率又升值了0.44%,2007年现在已经突破7.5关口,而且人民币升值的压力继续存在。如果2008年人民币继续小幅度升值,将直接促成进口车成本的下降。有利于国人购买力的提高,被动提高了我们讨价还价能力。同时也让合资企业从中大赚了一笔。
3.新进入者的威胁
后进入中国市场的大跨国公司急于追赶与扩张,在价格上寻求竞争力。福特公司作为全球第二大汽车厂商,目前在中国的发展状况与其地位很不相称,从2005年开始明显加大了在中国市场的运作力度,福克斯的最低价为12.8万元,作为一款欧美车型很有竞争力,销量增长迅速。丰田汽车公司也适当改变了做法,在稳步推进的主旋律中加快了步伐。2005年年初花冠、威驰降价只是起步,有竞争力的新产品还将不断推出,价格也更具竞争力。新进入者在给行业带来新生产能力、新资源的同时,将希望在已被现有企业瓜分完毕的市场中赢得一席之地,这就有可能会与现有企业发生原材料与市场份额的竞争,最终导致行业中现有企业盈利水平降低,严重的话还有可能危及这些企业的生存。竞争性进入威胁的严重程度取决于两方面的因素,这就是进入新领域的障碍大小与预期现有企业对于进入者的反应情况。
有竞争力的新产品上市,而且惯例是以有杀伤力的价格切入市场。本田将于2006年推出“思域”,本田在产品战略上一贯坚持“产品定价要一步到位”的策略,雅阁、飞度、CRV等车型的上市均采取了这样的策略,有理由相信本田将以有竞争力的价格推出“思域”。另外马自达的新M3于2006年上市,而且是由福特公司统一运作。福特公司从2005年开始明显是在运用价格手段来获取竞争力以尽快扩大市场份额。
潜在的行业新进入者是行业竞争的一种重要力量,这些新进入者大都拥有新的生产能力和某些必需的资源,期待能建立有利的市场地位。新进入者加入该行业,会带来生产能力的扩大,带来对市场占有率的要求,这必然引起与现有企业的激烈竞争,使产品价格下跌;另一方面,新加入者要获得资源进行生产,从而可能使得行业生产成本升高,这两方面都会导致行业的获利能力下降。
4.替代品的威胁
两个处于不同行业中的企业,可能会由于所生产的产品是互为替代品,从而在它们之间产生相互竞争行为,这种源自于替代品的竞争会以各种形式影响行业中现有企业的竞争战略。本行业与生产替代产品的其它行业进行的竞争,常常需要本行业所有企业采取共同措施和集体行动。全球汽车业目前面临的最大挑战就是研发价格合适且款式吸引人的环保型汽车。
2007年7月通用汽车公司(General Motors Corp)称,它与蓬斯克公司(Penske Corp.)达成一项合资协议,将购买意大利柴油发动机生产商VM Motori 50%的股票。公司没有透露这笔交易的金额。通用汽车称,它将与VM Motori联合开发新型
2.9升,V-6涡轮柴油机。VM Motori将于2009年在欧洲启动其Cadilac CTS,并且计划在意大利Cento的工厂建立新的部门。据通用副主席Bob Lutz说,通用将于2010年美国市场,在凯迪拉克和土星系列中选配高燃油经济性的柴油机。柴油机将用在通用的轿车,Crossover和轻卡上。一系列的产品计划及新能源的开发应用都将验证通用汽车作为汽车行业领先者为现实和谐发展的目标所作出的卓绝努力。
日前,通用汽车欧洲公司发布了全新的环境战略,短期内将以降低二氧化碳排放量为主要目标,而长期的目标则是通过新技术的应用最终实现零排放,实现汽车与自然环境和谐发展。首先,现有企业产品售价以及获利潜力的提高,将由于存在着能被用户方便接受的替代品而受到限制;
通用汽车在此次全新环境战略中宣布:将以提高内燃机效率及多样化能源利用为手段,降低二氧化碳排放。通用汽车欧洲公司计划在2012年之前,开发16款新型发动机匹配到93款新车型上,另外还有10款新的变速器将被应用于48款新车型上。由于替代品生产者的侵入,使得现有企业必须提高产品质量、或者通过降低成本来降低售价、或者使其产品具有特色,否则其销量与利润增长的目标就有可能受挫;通用汽车已投资超过10亿美元用于氢能源技术的开发与应用。目前,通用汽车的氢能源战略已走出实验室,开始在各种车型上进行实践,其终极目标正是实现燃料电池的量产。
总之,替代品价格越低、质量越好、用户转换成本越低,其所能产生的竞争压力就强;而这种来自替代品生产者的竞争压力的强度,可以具体通过考察替代品销售增长率、替代品厂家生产能力与盈利扩张情况来加以描述。
5.行业内现有竞争者的竞争
大部分行业中的企业,相互之间的利益都是紧密联系在一起的,作为汽车企业整体战略一部分的各企业竞争战略,其目标都在于使得自己的企业获得相对于竞争对手的优势,所以,在实施中就必然会产生冲突与对抗现象,这些冲突与对抗就构成了现有企业之间的竞争。现有企业之间的竞争常常表现在价格、广告、产品介绍、售後服务等方面,其竞争强度与许多因素有关。经过多年积累,自主品牌竞争优势全面提升,预示着汽车工业将以两种方式推动经济发展(推动GDP增长和推动出口产品结构升级)。我国多数自主品牌汽车的发展开始于2000年前后,总体发展比较顺利,尤其是我国加入WTO的前两年,增长更为迅速,为自主品牌的发展打下了良好基础。但是由于宏观调控的影响,2004年5月份起乘用车总体市场出现滑坡,自主品牌受影响更大。然而,经过自主品牌企业自身的艰苦努力和国家相关政策支持,自主品牌的竞争优势在2005年得到了全面提升,以奇瑞为代表的自主品牌销量大幅度增长。由于自主品牌的发展,我国汽车工业的出口能力显著增强,多年来汽车进口大于出口的局面在2005年首次得到扭转。2005年l~10月份汽车工业累计出口162.6亿美元,同比增长55.67%,汽车业累计进口120.8亿美元,同比下降5.52%,出口大于进口42亿美元。2005年1~11月份汽车累计出口量达到13万辆,累计进口量为12.8万辆,出口数量首次大于进口数量。几个自主品牌,如奇瑞、吉利等都有较大量的出口。
另外各大外资企业间的竞争也不容质疑了,例如:为扭转在美国汽车市场份额大幅下滑局面,GM(通用汽车公司)近日宣布,将通过削减价格、裁撤重叠车型等一系列举措对现行的美国市场战略进行实质性变更,以反击正迅速占领美国东西部海岸人口密集区市场的国外汽车品牌。GM增加美国市场销售的四大措施:
调整价格战略突出低价优势整合庞蒂克(pontiac)和别克(Buick)品牌,削减重合车型在吸引海外客户上增加投资更新换代关键市场领域中的代理商资
虽然面临国际汽车公司和中国汽车公司的激烈竞争,导致近3年来汽车价格下降很快,但通用公司还是计划增加产能,并对在中国的前景充满信心。通用中国总裁甘文维(Kevin Wale)表示,到2020年中国将成为世界第一大汽车市场,如果市场年增长率能够保持在目前15%的水平,这一天还会提前到来。上海通用汽车总经理陈虹谈起他们引以为傲的差异化竞争战略时娓娓而谈“今后在市场中能够胜出的,一定是在差异化竞争中做得较好的企业”。他认为,中国汽车市场的竞争水平还不高,基本上还停留在同质化阶段,大家都在“烧钱”。因此,在市场表现上,往往是你降价,我也降价;你促销,我也促销。上海通用正在尝试走一条差异化竞争的道路。伴随着市场竞争广度和深度的进一步拓展,企业之间的竞争已经超越了经营效率竞争的层面。有竞争力的企业,不仅在整个业务链上都有创造性,而且,其品牌和产品都有明确的用户定位,所提供的产品和服务让用户感到物有所值。比如,与三厢凯越相比,由意大利著名汽车设计大师乔治.亚罗设计的凯越HRV,是一款全新的五门掀背式两厢车,具有浓郁的欧洲风情。经过广泛的市场调查,上海通用确定其目标客户的特点是健康(Healthy)、休闲(Recreational)、活力
(Vigorous),并用它们的第一个字母为这款车起了个名字——HRV,我们期待着HRV能在低迷的车市中创造另一道亮丽的风景。行业中的每一个企业或多或少都必须应付以上各种力量构成的威胁,而且客户必面对行业中的每一个竞争者的举动。除非认为正面交锋有必要而且有益处,例如要求得到很大的市场份额,否则客户可以通过设置进入壁垒,包括差异化和转换成本来保护自己。根据上面对于五种竞争力量的讨论,我认为企业可以采取尽可能地将自身的经营与竞争力量隔绝开来、努力从自身利益需要出发影响行业竞争规则、先占领有利的市场地位再发起进攻性竞争行动等手段来对付这五种竞争力量,以增强自己的市场地位与竞争实力。