Spark运行任务

1. 启动hadoop
sh start-dfs.sh
sh start-yarn.sh

2. 启动spark
cd /appl/spark-1.4.0/
sbin/start-all.sh

3. 准备数据
hadoop fs -put /mk/test/kmeans_data.txt /test/

4. 编写程序


Java

import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.mllib.clustering.KMeans;
import org.apache.spark.mllib.clustering.KMeansModel;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.SparkConf;

/* Test:
 * sh start-dfs.sh
 * sh start-yarn.sh
 * cd /appl/spark-1.4.0/
 * sbin/start-all.sh
 * hadoop fs -put /mk/test/kmeans_data.txt /test/
 * ./bin/spark-submit /mk/test/KMeansSim.jar
 */
public class KMeansSim {
  public static void main(String[] args) {
	// environment initialization
    SparkConf conf = new SparkConf().setAppName("K-means Example");
    JavaSparkContext sc = new JavaSparkContext(conf);

    // Load and parse data (${SPARK_HOME}/data/mllib/kmeans_data.txt)
    String path = "/test/kmeans_data.txt";
    JavaRDD<String> data = sc.textFile(path);
    JavaRDD<Vector> parsedData = data.map(
      new Function<String, Vector>() {
        public Vector call(String s) {
          return Vectors.dense(toDoubleArray(s));
        }
      }
    );
    parsedData.cache();

    // Cluster the data into two classes using KMeans
    int numClusters = 2;
    int numIterations = 20;
    KMeansModel clusters = KMeans.train(parsedData.rdd(), numClusters, numIterations);

    // Evaluate clustering by computing Within Set Sum of Squared Errors
    double WSSSE = clusters.computeCost(parsedData.rdd());
    System.out.println("Within Set Sum of Squared Errors = " + WSSSE);

    // Save and load model
    clusters.save(sc.sc(), "myModelPath");
    KMeansModel sameModel = KMeansModel.load(sc.sc(), "myModelPath");
    
    // predict test
    System.out.println("~~~predict:" + clusters.predict(Vectors.dense(
    		toDoubleArray("1.0 2.1 3.8"))));
    
    // ending
    sc.stop();
  }
  
  // String to double[]
  public static double[] toDoubleArray(String s) {
	  String[] sarray = s.split(" ");
      double[] values = new double[sarray.length];
      for (int i = 0; i < sarray.length; i++)
        values[i] = Double.parseDouble(sarray[i]);
      return values;
  }
}

5. 运行

./bin/spark-submit /mk/test/KMeansSim.jar


Spark 执行任务的优化有多个方面,下面是一个常见的优化案例: 1. 数据倾斜问题 如果某个分区中的数据量远大于其他分区,就会导致数据倾斜,使得该分区的处理速度远慢于其他分区,从而影响整个任务的执行效率。解决数据倾斜问题的方法包括: - 使用 Spark 的 `repartition` 和 `coalesce` 操作来重新分区,尽量让每个分区的数据量相等,避免出现数据倾斜; - 对于某些特定的操作,例如 `groupByKey` 和 `reduceByKey`,可以使用一些技巧来避免数据倾斜,例如在 `groupByKey` 中使用随机前缀等方式来分散数据,或者使用 `combineByKey` 来手动合并数据。 2. 序列化和反序列化问题 在 Spark 任务中,大量的时间都会花费在数据的序列化和反序列化上,尤其是在数据量较大时。为了避免序列化和反序列化带来的性能损失,可以采取以下措施: - 尽量使用基本数据类型和原生对象,避免使用自定义的对象,这样可以减少序列化和反序列化的时间; - 对于需要频繁使用的对象,可以使用广播变量来传递,这样可以避免重复序列化和反序列化; - 使用 Kryo 序列化器来替代默认的 Java 序列化器,Kryo 序列化器具有更高的性能和更小的序列化后的数据大小。 3. 数据缓存问题 在 Spark 任务中,如果需要对某些数据进行多次访问,可以使用数据缓存来避免重复计算。数据缓存可以通过以下方式实现: - 使用 `cache` 或 `persist` 方法将 RDD 或 DataFrame 缓存到内存中; - 使用 `unpersist` 方法来释放缓存的数据,避免内存占用过多。 4. 磁盘 IO 问题 在 Spark 任务中,磁盘 IO 可能会成为性能瓶颈,特别是当数据量较大时。为了避免磁盘 IO 带来的性能损失,可以采取以下措施: - 尽量使用内存存储数据,避免磁盘 IO; - 对于无法全部存储在内存中的数据,可以使用文件压缩和分块存储等方式来减少磁盘 IO; - 避免多次读取同一个文件,可以使用 `wholeTextFiles` 和 `binaryFiles` 等方法一次性读取整个文件。 以上是 Spark 执行任务的常见优化案例,实际上,还有很多其他的优化方法,需要根据具体的业务场景和数据处理需求来选择合适的方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值