Spark学习经验总结

我是用HDP按的Hadoop,Spark集群

1.我在服务器上跑的Spark程序,启动脚本如下

/usr/hdp/2.4.0.0-169/spark/bin/spark-submit --class com.lwb.streamingtest.steaming_sql.Spark_Stream_SQL_Test2 --master yarn  --files /usr/hdp/2.4.0.0-169/spark/conf/hive-site.xml,/usr/hdp/2.4.0.0-169/hbase/conf/hbase-site.xml  /alwb_test/SparkTest-0.0.1-SNAPSHOT-allinone.jar > aaa.log 2>&1 &

不加载hive-site.xml的时候会报一个异常。

2.我在启动脚本里设置了master是yarn意思是在yarn上执行,但是程序里的master设置是优先于启动脚本的。

我之前在程序里设置了SparkConf conf = new SparkConf().setAppName("lwb_sql1").setMaster("local[2]");

这个时候就是在本地执行,然后我就不会停止任务了。如果是在yarn上运行,关闭命令是

yarn application -kill applicationId ,但是在本地运行不是在yarn上运行这个命令就不好用了,我实验了半天。

最后我是先敲Linux命令jps,这是个java命令,可以查看用用java启动的进程,我也是突然想试一试才出来的。之后有两个名字一样的进程名字大概是Spark Submit,前边就是进程号,直接敲入 Linux 命令 kill 进程号,就杀掉了。

 

3.今天研究了一天sparksql的DataFrame的join函数遇到问题如下

我现在生成了两个DataFrame  一个数据来自 Oracle,一个数据来自Hive
我现在想将两张表进行内连接或者左连接
我是用JAVA语言实现的,之前的写法如下
dfHive.join(dfOracle,"vin").show();//这样是可以连接出来的(其实后来我才发现这么写就是内连接,那么我想左连接就需要用3个参数的写法了)
我想用左联的话需要使用3个参数的join,找了一天,都是scala的写法,没找到java的,官网我都没找到例子,也许是没找对地方吧,最后自己试出来的代码如下,谁能想到一个Column去equalTo另外一个Column,返回的居然还是Column类型。。。

df.join(jdbcDF,df.col("vin").equalTo(jdbcDF.col("VIN")),"left").show();

完整java代码如下:

import java.util.HashMap;
import java.util.Map;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.sql.Column;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.hive.HiveContext;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka.KafkaUtils;

import scala.Tuple2;

import com.alibaba.fastjson.JSONObject;

public class Spark_Stream_SQL_Test2 {
	static final String ZK_QUORUM = "devhadoop3.reachauto.com:2181,devhadoop2.reachauto.com:2181,devhadoop1.reachauto.com:2181";
	static final String GROUP = "spark_json_test_group";
	static final String TOPICSS = "spark_sql_lwb_1";
	static final String NUM_THREAD = "5";

	@SuppressWarnings("serial")
	public static void main(String[] args) throws Exception {
		System.setProperty("HADOOP_USER_NAME", "spark");
		SparkConf conf = new SparkConf().setAppName("lwb_sql1");//.setMaster("local[2]");
		conf.set("spark.testing.memory", "2147480000");// 后面的值大于512m即可
		JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(10));
		/**
		 * 查询oracle
		 */
		SQLContext sqlContext = new SQLContext(jssc.sparkContext());
		System.out.println("================" + sqlContext.getSQLDialect());

		Map<String, String> options = new HashMap<String, String>();
		options.put("user", "root");
		options.put("password", "123456");
		options.put("url", "jdbc:oracle:thin:@10.10.171.167:1521:ORCL");
		options.put("dbtable", "test1");
		// 一次取多少行数据
//		options.put("fetchSize", "10");
		options.put("driver", "oracle.jdbc.driver.OracleDriver");
		final DataFrame jdbcDF = sqlContext.read().format("jdbc").options(options).load();
		jdbcDF.show();
		
		/**
		 * 查询hive
		 */
		final HiveContext hiveContext = new HiveContext(jssc.sparkContext());
		int numThreads = Integer.parseInt(NUM_THREAD);
		Map<String, Integer> topicMap = new HashMap<String, Integer>();
		String[] topics = TOPICSS.split(",");
		for (String topic : topics) {
			topicMap.put(topic, numThreads);
		}
		JavaPairReceiverInputDStream<String, String> messages = KafkaUtils.createStream(jssc, ZK_QUORUM, GROUP, topicMap);// 取出数据
		JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {// 只获取kafka的value实际值
					public String call(Tuple2<String, String> tuple2) {
						return tuple2._2();
					}
				});
		lines.foreachRDD(new VoidFunction<JavaRDD<String>>() {
			@Override
			public void call(JavaRDD<String> rdd) throws Exception {
				for (String jsonStr : rdd.collect()) {
					System.out.println("接收到数据:" + jsonStr);
					JSONObject obj = JSONObject.parseObject(jsonStr);
					String sql = obj.getString("sql");
					System.out.println(sql);
					DataFrame df = hiveContext.sql(sql);
					df.join(jdbcDF,df.col("vin").equalTo(jdbcDF.col("VIN")),"left").show();
//					df.join(jdbcDF,"vin").show();
				}
			}
		});
		jssc.start();//
		jssc.awaitTermination();//
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

其实我是真性情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值