资讯动态

非集群模式部署大数据组件:Hadoop、Spark与Hive单机环境搭建实战

发布时间:2026/10/17 9:45:27 来源:尧图企业网站定制
1. 非集群模式部署的整体设计思路1.1 为什么要在单机环境跑大数据组件很多人一听到“大数据环境”第一反应就是上集群、堆节点、搞分布式。但实际工作中大量场景根本用不着集群。比如做地理信息数据的预处理、小规模空间分析、教学演示、功能验证甚至是一些边缘节点的离线计算任务单机非集群模式反而是更务实的选择。我接触过不少做GIS数据处理的朋友他们手头的数据量通常在几十GB到几百GB之间用ArcGIS做空间分析时瓶颈往往不在计算资源而在数据格式转换和I/O效率上。这种情况下部署一套完整的Hadoop集群纯属浪费——三台起步的服务器、复杂的网络配置、ZooKeeper和NameNode的高可用维护光是运维成本就够喝一壶的。非集群模式的核心思路很简单把大数据生态里那些好用的组件以“伪分布式”或“本地模式”的方式跑在一台机器上。Hadoop可以配成伪分布式Spark可以跑Local模式Hive用内嵌的Derby数据库做元数据存储HBase也能以单机模式启动。这样既保留了大数据组件的API兼容性又省去了集群管理的麻烦。注意非集群模式不等于“阉割版”。很多组件的单机模式功能是完整的只是不具备分布式容错和高并发能力。对于数据量在单机内存和磁盘可承受范围内的任务性能表现完全够用。1.2 非集群模式与集群模式的关键差异先把这个事情说清楚免得后面踩坑。非集群模式和集群模式最本质的区别在于资源调度和数据分布。集群模式下YARN或Mesos负责跨节点的资源分配HDFS把数据切块分散到不同机器上计算任务被拆成多个Task并行执行。这套机制的好处是横向扩展能力强坏处是架构复杂、调试困难、小任务启动开销大。非集群模式下所有组件共享同一台机器的CPU、内存和磁盘。Hadoop的伪分布式模式虽然也启动NameNode、DataNode、ResourceManager、NodeManager这些守护进程但它们都在同一个JVM或同一台机器的不同端口上运行。Spark的Local模式更直接Driver和Executor在同一个进程里没有网络通信开销。对比维度集群模式非集群模式节点数量3台起步1台数据存储HDFS分布式存储本地文件系统或单节点HDFS资源调度YARN/Mesos/K8s本地JVM或伪分布式YARN容错能力有副本机制无或有限适用数据量TB级以上GB级到百GB级运维复杂度高低硬件成本高低这个表格不是绝对的比如单节点HDFS也可以存TB级数据只是没有冗余保护。关键是要根据实际数据量和业务需求来选。1.3 组件选型与版本搭配的考量ArcGIS和大数据组件集成时版本兼容性是头号大坑。我见过太多人在这上面翻车——Spark版本和Hadoop版本对不上Hive元数据schema不兼容或者ArcGIS的GIS Tools for Hadoop插件跟新版本Hadoop彻底闹掰。基于实际项目经验我建议采用以下版本组合策略Hadoop 2.7.x或3.1.x2.7系列最稳定生态兼容性最好3.1系列支持Erasure Coding但对ArcGIS集成来说不是必须的。Spark 2.4.x这个版本对Hadoop 2.7和3.x都兼容而且GIS Tools for Hadoop对2.4的支持最成熟。Hive 2.3.x元数据存储用MySQL比Derby更可靠后面会详细说。HBase 1.4.x或2.x如果不需要实时读写HBase可以暂时不装。JDK 1.8别用JDK 11Hadoop 2.7在JDK 11上有一堆反射相关的报错。实操心得版本选择上宁可保守也不要激进。新版本的大数据组件往往引入了新的依赖和配置项而ArcGIS的集成插件更新频率远跟不上大数据社区的节奏。用老版本稳定跑通比用新版本天天排查兼容性问题划算得多。2. 系统环境准备与基础配置2.1 操作系统层面的调优非集群模式虽然只有一台机器但这台机器的配置直接决定了整个环境的性能上限。操作系统层面有几个关键点必须提前处理。首先是文件句柄数。Hadoop和Spark在运行时会打开大量文件默认的1024个句柄根本不够用。修改/etc/security/limits.conf加上这几行* soft nofile 65536 * hard nofile 65536 * soft nproc 32768 * hard nproc 32768然后是内存交换策略。Linux默认的vm.swappiness值是60意味着内存不够时积极使用交换分区。但大数据组件对内存延迟极其敏感一旦发生swap性能断崖式下跌。建议把vm.swappiness调到1或0echo vm.swappiness 1 /etc/sysctl.conf sysctl -p还有透明大页THP。这个特性对数据库类负载有好处但对Hadoop和Spark来说是个灾难会导致内存分配延迟飙升。关闭方法echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag注意THP的关闭命令在重启后会失效需要写进/etc/rc.local或systemd服务里做持久化。2.2 主机名与hosts文件配置非集群模式下主机名配置看似简单但很多“莫名其妙”的报错都源于此。Hadoop的很多组件在启动时会通过主机名反查IP如果/etc/hosts里没有正确映射就会卡在“连接超时”或“UnknownHostException”。假设主机名设为gis-bigdata/etc/hosts应该这样写127.0.0.1 localhost localhost.localdomain 192.168.1.100 gis-bigdata把实际IP和主机名对应上不要只用127.0.0.1。另外/etc/sysconfig/network里的HOSTNAME也要改成一致。踩过的坑有一次帮人排查Spark任务提交失败的问题折腾了两个小时最后发现是/etc/hosts里主机名写错了字母。这种低级错误在单机环境里特别容易犯因为觉得“就一台机器随便写写就行”。2.3 SSH免密登录配置即使是单机非集群模式Hadoop的启动脚本仍然依赖SSH来分发命令。如果没配免密登录每次启动都要输密码脚本自动化就无从谈起。生成密钥对并授权ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys然后验证一下ssh localhost如果能直接登录而不需要密码就说明配置成功了。实操心得有些Linux发行版默认禁用了root用户的SSH登录如果你用root操作需要检查/etc/ssh/sshd_config里的PermitRootLogin参数。改成yes后重启sshd服务。2.4 JDK安装与环境变量JDK的安装没什么好说的但环境变量的配置有几个细节值得注意。export JAVA_HOME/usr/local/jdk1.8.0_291 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarJAVA_HOME的路径不要带空格不要用软链接指向的路径。Hadoop的某些脚本在处理路径时对空格和符号链接的支持不好直接用真实路径最稳妥。验证安装java -version javac -version两个命令都能正常输出版本号才算配置到位。3. Hadoop伪分布式环境搭建3.1 Hadoop安装与目录规划Hadoop的安装包解压到/usr/local/hadoop但数据目录和日志目录建议单独规划。我的习惯是这样/usr/local/hadoop # 安装目录 /data/hadoop/tmp # 临时文件目录 /data/hadoop/dfs/name # NameNode数据目录 /data/hadoop/dfs/data # DataNode数据目录 /data/hadoop/logs # 日志目录这样规划的好处是安装目录可以随时替换升级数据目录独立挂载到大容量磁盘上日志目录也方便单独清理。3.2 核心配置文件详解Hadoop的配置文件都在$HADOOP_HOME/etc/hadoop/下非集群模式需要改这几个core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://gis-bigdata:9000/value /property property namehadoop.tmp.dir/name value/data/hadoop/tmp/value /property /configurationfs.defaultFS指定了默认文件系统的地址hdfs://gis-bigdata:9000表示用HDFS作为默认FS主机名是gis-bigdata端口9000。hdfs-site.xmlconfiguration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/data/hadoop/dfs/name/value /property property namedfs.datanode.data.dir/name value/data/hadoop/dfs/data/value /property property namedfs.permissions.enabled/name valuefalse/value /property /configurationdfs.replication设为1因为只有一台机器设成3会导致副本永远无法满足NameNode一直报“under-replicated blocks”警告。dfs.permissions.enabled设为false可以省去很多权限相关的麻烦生产环境另说。mapred-site.xml先从模板复制cp mapred-site.xml.template mapred-site.xmlconfiguration property namemapreduce.framework.name/name valueyarn/value /property property namemapreduce.application.classpath/name value$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*/value /property /configurationyarn-site.xmlconfiguration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.resource.memory-mb/name value8192/value /property property nameyarn.scheduler.maximum-allocation-mb/name value8192/value /property /configurationyarn.nodemanager.resource.memory-mb要根据实际物理内存来设。如果机器有16GB内存给YARN分配8GB比较合理剩下的留给操作系统和其他组件。3.3 内存参数的计算逻辑YARN的内存配置不是拍脑袋定的有个简单的计算公式预留2-4GB给操作系统预留2GB给NameNode和DataNode预留2GB给Hive Metastore和MySQL剩下的给YARN NodeManager假设物理内存16GB那么NodeManager可以分配8GB。每个Container的最小内存默认是1024MB最大内存设为8192MB。这样理论上可以同时跑8个1GB的Container或者1个8GB的大Container。注意yarn.scheduler.maximum-allocation-mb必须大于等于yarn.nodemanager.resource.memory-mb否则提交大内存任务时会直接被拒绝。3.4 格式化与启动验证配置改完后第一次启动前需要格式化NameNodehdfs namenode -format这个命令只能执行一次。如果后续改了dfs.namenode.name.dir的路径需要重新格式化如果只是改了其他配置不要重复格式化否则会导致DataNode的clusterID和NameNode不一致DataNode无法启动。启动HDFS和YARNstart-dfs.sh start-yarn.sh验证进程jps应该看到NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager这五个进程。验证HDFShdfs dfs -mkdir -p /user/gis hdfs dfs -ls /能正常创建目录和列出文件说明HDFS工作正常。4. Spark与Hive的集成配置4.1 Spark Local模式的部署要点Spark在非集群模式下有两种运行方式Local模式和伪分布式模式Standalone。对于ArcGIS数据处理来说Local模式更简单直接。解压Spark安装包到/usr/local/spark配置spark-env.shexport JAVA_HOME/usr/local/jdk1.8.0_291 export HADOOP_CONF_DIR/usr/local/hadoop/etc/hadoop export SPARK_LOCAL_IPgis-bigdata export SPARK_MASTER_HOSTgis-bigdata export SPARK_MASTER_PORT7077HADOOP_CONF_DIR指向Hadoop的配置目录这样Spark就能自动读取HDFS和YARN的配置不需要重复配置。启动Spark/usr/local/spark/sbin/start-all.sh验证/usr/local/spark/bin/spark-shell --master local[4]local[4]表示用4个线程模拟并行计算。在Spark Shell里执行一个简单的WordCountval data sc.parallelize(List(hello world, hello spark, hello gis)) val counts data.flatMap(_.split( )).map((_, 1)).reduceByKey(_ _) counts.collect().foreach(println)能正常输出结果说明Spark Local模式配置成功。4.2 Hive元数据存储的选择Hive默认用Derby作为元数据库但Derby有个致命缺陷同一时间只允许一个会话连接。这意味着你开了Hive CLI就不能再开第二个否则报错。对于需要同时跑多个脚本的场景这完全不可接受。换成MySQL是标准做法。安装MySQL后创建Hive元数据库CREATE DATABASE hive_metastore CHARACTER SET latin1; CREATE USER hive% IDENTIFIED BY hive_password; GRANT ALL PRIVILEGES ON hive_metastore.* TO hive%; FLUSH PRIVILEGES;注意字符集用latin1而不是utf8因为Hive的元数据表里有些字段长度是固定的用utf8可能导致索引超长。配置hive-site.xmlconfiguration property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://gis-bigdata:3306/hive_metastore?createDatabaseIfNotExisttrue/value /property property namejavax.jdo.option.ConnectionDriverName/name valuecom.mysql.jdbc.Driver/value /property property namejavax.jdo.option.ConnectionUserName/name valuehive/value /property property namejavax.jdo.option.ConnectionPassword/name valuehive_password/value /property /configuration把MySQL的JDBC驱动包放到$HIVE_HOME/lib/下然后执行schematool -initSchema -dbType mysql初始化元数据表。4.3 Spark与Hive的集成Spark SQL要访问Hive表需要把hive-site.xml放到$SPARK_HOME/conf/下同时把MySQL驱动包放到Spark的classpath里。启动Spark Shell时加上--enableHiveSupportspark-shell --master local[4] --enableHiveSupport然后在Shell里执行spark.sql(show databases).show() spark.sql(use default) spark.sql(create table test_table (id int, name string) row format delimited fields terminated by ,)能正常建表说明Spark和Hive的集成没问题。实操心得Spark和Hive的版本必须匹配。Spark 2.4.x内置的Hive版本是1.2.1如果你外部的Hive是2.3.x需要在Spark的配置里指定spark.sql.hive.metastore.version和spark.sql.hive.metastore.jars否则会出现元数据版本不兼容的报错。5. ArcGIS与大数据组件的对接5.1 GIS Tools for Hadoop的安装Esri官方提供的GIS Tools for Hadoop是连接ArcGIS和Hadoop生态的桥梁。这个工具包包含几个核心组件Esri Geometry API for Java在Hadoop任务里处理空间几何对象Spatial Framework for Hadoop提供空间数据的分区、索引和查询能力Hive Spatial UDF在Hive SQL里直接调用空间函数安装步骤不复杂把jar包放到Hadoop和Hive的classpath里就行。但要注意这个工具包对Hadoop和Hive的版本有严格要求下载前先确认版本匹配。5.2 空间数据在HDFS上的组织方式ArcGIS处理的空间数据导入HDFS时需要考虑分区策略。按空间范围分区是最自然的方式比如按经纬度网格切分每个网格对应一个HDFS目录。hdfs dfs -mkdir -p /gis/data/points/grid_x1_y1 hdfs dfs -put local_points.csv /gis/data/points/grid_x1_y1/这样组织的好处是做空间查询时可以只扫描相关网格的数据避免全表扫描。5.3 在Hive中创建空间表用Hive SQL创建带空间字段的表CREATE EXTERNAL TABLE spatial_points ( id INT, name STRING, longitude DOUBLE, latitude DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE LOCATION /gis/data/points;然后可以用Hive Spatial UDF做空间查询SELECT id, name FROM spatial_points WHERE ST_Contains(ST_Polygon(POLYGON((...))), ST_Point(longitude, latitude));这个查询会返回落在指定多边形内的所有点。注意Hive Spatial UDF的性能取决于数据分区是否合理。如果所有数据都在一个目录下查询会触发全表扫描速度很慢。建议按空间网格做二级分区。6. 常见问题与排查技巧实录6.1 启动类问题速查问题现象可能原因排查方法解决方案NameNode启动失败端口被占用netstat -tlnp | grep 9000杀掉占用进程或改端口DataNode无法启动clusterID不一致查看DataNode日志删除data目录重新格式化ResourceManager启动失败内存不足free -h查看内存减少YARN分配内存Spark Shell启动报ClassNotFoundHADOOP_CONF_DIR未设置echo $HADOOP_CONF_DIR在spark-env.sh里设置Hive连接MySQL失败驱动包未放对位置查看Hive日志把JDBC驱动放到$HIVE_HOME/lib6.2 性能类问题排查非集群模式下性能瓶颈通常出现在三个地方磁盘I/O、内存不足、CPU单核跑满。磁盘I/O问题可以通过iostat -x 1来观察。如果%util长期接近100%说明磁盘是瓶颈。解决方案是把数据目录分散到多块磁盘上或者换SSD。内存不足的表现是频繁GC甚至OOM。用jstat -gcutil pid 1000观察GC情况。如果Full GC频繁需要调整JVM堆大小。在hadoop-env.sh里设置export HADOOP_HEAPSIZE4096 export HADOOP_NAMENODE_OPTS-Xmx4096m -Xms4096mCPU单核跑满通常是因为并行度不够。Spark的local[N]里的N要设成CPU核心数Hive的mapreduce.job.reduces也要适当调大。6.3 数据类问题排查空间数据导入HDFS后经常遇到中文乱码、字段错位、坐标精度丢失等问题。中文乱码通常是编码问题。Hive表创建时指定SERDEPROPERTIES (serialization.encodingUTF-8)源文件也要确保是UTF-8编码。字段错位多半是分隔符冲突。如果字段内容里本身包含逗号用逗号做分隔符就会出问题。解决方案是换一个不会出现在数据里的分隔符比如\u0001。坐标精度丢失是因为用FLOAT类型存储经纬度。FLOAT只有7位有效数字对于经纬度来说精度不够。改用DOUBLE有15位有效数字完全够用。踩过的坑有一次导入CSV数据发现所有记录的最后一个字段都是空的。排查了半天发现是Windows换行符\r\n的问题。Hive默认只认\n\r被当成了最后一个字段的一部分。解决方案是在建表时指定LINES TERMINATED BY \n或者提前用dos2unix转换文件格式。6.4 独家避坑技巧汇总技巧一日志是第一手线索。遇到问题先看日志$HADOOP_HOME/logs/、$SPARK_HOME/logs/、/var/log/mysql/90%的问题都能在日志里找到答案。技巧二小步验证不要一步到位。先确保HDFS能用再配YARN再配Spark最后配Hive。每步都验证通过再往下走出问题时排查范围小得多。技巧三配置文件改完先备份。cp core-site.xml core-site.xml.bak改坏了随时能回滚。技巧四端口冲突用netstat查。Hadoop生态用的端口很多8020、9000、8088、7077、9083装之前先确认这些端口没被占用。技巧五内存不够就减组件。非集群模式下HBase和ZooKeeper不是必须的。如果内存紧张先不装这两个等需要时再加。这个环境搭好之后后续还可以往几个方向扩展一是接入Kafka做实时数据流处理二是用Zeppelin或Jupyter做交互式分析三是把单机环境容器化方便迁移和复制。不过那是另一个话题了先把当前这套跑稳再说。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑