Hadoop
Základní informace
Hadoop je software usnadňující paralelní zpracování velkého množství dat za použití algoritmu MapReduce.
Hadoop zajišťuje distribuci výpočtů zpracovávajících data na mnoho výpočetních uzlů a následné sesbírání výsledků. Není vhodný pro všechny druhy výpočtů, jen pro takové výpočty, v nichž je možné paralelně zpracovat velké množství nezávislých kousků dat a sesbírat výsledky, například hledání jehly v kupce sena.
V současné době je Hadoop provozován jako virtuální klastr v rámci cloudové infrastruktury.
- dokumentace ke cloudu:
- image (public):
- id: 6e0bcd58-a1fc-4d57-a6a0-850837bcf9e5
- název: debian-9-x86_64_hadoop
- testovací image (community):
- id: (viz openstack image list --community, vlastník 85c8a74440e94d4b91d0dc067308cb64)
- název: debian-9-x86_64_hadoop_rc
Instalovaný SW
Distribuce BigTop 1.5.0.
Hadoop 2.10.1 - distributed storage and processing of very large data sets
HBase 1.5.0 - distributed, scalable, big data store
Hive 2.3.6 - data warehouse software facilitates
Spark 2.4.5 - fast and general engine for large-scale data processing
Vyrobení Hadoopu v cloudu
All-in-one single machine Hadoop vyžaduje > 4GB RAM (např. flavour standard.large).
Poznámky (více viz dokumentace k OpenStack):
- security groups: ve výchozím nastavení se používá defaults
- ssh key: vyrobit nebo uploadovat veřejnou část do OpenStack
OpenStack CLI - jednostrojový
Spuštění stroje:
# příklad parametrů image=debian-9-x86_64_hadoop network=auto_allocated_network sshkey=openstack public_network=public-muni-147-251-124-GROUP name=hadoop # stroj openstack server create --image="$image" --flavor standard.large --network "$network" --key-name "$sshkey" "$name" # veřejná IP ip=$(openstack floating ip create -c floating_ip_address -f value "$public_network") openstack server add floating ip "$name" "$ip"
Přihlášení na stroj:
ssh debian@$ip
Spustit instalaci (běží cca 5 minut):
sudo /usr/local/sbin/hadoop-single-setup.sh
OpenStack GUI (Horizon) - jednostrojový
Compute -> Images -> "debian-9-x86_64_hadoop" -> Launch
- Details -> Instance Name: název
- Flavor: minimálně standard.large (> 4GB RAM)
- Networks: auto_allocated_network
- Security Groups: minimálně port 22 (ssh), lze mít i plně otevřené (autentizace je zapnuta)
- Key Pair: pro přístup na konzoli je potřeba
- Launch instance
Compute -> Instances -> (stroj) -> Associate floating IP
Přihlášení na stroj:
ssh debian@$ip
Spustit instalaci (běží cca 5 minut):
sudo /usr/local/sbin/hadoop-single-setup.sh
Terraform - clusterový
Vyžaduje nástroj Terraform.
Stažení terraform předpisů:
git clone https://gitlab.cesnet.cz/702/HADOOP/terraform
Vyrobení souboru mycluster.auto.tfvars (nahradit mydomain, PUBLIC_IP a SSH_KEYPAIR_NAME za skutečné hodnoty):
domain = 'mydomain' floating_ip = 'PUBLIC_IP' n = 3 security_trusted_cidr = [ "0.0.0.0/0", "::/0", ] ssh = 'SSH_KEYPAIR_NAME' # local_network = 'auto_allocated_network'
Spuštění terraform:
terraform init terraform apply
Viz také terraform#build-cluster.
Použití
Kterak se přihlásit
- ssh na použitou veřejnou floating IP pomocí ssh klíče (kde $ip je veřejná IP):
ssh debian@$ip
- získání lístku
kinit < password.txt
V rámci clusteru běží lokální Kerberos server:
- realm: HADOOP
- principal: debian@HADOOP
- heslo: v souboru /home/debian/password.txt
- lokální doména: terra
- konfigurace: /etc/krb5.conf.d/hadoop
Základní test instalace
Vypsání HDFS:
hdfs dfs -ls /
Testovací sada:
/opt/hadoop-tests/run-tests.sh
Vzdálený přístup
Kerberos klient
Postup nastavení lokálního klienta pro přístup:
- zkontrolovat/přidat řádek includedir /etc/krb5.conf.d/ v /etc/krb5.conf
- skript (kde $ip je veřejná floating ip, nebo jméno serveru, pokud zadané v /etc/hosts - viz #Webový přístup):
cat > /tmp/hadoop <<EOF [realms] HADOOP = { kdc = $ip admin_server = $ip default_domain = terra } [domain_realm] .terra = HADOOP terra = HADOOP EOF sudo mv /tmp/hadoop /etc/krb5.conf.d/
Webový přístup
Přes web lze přistupovat k datům (WebHDFS, read-only) nebo jsou k dispozici servisní informace clusteru. Pro webový přístup k Hadoop clusteru je nutný protokol SPNEGO (Kerberos přes HTTP(S)).
K Hadoopu musí být přistupováno přes DNS jméno odpovídající lokálně použitému jménu (např. hadoop.terra). Je potřeba přidat záznam do /etc/hosts (kde $ip je veřejná IP adresa):
echo "$ip hadoop.terra" >> /etc/hosts
Dále povolení protokolu SPNEGO v prohlížeči:
- firefox [1]:
- about:config
- nastavit network.negotiate-auth.trusted-uris=terra ("terra" je použitá doména)
- pro Windows:
- nainstalovat Kerberos
- nastavit také network.auth.use-sspi=false
- chrome: [2]
- parametr --auth-server-whitelist=terra ("terra" je použitá doména)
- trvalé nastavení: vyrobit soubor /etc/opt/chrome/policies/managed/hadoop-metacentrum.json ("terra" je použitá doména):
{
"AuthServerWhitelist": "terra",
"AuthNegotiateDelegateWhitelist": "terra"
} - Windows: SPNEGO a Kerberos zřejmě není podporováno
Získání lístku (heslo na stroji v cloudu v ~debian/password.txt):
kinit debian@HADOOP
Poznámka: pozor na sítích za NAT, tam nutno použít address-less lístek, volba -A
Výsledek (nahradit "hadoop.terra" za skutečné jméno serveru):
- HDFS: http://hadoop.terra:50070
- YARN: http://hadoop.terra:8088
- MapRed History: http://hadoop.terra:19888
- Spark: http://hadoop.terra:18088
curl
Přístup přes SPNEGO pomocí parametrů: --negotiate -u :
Nejprve je nutno získat lístek:
kinit debian@HADOOP
Poznámka: pozor na sítích za NAT, tam nutno použít address-less lístek, volba -A
Informace o souboru (kde $HDFS_PATH je cesta na HDFS):
curl -i --negotiate -u : "http://hadoop.terra:50070/webhdfs/v1/$HDFS_PATH?op=LISTSTATUS"
Stažení souboru (kde $HDFS_PATH je cesta na HDFS):
curl -L --negotiate -u : "http://hadoop.terra:50070/webhdfs/v1/$HDFS_PATH?op=OPEN" -o file
Upload souboru dvoukrokově (kde $HDFS_PATH je cesta na HDFS, $LOCAL_FILE je lokální soubor):
# 1) vytvoří soubor a vrátí odkaz na datový uzel v 'Location' curl --negotiate -u : -i -X PUT "http://hadoop.terra:50070/webhdfs/v1${HDFS_PATH}?op=CREATE" | tee curl.log # URL z headru 'Location' data_url="`grep ^Location: curl.log | cut -c11- | tr -d '\r'`" # 2) upload dat curl -i -T ${LOCAL_FILE} ${data_url}
Hadoop
Informace
- max. délka úlohy omezena:
- max. refresh time uživatelského Kerberos ticketu
- max. lifetime uživatelských tokenů Hadoopu, 7 dní
- zabezpečení dat: řešen přístup k datům, konzistence dat, ale lokálně se nešifruje
Příklady
Na frontendu (viz #Základní informace), přístup přes Kerberos:
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar pi 2 10 hdfs dfs -put /etc/hadoop/conf input hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar grep input output 'dfs[a-z.]+' hdfs dfs -cat output/* hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar randomwriter out/ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teragen 100 gendata hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar terasort gendata sorted hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar teravalidate gendata reportdata
Získání logů
yarn application -list yarn logs -applicationId APPLICATION_ID
HBase
Viz Hadoop HBase.
Hive
Informace
Správa přístupů:
- řešena na úrovni HDFS ==> po vytvoření databáze je možno řídit práva na HDFS adresáři /user/hive/warehouse/${DATABASE}
- výchozí práva na databázi po vytvoření jsou včetně čtení a zápisu pro všechny uživatele Hadoopu
Připojení
- beeline klient ("$HIVE_DB" nahradit za název databáze):
beeline -u "jdbc:hive2://`hostname -f`:10000/$HIVE_DB;principal=hive/`hostname -f`@HADOOP"
- beeline klient - připojení přes příkaz '!connect' ("HIVE_DB" nahradit za název databáze, "hadoop.terra" je použitý hostname):
beeline !connect jdbc:hive2://hadoop.terra:10000/HIVE_DB;principal=hive/hadoop.terra@HADOOP
- java kód:
String url = "jdbc:hive2://hadoop.terra:10000/HIVE_DB;principal=hive/hadoop.terra@HADOOP"; Connection con = DriverManager.getConnection(url);
- hive klient (deprecated, podporovaný je beeline klient):
hive
Detaily viz hive cli --help.
Integrace s HBase
https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration
Integrace se Spark
Viz. #Příklady 3.
Příklady
HIVE_DB="`id -un`_test" JDBC_URL="jdbc:hive2://`hostname -f`:10000/$HIVE_DB;principal=hive/`hostname -f`@HADOOP" # vyrobení databáze <USER>_test beeline -u $JDBC_URL -e "CREATE DATABASE $HIVE_DB" # použití <USER>_test beeline -u $JDBC_URL CREATE TABLE pokes (foo INT, bar STRING); CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); SHOW TABLES; SELECT a.foo FROM invites a WHERE a.ds='2008-08-15'; DESCRIBE invites; INSERT INTO pokes VALUES (1, 'A'), (2, 'B'); INSERT INTO invites PARTITION (ds='2015-01-01') SELECT * FROM pokes; INSERT INTO invites PARTITION (ds='2015-12-11') SELECT * FROM pokes;
Spark
Informace
Podporovány režimy:
- Spark přes YARN (cluster): --master yarn --deploy-mode cluster
- Spark přes YARN (client): --master yarn --deploy-mode client
- lokální Spark: --master local
Příklady
- výpočet pí
spark-submit --class org.apache.spark.examples.SparkPi --deploy-mode cluster --master yarn `ls /usr/lib/spark/examples/jars/spark-examples*.jar | head -n 1` 10 # (nahradit APPLICATION_ID za skutečné ID) yarn logs --applicationId APPLICATION_ID
- volání map/reduce
(nahradit LOGIN za uživatelské jméno)
hdfs dfs -put /etc/passwd spark-shell --master yarn val file = sc.textFile("hdfs:///user/LOGIN/passwd") val counts = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _) counts.saveAsTextFile("hdfs:///user/LOGIN/spark-output") hdfs dfs -cat ./spark-output/\* hdfs dfs -rm -r ./spark-output ./passwd
- použití Hive metastore
(nahradit LOGIN za uživatelské jméno, předpokládá databázi vyrobenou v #Příklady_2)
spark-shell sql("FROM LOGIN_test.pokes SELECT *").collect().foreach(println) sql("FROM LOGIN_test.pokes SELECT *").show()
- puštění vlastní aplikace
Je potřeba zkopírovat /usr/lib/spark/lib/spark-assembly.jar, přibalit tam své knihovny, nakopírovat na HDFS a předhodit Sparku:
# (nahradit /user/hawking/lib/spark-assembly.jar za skutečnou cestu na HDFS) spark-submit --master yarn --deploy-mode cluster \ --conf spark.yarn.jar=hdfs:///user/hawking/lib/spark-assembly.jar \ ...